Как заставить Google Maps отображать целый многоугольник?
У меня есть набор объектов GPolygon, которые привязаны к объектам в моей модели домена и добавляются в карту на моей странице. Объекты домена отображаются в списке на той же странице, и когда пользователь нажимает на один из них, я хочу показать связанный многоугольник.
Я хочу, чтобы весь полигон показывался, и в идеале я хочу, чтобы карта была центрирована в центре многоугольника.
Я надеялся, что появится API API карт вдоль строк...
myMap.makeSureYouCanSeeAllThisPolygon(aPolygon);
но я не смог его найти.
Если мне нужно сделать это вручную, то я, очевидно, могу легко вычислить центрирование, но как мне понять масштаб?
Ответы
Ответ 1
Вы можете получить центральную точку многоугольника, используя aPolygon.getBounds().getCenter();
, а затем используя GLatLng
, возвращенный с помощью метода myMap.setCenter()
.
Чтобы получить уровень масштабирования, вы можете использовать myMap.getBoundsZoomLevel(aPolygon.getBounds());
, затем использовать его с помощью метода myMap.setZoom()
.
Ответ 2
API Google Maps v3 не поддерживает метод getBounds()
для класса google.maps.Polygon. Это кажется странным, учитывая тот факт, что класс google.maps.Map имеет метод fitBounds()
, который именно вы ищете. Если вы используете API Карт Google с любой частотой, то это должно быть в вашем мешок трюков::
getBounds()
для класса google.maps.Polygon
google.maps.Polygon.prototype.getBounds = function() {
var bounds = new google.maps.LatLngBounds();
var paths = this.getPaths();
var path;
for (var i = 0; i < paths.getLength(); i++) {
path = paths.getAt(i);
for (var ii = 0; ii < path.getLength(); ii++) {
bounds.extend(path.getAt(ii));
}
}
return bounds;
}
Наличие этого метода позволяет очень просто центрировать и накладывать на карту многоугольник.
Примечание. Если вы плохо знакомы с getAt()
и getLength()
, это методы, уникальные для класса google.maps.MVCArray. Когда вы вызываете метод getPaths()
для многоугольника, он возвращает ваш массив LatLng как изменяемый MVCArray из LatLng.. вы можете здесь о MVCArrays - Google Maps v3 API MVCArray class.
Перемещение. В этой структуре вам нужно будет реализовать прототипированный метод выше, чем до следующего следующего кода.
var map = new google.maps.Map(container, opts); // I'll spare the details on this
var coords = [
new google.maps.LatLng(25.774252, -80.190262)
,new google.maps.LatLng(18.466465, -66.118292)
,new google.maps.LatLng(32.321384, -64.75737)
,new google.maps.LatLng(25.774252, -80.190262)
];
var myPolygon = new google.maps.Polygon({
paths: coords
,strokeColor: "#A80000"
,strokeOpacity: 0.8
,strokeWeight: 1
,fillColor: "#0b2a32"
,fillOpacity: 0.12
});
С настройкой сцены все, что вам нужно сделать для центрирования и масштабирования этого (или любого) многоугольника:
map.fitBounds(myPolygon.getBounds());
Короткий и сладкий. Надеюсь, что это поможет.
-Кевин Джеймс
Ответ 3
Это решение работало для многоугольников, которые я уже успешно добавил на карту. Добавление метода getBounds() для класса google.maps.Polygon, а затем с помощью map.fitBounds(myPolygon.getBounds());
Ответ 4
думает, что он:
map.fitBounds(myPolygon.my_getBounds());
работает с удовольствием.
Ответ 5
Я написал функцию для добавления к решению Кевина Джеймса. он берет многоугольный массив и получает границы для всех полигонов, которые у вас могут быть на вашей карте. вам просто нужно нажать их на массив, а затем вы можете вызвать мою функцию для автоматического масштабирования карты.
function getArrayBounds(polyArray){
var bounds = new google.maps.LatLngBounds();
var path, paths;
for(var polys = 0; polys < polyArray.length; polys++) {
paths = polyArray[polys].getPaths();
for (var i = 0; i < paths.getLength(); i++) {
path = paths.getAt(i);
for (var ii = 0; ii < path.getLength(); ii++) {
bounds.extend(path.getAt(ii));
}
}
}
return bounds;
}