Как получить центр многоугольника в Google Maps v3? - PullRequest
52 голосов
/ 21 июня 2010

Это не должно быть на 100% правильно, это может быть центр ограничивающего прямоугольника.

Ответы [ 5 ]

192 голосов
/ 21 июня 2010

Ответ Мэтью - хорошее решение.Однако при использовании API Карт Google версии 3 может потребоваться передать каждую точку многоугольника объекту LatLngBounds с помощью метода extend(), а затем, наконец, вызвать метод getCenter() вLatLngBounds объект.Рассмотрим следующий пример:

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());
60 голосов
/ 21 июня 2010

Алгоритм:

Выполнить через все точки в многоугольнике.По всем точкам найди;

  • x1, самая низкая x координата
  • y1, самая низкая y координата
  • x2, самая высокая xкоордината
  • y2, максимальная y координата

Теперь у вас есть ограничивающий прямоугольник, и вы можете отработать центр, используя:

center.x = x1 + ((x2 - x1) / 2);
center.y = y1 + ((y2 - y1) / 2);
47 голосов
/ 08 декабря 2012

вы можете расширить класс Polygon своей собственной версией отсутствующей функции, назовем ее 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
}

и чем использовать его в таком коде:

myPolygon.my_getBounds().getCenter()

... и т. Д., Должно быть эквивалентно поведению v2

7 голосов
/ 21 апреля 2013

Вот пользовательская функция, которую я написал. Не стесняйтесь использовать его.

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));
}
2 голосов
/ 23 сентября 2014

Обратите внимание, что в случае вогнутого многоугольника центр ограничивающего прямоугольника может быть полностью вне многоугольника. Если ваши многоугольники могут быть вогнутыми, я бы порекомендовал использовать центр самого большого вписанного круга в качестве «центра» многоугольника. Вы можете увидеть достаточно простой алгоритм здесь (стр. 4) . Если ваша задача - разместить метку на многоугольнике, это также даст наиболее эстетичные результаты (в этом случае я бы рекомендовал использовать этот метод, даже если ваши многоугольники могут быть не вогнутыми).

...