Чтобы присоединиться к другому решению - я обнаружил, что подход «прослушать событие bounds_changed и затем установить новое масштабирование» не работает для меня надежно. Я думаю, что я иногда вызывал fitBounds
до того, как карта была полностью инициализирована, и инициализация вызывала событие bounds_changed, которое использовало бы слушателя, до того как fitBounds
изменило границы и уровень масштабирования. Я закончил с этим кодом, который, кажется, работает до сих пор:
// If there's only one marker, or if the markers are all super close together,
// `fitBounds` can zoom in too far. We want to limit the maximum zoom it can
// use.
//
// `fitBounds` is asynchronous, so we need to wait until the bounds have
// changed before we know what the new zoom is, using an event handler.
//
// Sometimes this handler gets triggered by a different event, before
// `fitBounds` takes effect; that particularly seems to happen if the map
// hasn't been fully initialized yet. So we don't immediately remove the
// listener; instead, we wait until the 'idle' event, and remove it then.
//
// But 'idle' might happen before 'bounds_changed', so we can't set up the
// removal handler immediately. Set it up in the first event handler.
var removeListener = null;
var listener = google.maps.event.addListener(map, 'bounds_changed', () => {
console.log(map.getZoom());
if (map.getZoom() > 15) {
map.setZoom(15);
}
if (!removeListener) {
removeListener = google.maps.event.addListenerOnce(map, 'idle', () => {
console.log('remove');
google.maps.event.removeListener(listener);
});
}
});