У меня была такая же проблема. Вот что я, наконец, получил, чтобы решить некоторые из проблем, которые у меня были с другими решениями.
* Правильно навязывает границы независимо от того, используете ли вы мышь или клавиши со стрелками
* Не остановятся края, если удерживать нажатой клавиши со стрелками, из-за кастрюли ускорения, заставляя его «выброс» (попробуйте удерживать клавишу со стрелкой в одном направлении, пока вы не нажмете край, затем отпустите и снова нажмите ее), а с некоторыми решениями она будет прокручиваться чуть больше)
* Не отскакивает назад, когда он попадает в край
* Правильно применяет ограничения при изменении масштаба
EDIT: Хорошо, поэтому он работает, когда вы изменяете масштаб с помощью колесика прокрутки, но не с помощью регулятора зуммирования. Позвольте мне немного поиграть с ним, и я посмотрю, смогу ли я это сделать тоже ...
EDIT 2: Оказывается, проблема в том, что я удалил элемент управления панорамированием. Пока присутствует управление панорамированием, это отлично работает, как с колесиком прокрутки, так и с регулятором зуммирования.
РЕДАКТИРОВАТЬ 3: Нет ... это не так. Я обновил код для управления зуммированием.
// bounds of the desired area
var allowedBounds = new google.maps.LatLngBounds(
new google.maps.LatLng(-64, -64),
new google.maps.LatLng(64, 64)
);
var zoomChanged = false;
google.maps.event.addListener(map, 'center_changed', function() {
var mapBounds = map.getBounds();
if(mapBounds.getNorthEast().lat() > allowedBounds.getNorthEast().lat()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat() -
(mapBounds.getNorthEast().lat() -
allowedBounds.getNorthEast().lat()),
map.getCenter().lng(), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getNorthEast().lng() > allowedBounds.getNorthEast().lng()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat(),
map.getCenter().lng() -
(mapBounds.getNorthEast().lng() -
allowedBounds.getNorthEast().lng()), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getSouthWest().lat() < allowedBounds.getSouthWest().lat()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat() +
(allowedBounds.getSouthWest().lat() -
mapBounds.getSouthWest().lat()),
map.getCenter().lng(), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getSouthWest().lng() < allowedBounds.getSouthWest().lng()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat(),
map.getCenter().lng() +
(allowedBounds.getSouthWest().lng() -
mapBounds.getSouthWest().lng()), true);
map.panTo(newCenter);
return;
}
}, this);
google.maps.event.addListener(map, 'zoom_changed', function() {
zoomChanged = true;
}, this);
google.maps.event.addListener(map, 'bounds_changed', function() {
if(zoomChanged) {
var mapBounds = map.getBounds();
if(mapBounds.getNorthEast().lat() > allowedBounds.getNorthEast().lat()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat() -
(mapBounds.getNorthEast().lat() -
allowedBounds.getNorthEast().lat()),
map.getCenter().lng(), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getNorthEast().lng() > allowedBounds.getNorthEast().lng()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat(),
map.getCenter().lng() -
(mapBounds.getNorthEast().lng() -
allowedBounds.getNorthEast().lng()), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getSouthWest().lat() < allowedBounds.getSouthWest().lat()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat() +
(allowedBounds.getSouthWest().lat() -
mapBounds.getSouthWest().lat()),
map.getCenter().lng(), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getSouthWest().lng() < allowedBounds.getSouthWest().lng()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat(),
map.getCenter().lng() +
(allowedBounds.getSouthWest().lng() -
mapBounds.getSouthWest().lng()), true);
map.panTo(newCenter);
return;
}
zoomChanged = false;
}
}, this);
Использование события bounds_changed вместо zoom_changed в этом случае является нонсенсом. Он срабатывает в любом случае, когда границы меняются, но его интересуют только случаи, когда масштаб изменяется. – TMS
@ tomas-t Я не согласен с тем, что обработка события bounds_changed является «бессмыслицей». Если вы после границ изменили масштаб, не можете ли вы проверить getZoom в вашем обработчике bounds_change? Документация, которую я опубликовал, оправдывает поведение (ошибка краевого случая), но обходной путь кажется мне довольно простым. – RedBlueThing
, конечно, вы можете, но для того, что OP хочет обработать событие bounds_changed, а не zoom_changed, является излишним излишним, потому что событие срабатывает даже во время панорамирования и т. Д. Посмотрите на обходной путь в моем ответе. – TMS