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.

42
demandé sur Brian Webster 2010-06-21 01:34:02

5 réponses

algorithme:

Parcourez tous les points du polygone. Pour tous les points trouvés;

  • x1 , la plus basse x coordonnée
  • y1 , la plus basse y coordonnée
  • x2 , la plus haute x coordonnée
  • y2 , la plus haute y 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);
54
répondu Matthew Scharley 2010-06-20 21:53:21

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());
173
répondu Daniel Vassallo 2017-05-23 12:10:30

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

42
répondu furiozo 2012-12-07 22:32:48

@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));
  }
5
répondu Jared Beach 2013-04-20 20:14:04

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).

1
répondu gkdm 2014-09-23 13:24:25