2009-12-01 4 views
0

La fonction ci-dessous crée un carré de polygone sur 4 points et je suppose que le dernier 5ème point a fermé la case, j'en ai besoin pour avoir au moins 24 points et pour former un cercle. Des idées?Comment dessiner un cercle de polygones mysql, et non un carré?

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; 
     } 
} 

Ci-dessous la version js et cela fonctionne parfaitement

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

Est-ce que ce travail est fait? S'il vous plaît ajouter l'étiquette de devoirs si c'est. –

+0

Il semble que vous essayez de trouver tous les points d'un cercle centré sur (X, Y). Ne seriez-vous pas mieux de calculer la distance de chaque point de (X, Y) et de vérifier cette distance par rapport à votre "rayon" désiré? –

+0

... ça pourrait marcher aussi. –

Répondre

2

Vous pouvez faire une boucle (en code pseudo):

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

EDIT

  • Cependant, si vous voulez juste un boîte de délimitation, puis en utilisant un carré est la bonne façon de le faire. Pas besoin d'avoir un cercle à la recherche d'une boîte englobante. Vous filtrez plus tard avec le tri.
  • Pour mesurer la distance, inutile d'utiliser l'ABS. Équerrage fait pour vous (en supplément, comparer au rayon carré au lieu de calculer la racine carrée si vous êtes pointilleux sur les performances extreamly
  • Ne pas oublier d'ajouter l'index spatial ou les performances seront crap

2ème ÉDITION En un peu moins de pseudo-code;) (Cela fait longtemps que je n'ai pas travaillé avec 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 .= "))" 

la chose à distance, vous avez pow (abs (x), 2) == pow (x, 2) pour tout x. Ainsi, vous pouvez simplement écrire (pour simplifier):

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

Ou même pour épargner le calcul de la racine carrée (dans ce cas, il ne changera absolument rien et l'optimisation précoce est une mauvaise chose, alors faites comme vous whish)

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

Salut, merci pour l'aide, sauf que j'ai besoin de la "$ bbox" pour être le "cercle". Mais je vois ce que vous voulez dire par le cadre et en filtrant les points supplémentaires, je vais essayer. Merci de votre aide. –

+0

Merci encore pour votre aide, je vais essayer de nouveau. –

Questions connexes