Вы можете прослушать dragend
событие, и, если карта перетаскивается за допустимые границы, переместите ее обратно внутрь. Вы можете определить допустимые границы в LatLngBounds
объекте, а затем использовать этот contains()
метод, чтобы проверить, находится ли новый центр широты / долготы в пределах границ.
Вы также можете очень легко ограничить уровень масштабирования.
Рассмотрим следующий пример: Fiddle Demo
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Google Maps JavaScript API v3 Example: Limit Panning and Zoom</title>
<script type="text/javascript"
src="http://maps.google.com/maps/api/js?sensor=false"></script>
</head>
<body>
<div id="map" style="width: 400px; height: 300px;"></div>
<script type="text/javascript">
// This is the minimum zoom level that we'll allow
var minZoomLevel = 5;
var map = new google.maps.Map(document.getElementById('map'), {
zoom: minZoomLevel,
center: new google.maps.LatLng(38.50, -90.50),
mapTypeId: google.maps.MapTypeId.ROADMAP
});
// Bounds for North America
var strictBounds = new google.maps.LatLngBounds(
new google.maps.LatLng(28.70, -127.50),
new google.maps.LatLng(48.85, -55.90)
);
// Listen for the dragend event
google.maps.event.addListener(map, 'dragend', function() {
if (strictBounds.contains(map.getCenter())) return;
// We're out of bounds - Move the map back within the bounds
var c = map.getCenter(),
x = c.lng(),
y = c.lat(),
maxX = strictBounds.getNorthEast().lng(),
maxY = strictBounds.getNorthEast().lat(),
minX = strictBounds.getSouthWest().lng(),
minY = strictBounds.getSouthWest().lat();
if (x < minX) x = minX;
if (x > maxX) x = maxX;
if (y < minY) y = minY;
if (y > maxY) y = maxY;
map.setCenter(new google.maps.LatLng(y, x));
});
// Limit the zoom level
google.maps.event.addListener(map, 'zoom_changed', function() {
if (map.getZoom() < minZoomLevel) map.setZoom(minZoomLevel);
});
</script>
</body>
</html>
Скриншот из приведенного выше примера. В этом случае пользователь не сможет перетащить дальше на юг или дальний восток:
if (x < minX) x = minX;
иif (x > maxX) x = maxX;
не исключают друг друга? Почему вы центрируете холст по координатам minX / maxX и maxX / maxY, хотя они не являются координатами центра?dragend
события вы можете использоватьdraggable: false
экземпляр карты ( рабочий пример )center_changed
мероприятие вместоdragend
.Лучшим способом ограничить уровень масштабирования может быть использование параметров
minZoom
/maxZoom
вместо реакции на события?Или параметры могут быть указаны во время инициализации карты, например:
См .: Справочник по Google Maps JavaScript API V3.
источник
Хорошие новости. Начиная с версии 3.35 Maps JavaScript API, которая была запущена 14 февраля 2019 года, вы можете использовать новую
restriction
опцию, чтобы ограничить область просмотра карты.Согласно документации
источник: https://developers.google.com/maps/documentation/javascript/reference/map#MapRestriction
Итак, теперь вы просто добавляете параметр ограничения во время инициализации карты и все. Взгляните на следующий пример, который ограничивает область просмотра до Швейцарии.
Надеюсь, это поможет!
источник
Чтобы ограничить зум на v.3+. в настройках карты добавьте уровень масштабирования по умолчанию, а уровни масштабирования minZoom или maxZoom (или оба, если требуется) составляют от 0 до 19. Если требуется ограничение, вы должны объявить уровень масштабирования по умолчанию. все чувствительны к регистру!
источник
Гораздо лучший способ ограничить диапазон ... использовал логику из приведенного выше плаката.
источник
this.googleMap
вместоmap
второго слушателя? И быть неdragStart
должноdragStartCenter
? Наконец, что естьmapBounds
?Это можно использовать для повторного центрирования карты в определенном месте. Что мне и было нужно.
источник
источник
Вот мой вариант решения проблемы ограничения видимой области.
strictBounds
это объектnew google.maps.LatLngBounds()
типа.self.gmap
хранит объект Google Map (new google.maps.Map()
).Это действительно работает, но не забывайте принимать во внимание геморрой с пересечением нулевого меридиана и параллели, если ваши границы перекрывают их.
источник
По какой-то причине
у меня не сработало (возможно, проблема южного полушария). Мне пришлось изменить его на:
Надеюсь, это кому-то поможет.
источник
Одно из решений: если вы знаете конкретную широту / долготу.
Если нет конкретной широты / долготы
или
источник
По состоянию на середину 2016 года официального способа ограничения видимой области не существует. Однако большинство специальных решений для ограничения границ имеют недостаток, потому что они не ограничивают границы точно так, чтобы соответствовать виду карты, они ограничивают его только в том случае, если центр карты выходит за указанные границы. Если вы хотите ограничить границы наложенного изображения, как я, это может привести к поведению, как показано ниже, где нижележащая карта видна под нашим наложением изображения:
Чтобы решить эту проблему, я создал библиотеку , которая успешно ограничивает границы, чтобы вы не могли панорамировать оверлей.
Однако, как и другие существующие решения, у него есть "вибрирующая" проблема. Когда пользователь достаточно агрессивно перемещает карту, после того, как он отпускает левую кнопку мыши, карта все еще продолжает панорамирование сама по себе, постепенно замедляясь. Я всегда возвращаю карту в исходное положение, но это приводит к некоторой вибрации. В настоящий момент этот эффект панорамирования нельзя остановить никакими средствами, предоставляемыми Js API. Похоже, что до тех пор, пока Google не добавит поддержку чего-то вроде map.stopPanningAnimation (), мы не сможем добиться плавного взаимодействия.
Пример использования упомянутой библиотеки, самый плавный опыт строгих границ, который мне удалось получить:
Библиотека также может автоматически рассчитывать минимальное ограничение масштабирования. Затем он ограничивает уровень масштабирования с помощью
minZoom
атрибута карты.Надеюсь, это поможет кому-то, кто хочет решения, которое полностью уважает заданные границы и не хочет выходить за их пределы.
источник
Это может быть полезно.
Уровень масштабирования можно настроить в соответствии с требованиями.
источник
e.g. only between levels 6 and 9
, он устанавливает уровень масштабирования по умолчанию и удаляет пользовательский интерфейс по умолчанию (т.е.+
/-
), что немного избыточно.