2009-12-01 96 views
0

下面的函數創建了4個點中的多邊形方塊,並且我假設最後5個點關閉了方形,我需要它至少有24個點並組成一個圓。有任何想法嗎?如何繪製一個mysql多邊形圈,而不是一個正方形?

function getRadius($point="POINT(-29.8368 30.9096)", $radius=2) 
{ 
    $km = 0.009; 
    $center = "GeomFromText('$point')"; 
     $radius = $radius*$km; 
     $bbox = "CONCAT('POLYGON((', 
       X($center) - $radius, ' ', Y($center) - $radius, ',', 
       X($center) + $radius, ' ', Y($center) - $radius, ',', 
       X($center) + $radius, ' ', Y($center) + $radius, ',', 
       X($center) - $radius, ' ', Y($center) + $radius, ',', 
       X($center) - $radius, ' ', Y($center) - $radius, ' 
     ))')"; 

    $query = $this->db->query(" 
     SELECT id, AsText(latLng) AS latLng, (SQRT(POW(ABS(X(latLng) - X({$center})), 2) + POW(ABS(Y(latLng) - Y({$center})), 2)))/0.009 AS distance 
     FROM crime_listing 
     WHERE Intersects(latLng, GeomFromText($bbox)) 
     AND SQRT(POW(ABS(X(latLng) - X({$center})), 2) + POW(ABS(Y(latLng) - Y({$center})), 2)) < $radius 
     ORDER BY distance 
       "); 

    if($query->num_rows()>0){ 
       return($query->result()); 
     }else{ 
       return false; 
     } 
} 

下面的JS的版本,這個完美的作品

var findCirclePolygons = function(point, r) 
{ 
    var d2r = Math.PI/180; 
    this.circleLatLngs = new Array(); 
    numPoints = 24; 
    var circleLat = r * 0.009; // Convert degrees into km 
    var circleLng = circleLat/Math.cos(point.lat() * d2r); 
    for (var i = 0; i < numPoints + 1; i++) { 
     var theta = Math.PI * (i/(numPoints/2)); 
     var vertexLat = point.lat() + (circleLat * Math.sin(theta)); 
     var vertexLng = parseFloat(point.lng()) + parseFloat((circleLng * Math.cos(theta))); 
     var vertextLatLng = new google.maps.LatLng(vertexLat, vertexLng); 
     this.circleLatLngs.push(vertextLatLng); 
    } 

    // Set options 
    var options = { 
     paths: circleLatLngs, 
     strokeColor: "#0055ff", 
     strokeOpacity: 1, 
     strokeWeight: 1, 
     fillColor: "#0055ff", 
     fillOpacity: 0.35 
     }; 

    // Return 
    return options; 
}; 
+0

這功課嗎?如果是,請添加作業標籤。 – 2009-12-01 15:43:53

+0

它看起來像你試圖找到以(X,Y)爲中心的圓內的所有點。 (X,Y)的每個點的距離是多少,並且根據所需的「半徑」檢查距離? – 2009-12-01 15:44:14

+0

...也可以工作。 – 2009-12-01 15:46:56

回答

2

您可以(在僞代碼)一個循環:

for(i=0; i <= 360; i += 360/24) 
{ 
    $extra_point = "POINT(". $radius*cos(i)." ". $radius*sin(i) . ")" 
} 

編輯

  • 但是,如果你只是想要一個邊界框,然後使用正方形是正確的方法。沒有必要有一個圈子看邊框。你稍後用排序過濾掉。
  • 要測量距離,不需要使用ABS。磨邊會爲你(作爲一個額外的,比較平方,而不是計算平方根,如果你是extreamly挑剔的表演
  • 不要忘記添加空間索引半徑或表演將垃圾

第二編輯 在稍微僞代碼;)(這是我的年齡,我沒有與PHP工作)。

$lon = 42; 
$lat = 2; 
$radius = 0.01; 
$bbox = "POLYGON(("; 
for(i=0; i <= 360; i += 360/24) 
{ 
    $bbox .= $radius*cos(deg2rad(i)) + $lon." ". $radius*sin(deg2rad(i)) + $lat; 
    if(i < 360)" 
     $bbox .= ", " 
} 
$bbox .= "))" 

關於距離的事情,你有任何x的pow(abs(x),2)== pow(x,2)。所以,你可以只寫(爲簡單起見):

SQRT(POW(X(latLng) - X({$center}), 2) + POW(Y(latLng) - Y({$center}), 2)) < $radius 

甚至不遺餘力的平方根計算(在這種情況下,它不會改變任何東西絕對和早期的優化是一件壞事,這樣做你whish)

POW(X(latLng) - X({$center}), 2) + POW(Y(latLng) - Y({$center}), 2) < POW($radius, 2) 
+0

嗨,感謝您的幫助,除了我需要「$ bbox」成爲「圈子」。但是我確實看到了邊界框的含義並過濾出了額外的點,我將試試看。謝謝你的幫助。 – 2009-12-01 16:44:50

+0

再次感謝您的幫助,我想再試一次。 – 2009-12-02 09:56:22

相關問題