Он не должен быть на 100% правильным, он может быть центром ограничивающего прямоугольника.
Как получить центр многоугольника в Google Maps v3?
Ответ 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). Если ваша задача - разместить метку на полигоне, это также даст самые эстетически приятные результаты (в этом случае я бы рекомендовал использовать этот метод, даже если ваши полигоны не были вогнутыми).