Исправление этой проблемы в 2017 году
Слегка сожмите ограничивающий прямоугольник перед отправкой на map.fitBounds()
.
Вот функция для сокращения ограничивающей рамки:
// Values between 0.08 and 0.28 seem to work
// Any lower and the map will zoom out too much
// Any higher and it will zoom in too much
var BOUNDS_SHRINK_PERCENTAGE = 0.08; // 8%
/**
* @param {google.maps.LatLngLiteral} southwest
* @param {google.maps.LatLngLiteral} northeast
* @return {Array[google.maps.LatLngLiteral]}
*/
function slightlySmallerBounds(southwest, northeast) {
function adjustmentAmount(value1, value2) {
return Math.abs(value1 - value2) * BOUNDS_SHRINK_PERCENTAGE;
}
var latAdjustment = adjustmentAmount(northeast.lat, southwest.lat);
var lngAdjustment = adjustmentAmount(northeast.lng, southwest.lng);
return [
{lat: southwest.lat + latAdjustment, lng: southwest.lng + lngAdjustment},
{lat: northeast.lat - latAdjustment, lng: northeast.lng - lngAdjustment}
]
}
Используйте это так:
// Ensure `southwest` and `northwest` are objects in google.maps.LatLngLiteral form:
// southwest == {lat: 32.79712, lng: -117.13931}
// northwest == {lat: 32.85020, lng: -117.09356}
var shrunkBounds = slightlySmallerBounds(southwest, northeast);
var newSouthwest = shrunkBounds[0];
var newNortheast = shrunkBounds[1];
// `map` is a `google.maps.Map`
map.fitBounds(
new google.maps.LatLngBounds(newSouthwest, newNortheast)
);
У меня есть приложение, которое делает то же самое, что и codr : сохранение границ текущей карты в URL и инициализация карты из границ URL при обновлении. Это решение прекрасно работает для этого.
Почему это работает?
Google Maps, по сути, делает это, когда fitBounds()
называется:
- Центрирование карты по центральной точке данного ограничивающего прямоугольника.
- Увеличение до самого высокого уровня масштабирования, при котором в окне просмотра будет содержаться указанных границ внутри поля окна просмотра.
Если указанные границы будут в точности соответствовать области просмотра, Google Maps не считает, что они "содержат" границы, поэтому он уменьшает еще один уровень.