Comment obtenir le centre d'un polygone dans google maps v3?
Il n'a pas besoin d'être 100% correct, il peut être le centre du rectangle de délimitation.
5 réponses
algorithme:
Parcourez tous les points du polygone. Pour tous les points trouvés;
-
x1
, la plus bassex
coordonnée -
y1
, la plus bassey
coordonnée -
x2
, la plus hautex
coordonnée -
y2
, la plus hautey
coordonnée
Vous avez maintenant le rectangle limite, et pouvez travailler le centre en utilisant:
center.x = x1 + ((x2 - x1) / 2);
center.y = y1 + ((y2 - y1) / 2);
la réponse de Matthieu est une bonne solution. Cependant, lorsque vous utilisez L'API V3 de Google Maps, vous pouvez passer chaque point du polygone à un objet LatLngBounds
à travers la méthode extend()
, puis finalement appeler la méthode getCenter()
sur l'objet LatLngBounds
. Prenons l'exemple suivant:
var bounds = new google.maps.LatLngBounds();
var i;
// The Bermuda Triangle
var polygonCoords = [
new google.maps.LatLng(25.774252, -80.190262),
new google.maps.LatLng(18.466465, -66.118292),
new google.maps.LatLng(32.321384, -64.757370),
new google.maps.LatLng(25.774252, -80.190262)
];
for (i = 0; i < polygonCoords.length; i++) {
bounds.extend(polygonCoords[i]);
}
// The Center of the Bermuda Triangle - (25.3939245, -72.473816)
console.log(bounds.getCenter());
vous pouvez étendre la classe Polygon avec votre propre version de la fonction manquante, appelons-la my_getBounds ():
google.maps.Polygon.prototype.my_getBounds=function(){
var bounds = new google.maps.LatLngBounds()
this.getPath().forEach(function(element,index){bounds.extend(element)})
return bounds
}
et que l'utiliser dans le code comme ceci:
myPolygon.my_getBounds().getCenter()
... etc, il doit être équivalent à la v2 comportement
@Matthew Scharley répond ceci est mon algorithme. C'est probablement mauvais. Être doux. Je l'ai écrit parce que la fonction getCenter() de L'api V3 ne fonctionne que pour les rectangles et les cercles, pas pour les polygones.
function polygonCenter(poly) {
var lowx,
highx,
lowy,
highy,
lats = [],
lngs = [],
vertices = poly.getPath();
for(var i=0; i<vertices.length; i++) {
lngs.push(vertices.getAt(i).lng());
lats.push(vertices.getAt(i).lat());
}
lats.sort();
lngs.sort();
lowx = lats[0];
highx = lats[vertices.length - 1];
lowy = lngs[0];
highy = lngs[vertices.length - 1];
center_x = lowx + ((highx-lowx) / 2);
center_y = lowy + ((highy - lowy) / 2);
return (new google.maps.LatLng(center_x, center_y));
}
noter que dans le cas d'un polygone concave le centre du rectangle limite peut être complètement à l'extérieur du polygone. Si vos polygones peuvent être concavés, je recommande d'utiliser le centre du plus grand cercle inscrit comme le "centre" du polygone. Vous pouvez voir un algorithme assez simple ici (p. 4) . Si votre tâche est de placer une étiquette sur le polygone, Cela donnera également les résultats les plus esthétiquement agréables (dans ce cas, je recommande l'utilisation de cette méthode même si vos polygones ne sont pas concaves).