Подтвердить что ты не робот

Как получить центр многоугольника в Google Maps v3?

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

4b9b3361

Ответ 1

Алгоритм:

Пропустите все точки многоугольника. Для всех точек найти;

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

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

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

Ответ 2

Ответ Мэтью - хорошее решение. Однако при использовании API Google Maps v3 вам может понадобиться передать каждую точку многоугольника объекту 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());

Ответ 3

вы можете расширить класс 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

Ответ 4

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

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

Ответ 5

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