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.

Szczegóły wielu wyników geokodowania

Ten artykuł dotyczy API w wersji 2

« powrót do listy poradników

W tutorialu pokazany został przykład obsługi geokodowania wielu wyników, dzięki którym przy znalezieniu więcej niż jednego pasującego rezultatu program wyświetlał dostępne opcje, a użytkownik mógł wybrać tę właściwą. Problemem było jedynie to, że nie istniały żadne dodatkowe wskazówki, mówiące o położeniu danej miejscowości. Przykładowo wpisanie słowa "Mierzyn" powodowało pokazanie kilku rezultatów, brzmiących identycznie "Mierzyn":

Kilka identycznie brzmiących wyników

W tym poradniku pokazany zostanie sposób na dokładniejsze określenie geokodowanych adresów.

Struktura

Kluczowym zagadnieniem jest struktura, zwracana przez funkcję getLocations() obiektu GClientGeocoder(). Oto przykładowe wyniki dla jednego rekordu, które są zwracane jako JSON:

{
	"id":"p1",
	"address":"Mierzyn, Poland",
	"AddressDetails":
	{
		"Country":
		{
			"CountryNameCode":"PL",
			"AdministrativeArea":
			{
				"AdministrativeAreaName": "Zachodniopomorskie",
				"SubAdministrativeArea":
				{
					"SubAdministrativeAreaName":"Białogardzki",
					"Locality":
					{
						"LocalityName":"Mierzyn"
					}
				}
			}
		},
		"Accuracy": 4
	},
	"Point":
	{
		"coordinates":[15.886338,54.112441,0]
	}
}

Aby wyciągnąć nazwę powiatu i województwa, wystarczy skorzystać z następującego odwołania (przy założeniu że wyniki to zwrócona tablica, a j to numer iteracji pętli, wykonywanej dla każdego wyniku:

wyniki.Placemark[j].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName; // powiat
wyniki.Placemark[j].AddressDetails.Country.AdministrativeArea.AdministrativeAreaName // województwo

Posiadając te informacje, modyfikacja przykładu to czysta formalność - oto kluczowy fragment kodu:

html+='<strong>Znalazłem kilka pasujących adresów:</strong><ul>';
// dla każdego z wyników...
for (var j=0; j<wyniki.Placemark.length; j++)
{
	var punkt = wyniki.Placemark[j].Point.coordinates;
	
	// dodajemy linki, umożliwiające dodanie markera
	html += '<li><a href="#" onclick="document.getElementById(\'geoAdresy\').style.display=\'none\'; mapa.addOverlay(new GMarker(new GLatLng('+parseFloat(punkt[1])+','+parseFloat(punkt[0])+'))); mapa.setCenter(new GLatLng('+parseFloat(punkt[1])+','+parseFloat(punkt[0])+'),15);  return false;">';
		
	try
	{
		html += wyniki.Placemark[j].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName+', ';
		html += 'pow. '+wyniki.Placemark[j].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName+', ';
		html += 'woj. '+wyniki.Placemark[j].AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;
	}
	catch(e)
	{
		html += document.getElementById('adres').value;
	}
	html += '</a>';
	
	
}
html +='</ul>';

Konstrukcja try {} catch() {} została zastosowana z tej przyczyny, że niektóre wyniki po przetworzeniu mogą nie posiadać pewnych własności - kod w tej formie wyklucza wystąpienie błędów JavaScript.

Efekt jest zgodny z naszymi oczekiwaniami:

Sytuacja po poprawkach