У меня есть ряд точек, которые я хочу вывести на печать на встроенном Google Map (API v3). Я хотел бы, чтобы границы разместили все точки, если уровень масштабирования не является слишком низким (т.е. уменьшил масштаб слишком много). Мой подход был похож на это:
var bounds = new google.maps.LatLngBounds();
// extend bounds with each point
gmap.fitBounds(bounds);
gmap.setZoom( Math.max(6, gmap.getZoom()) );
Это не работает. Последняя строка "gmap.setZoom ()" не изменяет уровень масштабирования карты, если названо непосредственно после fitBounds.
Существует ли способ получить уровень масштабирования границы, не применяя его к карте? Другие идеи решить это?
Я использую:
gmap.setZoom(24); //this looks a high enough zoom value
gmap.fitBounds(bounds); //now the fitBounds should make the zoom value only less
Это будет использовать меньшее из 24 и необходимый уровень масштабирования в соответствии с вашим кодом, однако он, вероятно, все равно изменяет масштаб и не заботится о том, насколько вы уменьшили масштаб.
Попробуйте это.
// Find out what the map's zoom level is
zoom = map.getZoom();
if (zoom == 1) {
// If the zoom level is that low, means it's looking around the
world.
// Swap the sw and ne coords
viewportBounds = new
google.maps.LatLngBounds(results[0].geometry.location, initialLatLng);
map.fitBounds(viewportBounds);
}
Если это будет полезно для вас.
Всего наилучшего
Я не люблю это предлагать, но если вы должны попробовать - сначала вызовите
gmap.fitBounds (bounds);
Затем создайте новый Thread / AsyncTask, дайте ему спать примерно 20-50 мс, а затем вызовите
gmap.setZoom (Math.max (6, gmap.getZoom ()));
из потока пользовательского интерфейса (используйте обработчик или onPostExecute
метод для AsyncTask).
Не знаю, работает ли это, просто предложение.Кроме того, вам придется каким-то образом вычислить уровень масштабирования по вашим точкам самостоятельно, проверить, не слишком ли он низкий, исправить его и затем просто вызвать gmap.setZoom (correctedZoom)
Я решил аналогичную проблему в одном из своих приложений. Меня немного смутило ваше описание проблемы, но я думаю, что у вас та же цель, что и у меня ...
В моем приложении я хотел нанести один или несколько маркеров и убедиться, что карта показывает их все. Проблема заключалась в том, что если бы я полагался исключительно на метод fitBounds, тогда уровень масштабирования был бы максимальным при наличии единственной точки - это было бесполезно.
Решением было использовать fitBounds, когда было много точек, и setCenter + setZoom, когда была только одна точка.
if (pointCount > 1) {
map.fitBounds(mapBounds);
}
else if (pointCount == 1) {
map.setCenter(mapBounds.getCenter());
map.setZoom(14);
}
В этой функции необходимо динамически добавлять метаданные для хранения типа геометрии только потому, что функция принимает любую геометрию.
"fitGeometries" - это JSON-функция, расширяющая объект map.
"geometries" - это общий массив javascript, а не MVCArray().
geometry.metadata = { type: "point" };
var geometries = [geometry];
fitGeometries: function (geometries) {
// go and determine the latLngBounds...
var bounds = new google.maps.LatLngBounds();
for (var i = 0; i < geometries.length; i++) {
var geometry = geometries[i];
switch (geometry.metadata.type)
{
case "point":
var point = geometry.getPosition();
bounds.extend(point);
break;
case "polyline":
case "polygon": // Will only get first path
var path = geometry.getPath();
for (var j = 0; j < path.getLength(); j++) {
var point = path.getAt(j);
bounds.extend(point);
}
break;
}
}
this.getMap().fitBounds(bounds);
},
Я использую это, чтобы гарантировать, что уровень масштабирования не превышает установленный уровень, чтобы я знал, что спутниковые изображения будут доступны.
Добавить слушателя к событию zoom_changed
.
Это также дает дополнительное преимущество управления масштабированием в пользовательском интерфейсе.
Выполняйте setZoom
только при необходимости, поэтому оператор if
предпочтительнее, чем Math.max
или Math.min
google.maps.event.addListener(map, 'zoom_changed', function() {
if ( map.getZoom() > 19 ) {
map.setZoom(19);
}
});
bounds = new google.maps.LatLngBounds( ... your bounds ... )
map.fitBounds(bounds);
Чтобы предотвратить слишком большое уменьшение масштаба:
google.maps.event.addListener(map, 'zoom_changed', function() {
if ( map.getZoom() < 6 ) {
map.setZoom(6);
}
});
bounds = new google.maps.LatLngBounds( ... your bounds ... )
map.fitBounds(bounds);
После расчета границ вы можете проверить расстояние между верхним левым и нижним правым углом; затем вы сможете понять уровень масштабирования, проверив расстояние (если расстояние слишком велико, уровень масштабирования будет низким), затем вы можете выбрать, будет ли он использовать метод setbound или setZoom ..
Если я не ошибаюсь, я предполагаю, что вы хотите, чтобы все ваши точки были видны на карте с максимально возможным уровнем масштабирования. Я добился этого, установив уровень масштабирования карты на 16 (не уверен, что это максимально возможный уровень масштабирования в V3).
var map = new google.maps.Map(document.getElementById('map_canvas'), {
zoom: 16,
center: marker_point,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
После этого я проделал работу с границами:
var bounds = new google.maps.LatLngBounds();
// You can have a loop here of all you marker points
// Begin loop
bounds.extend(marker_point);
// End loop
map.fitBounds(bounds);
Результат: Успех!
Все, что я сделал, это:
map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
И он работает на V3 API.