www.gmapsapi.com

Kompleksowy kurs podstaw API, po którym mapowianie nie będzie miało przed Tobą żadnych tajemnic!

Setki przykładów, kursów i poradników z kodem gotowym do skopiowania i korzystania.

Największa strona o Google Maps API w Polsce, największe źródło informacji w języku polskim.

Ograniczanie zakresu mapy

Ten artykuł dotyczy API w wersji 2

« powrót do listy poradników

Za pomocą obsługi zdarzenia move oraz paru prostych skryptów można w dość prosty sposób ograniczyć obszar, po którym użytkownik mapy będzie mógł się poruszać. Równie proste jest ograniczenie dostępnych poziomów przybliżenia. Obie metody będą tematem tego poradnika.

Ograniczenie poziomu zoom

Zaczniemy od rzeczy prostszej. Ustawienie minimalnego oraz maksymalnego dostępnego poziomu powiększenia można zapisać w pięciu linijkach kodu:

var ograniczenieZoom = [6,9];
var mapy = mapa.getMapTypes();
for (var i=0; i<mapy.length; i++)
{
	mapy[i].getMinimumResolution = function() {return ograniczenieZoom[0];}
	mapy[i].getMaximumResolution = function() {return ograniczenieZoom[1];}
}

Dla każdego typu mapy (np. G_HYBRID_MAP lub G_SATELLITE_MAP) piszemy własną funkcję, zwracającą maksymalny i minimalny dostępny zoom za pomocą odpowiednich metod getMaximumResolution() oraz getMinimumResolution(). Nienazwana funkcja musi zwracać liczbę naturalną, gdzie 0 to najdalsze możliwe oddalenie, a 19 to standardowo najbliższe możliwe przybliżenie. Kod powyżej spowoduje, że mapa będzie posiadać jedynie 4 stopnie przybliżenia: 6, 7, 8 i 9

Uwagi

  • powyższy kod musi znaleźć się za inicjalizacją mapy
  • maksymalny poziom zoom dla mapy fizycznej wynosi 15, dla mapy zwykłej 17, a dla map hybrydowych i satelitarnych wynosi on 19
  • początkowy poziom przybliżenia powinien zawierać się w ustalonym przedziale (w przykładzie powyżej od 6 - 9)

Ograniczenie obszaru przesuwania

Nieco trudniejsze jest ograniczenie obszaru, który można oglądać na mapie. Na potrzeby przykładu przyjmiemy obszar, określony narożnymi punktami o współrzędnych (49.49667452747044,13.88671875) i (54.53223884916208,23.46679687). Taki prostokąt pokrywa mniej więcej powierzchnię Polski. W trakcie przesuwania będziemy badać, czy środek mapy znajduje się w dozwolonym przedziale, i jeśli tak nie jest, to obliczymy współrzędne punktu, który w obszarze będzie się mieścił, i na nim wycentrujemy mapę. Stworzy to efekt złudzenia, że faktycznie mapa nie może zostać przesunięta dalej.

Dozwolony obszar będziemy przechowywać w odpowiedniej zmiennej typu GLatLngBounds():

var ograniczenieObszar = new GLatLngBounds();
ograniczenieObszar.extend(new GLatLng(49.49667452747044,13.88671875));
ograniczenieObszar.extend(new GLatLng(54.53223884916208,23.46679687));

Zaczynamy od obsługi odpowiedniego zdarzenia - po jego wystąpieniu wykonana zostanie funkcja sprawdz():

GEvent.addListener(mapa,'move',sprawdz);

Wygląda ona następująco:

function sprawdz()
{
	if(!ograniczenieObszar.contains(mapa.getCenter())) // czy środek mapy jest poza dozwolonym obszarem?
	{
		var lat = mapa.getCenter().lat();
		var lng = mapa.getCenter().lng();
		
		// minimalne i maksymalne wartości, pobrane z dozwolonego obszaru
		var minlat = ograniczenieObszar.getSouthWest().lat();
		var maxlat = ograniczenieObszar.getNorthEast().lat();
		var minlng = ograniczenieObszar.getSouthWest().lng();
		var maxlng = ograniczenieObszar.getNorthEast().lng();
		
		// jeśli szerokość geograficzna jest większa niż maksimum, to zmieniamy jej wartość na to maksimum
		if(lat > maxlat)
			lat = maxlat;
		
		// jeśli szerokość geograficzna jest mniejsza niż minimum, to zmieniamy jej wartość na to minimum
		else if(lat < minlat)
			lat = minlat;
			
		// analogicznie dla długości geograficznej
		if(lng > maxlng)
			lng = maxlng;
		else if(lng < minlng)
			lng = minlng;
		
		// centrujemy mapę w poprawnych współrzędnych
		mapa.setCenter(new GLatLng(lat,lng));
	}
}

I to tyle, oto efekt: