2009-12-01 4 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

이 숙제입니까? 있다면 숙제 태그를 추가하십시오. –

+0

(X, Y)를 중심으로 원 안에있는 모든 점을 찾으려고하는 것 같습니다. (X, Y)에서 각 점의 거리를 계산하고 원하는 "반경"과의 거리를 확인하는 것이 좋습니다. –

+0

... 그 역시 작동 할 수 있습니다. –

답변

2

당신은 (의사 코드) 루프 할 수 있습니다 완벽하게 작동합니다

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

편집을

  • 그러나, 만약 당신이 단지 경계 상자를 클릭 한 다음 정사각형을 사용하는 것이 올바른 방법입니다. 경계 상자가있는 원을 가질 필요가 없습니다. 나중에 정렬로 필터링합니다.
  • 거리를 측정하려면 ABS를 사용할 필요가 없습니다. 제곱은 (추가로, 당신은
  • 가 공간 인덱스를 추가하는 것을 잊지 마십시오 공연에 대한 extreamly 까다로운 경우 대신 제곱근을 계산의 제곱 반경에 비교하거나 공연이 쓰레기가 될 것입니다 당신을 위해 그것을하지

제 2 회 편집 다소 의사 코드가 적습니다.) (나이가 들어서 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"가 필요하다는 것 외에는 도움에 감사드립니다. 하지만 경계 상자가 의미하는 것을 보았고 여분의 점을 필터링하면 시도해 볼 것입니다. 당신의 도움을 주셔서 감사합니다. –

+0

도움을 주셔서 다시 한 번 감사드립니다. –