Możesz posłuchać dragend
zdarzenia, a jeśli mapa zostanie przeciągnięta poza dozwolone granice, przenieś ją z powrotem do środka. Możesz zdefiniować dozwolone granice w LatLngBounds
obiekcie, a następnie użyć contains()
metody, aby sprawdzić, czy nowy środek szerokości / długości geograficznej znajduje się w tych granicach.
Możesz także bardzo łatwo ograniczyć poziom powiększenia.
Rozważmy następujący przykład: 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>
Zrzut ekranu z powyższego przykładu. W takim przypadku użytkownik nie będzie mógł przeciągnąć dalej na południe ani na daleki wschód:
if (x < minX) x = minX;
iif (x > maxX) x = maxX;
nie wykluczajcie się wzajemnie? Dlaczego wyśrodkowujesz płótno na współrzędnych minX / maxX i maxX / maxY, chociaż nie są to współrzędne środka?dragend
zdarzenia można by użyćdraggable: false
na mapie ( przykład roboczy )center_changed
zamiast tego zmienił wydarzeniedragend
.Lepszym sposobem ograniczenia poziomu powiększenia może być użycie opcji
minZoom
/maxZoom
zamiast reagowania na zdarzenia?Lub opcje można określić podczas inicjalizacji mapy, np .:
Zobacz: Dokumentacja interfejsu API JavaScript w Mapach Google V3
źródło
Dobre wieści. Począwszy od wersji 3.35 Maps JavaScript API, która została uruchomiona 14 lutego 2019 r., Możesz skorzystać z nowej
restriction
opcji, aby ograniczyć obszar wyświetlania mapy.Zgodnie z dokumentacją
źródło: https://developers.google.com/maps/documentation/javascript/reference/map#MapRestriction
Więc teraz po prostu dodajesz opcję ograniczenia podczas inicjalizacji mapy i to wszystko. Spójrz na poniższy przykład, który ogranicza widok do Szwajcarii
Mam nadzieję, że to pomoże!
źródło
Aby ograniczyć powiększenie w wersji 3+. w ustawieniach mapy dodaj domyślny poziom powiększenia i minZoom lub maxZoom (lub oba, jeśli jest to wymagane) poziomy powiększenia od 0 do 19. Musisz zadeklarować głuchy poziom powiększenia, jeśli wymagane jest ograniczenie. wszystkie rozróżniają wielkość liter!
źródło
Znacznie lepszy sposób na ograniczenie zakresu ... wykorzystałem logikę zawiera z powyższego plakatu.
źródło
this.googleMap
zamiastmap
dla drugiego słuchacza? Też nie powinnodragStart
byćdragStartCenter
? Wreszcie, co jestmapBounds
?Można to wykorzystać do ponownego wyśrodkowania mapy do określonej lokalizacji. Czego potrzebowałem.
źródło
źródło
Oto mój wariant rozwiązania problemu ograniczenia widocznego obszaru.
strictBounds
jest obiektemnew google.maps.LatLngBounds()
typu.self.gmap
przechowuje obiekt mapy Google (new google.maps.Map()
).To naprawdę działa, ale nie zapomnij wziąć pod uwagę hemoroidów z przekroczeniem południków zerowych i równoleżników, jeśli Twoje granice je pokrywają.
źródło
Z jakiegoś powodu
nie zadziałało dla mnie (może problem półkuli południowej). Musiałem to zmienić na:
Mam nadzieję, że to komuś pomoże.
źródło
Jedno rozwiązanie jest takie, że jeśli znasz konkretny lat / lng.
Jeśli nie masz konkretnych lat / lng
lub
źródło
Od połowy 2016 r. Nie ma oficjalnego sposobu ograniczenia widocznego obszaru. Większość rozwiązań ad-hoc ograniczających granice ma jednak wadę, ponieważ nie ograniczają granic dokładnie tak, aby pasowały do widoku mapy, ograniczają je tylko wtedy, gdy środek mapy znajduje się poza określonymi granicami. Jeśli chcesz ograniczyć granice do nakładającego się obrazu, takiego jak ja, może to spowodować zachowanie, jak pokazano poniżej, gdzie mapa podkładania jest widoczna pod naszą nakładką obrazu:
Aby rozwiązać ten problem, utworzyłem bibliotekę , która z powodzeniem ogranicza granice, więc nie można przesuwać się z nakładki.
Jednak podobnie jak inne istniejące rozwiązania ma problem z „wibracjami”. Kiedy użytkownik przesuwa mapę wystarczająco agresywnie, po zwolnieniu lewego przycisku myszy, mapa nadal się przesuwa, stopniowo zwalniając. Zawsze zwracam mapę z powrotem do granic, ale to powoduje wibracje. Tego efektu panoramowania nie można obecnie zatrzymać za pomocą żadnych środków udostępnionych przez interfejs API Js. Wygląda na to, że dopóki Google nie doda obsługi czegoś takiego jak map.stopPanningAnimation (), nie będziemy w stanie stworzyć płynnego doświadczenia.
Przykład korzystania ze wspomnianej biblioteki, najbardziej płynne doświadczenie w zakresie ścisłych ograniczeń, jakie udało mi się uzyskać:
Biblioteka jest również w stanie automatycznie obliczyć minimalne ograniczenie zoomu. Następnie ogranicza poziom powiększenia za pomocą
minZoom
atrybutu mapy.Miejmy nadzieję, że pomoże to komuś, kto chce rozwiązania, które w pełni szanuje podane granice i nie chce pozwolić na ich przesuwanie.
źródło
To może być pomocne.
Poziom powiększenia można dostosować zgodnie z wymaganiami.
źródło
e.g. only between levels 6 and 9
, ustawia domyślny poziom powiększenia i usuwa domyślny interfejs użytkownika (tj.+
/-
), Który jest trochę przesadzony.