web-dev-qa-db-fra.com

Comment obtenir le centre d'un polygone dans google maps v3?

Il n'a pas besoin d'être correct à 100%, il peut être le centre du rectangle englobant.

55
ANd

Algorithme:

Parcourez tous les points du polygone. Pour tous les points trouver;

  • x1, la coordonnée la plus basse x
  • y1, la coordonnée la plus basse y
  • x2, la coordonnée la plus élevée x
  • y2, la coordonnée la plus élevée y

Vous avez maintenant le rectangle englobant et vous pouvez déterminer le centre en utilisant:

center.x = x1 + ((x2 - x1) / 2);
center.y = y1 + ((y2 - y1) / 2);
62
Matthew Scharley

réponse de Matthew est une bonne solution. Cependant, lorsque vous utilisez l'API Google Maps v3, vous souhaiterez peut-être passer chaque point du polygone à un objet LatLngBounds via la méthode extend(), puis enfin appelez 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());
192
Daniel Vassallo

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 de l'utiliser dans du code comme celui-ci:

myPolygon.my_getBounds().getCenter()

... etc, il devrait être équivalent au comportement v2

47
furiozo

Voici une fonction personnalisée que j'ai écrite. Sentez-vous libre de l'utiliser.

function polygonCenter(poly) {
    var latitudes = [];
    var longitudes = [];
    var vertices = poly.getPath();

    // put all latitudes and longitudes in arrays
    for (var i = 0; i < vertices.length; i++) {
        longitudes.Push(vertices.getAt(i).lng());
        latitudes.Push(vertices.getAt(i).lat());
    }

    // sort the arrays low to high
    latitudes.sort();
    longitudes.sort();

    // get the min and max of each
    var lowX = latitudes[0];
    var highX = latitudes[latitudes.length - 1];
    var lowy = longitudes[0];
    var highy = longitudes[latitudes.length - 1];

    // center of the polygon is the starting point plus the midpoint
    var centerX = lowX + ((highX - lowX) / 2);
    var centerY = lowy + ((highy - lowy) / 2);

    return (new google.maps.LatLng(centerX, centerY));
}
6
Jared Beach

Notez que dans le cas d'un polygone concave, le centre du rectangle de délimitation peut être complètement à l'extérieur du polygone. Si vos polygones peuvent être concaves, je vous recommande d'utiliser le centre du plus grand cercle inscrit comme "centre" du polygone. Vous pouvez voir un algorithme assez simple ici (p. 4) . Si votre tâche consiste à placer une étiquette sur le polygone, cela donnera également les résultats les plus esthétiques (dans ce cas, je recommanderais d'utiliser cette méthode même si vos polygones ne sont pas concaves).

3
gkdm