Flex i Google Maps API – geolokalizacja

June 9th, 2010 by Piotr Wierzgała Leave a reply »

Geolokalizacja jest jedną z usług, z której możemy korzystać za pomocą Google Maps API. Dzięki niej posługując się odpowiednimi słowami kluczowymi odnajdziemy na mapie świata dowolną lokację: ulicę, miasto, państwo, obiekt architektoniczny czy krainę geograficzną.

Spis treści

Aplikacja

Poniższa aplikacja demonstruje możliwości usługi Geocoding. Dodatkowo pokazuje wszystkie informacje zwrócone przez serwer po pomyślnym przetworzeniu zapytania. Dostęp do źródła można uzyskać poprzez kliknięcie prawym przyciskiem myszy w obszar aplikacji i wybranie opcji “View Source” z menu kontekstowego.

Przygotowywania komunikacji z usługą

Z usługi gelokalizacji będziemy korzystać za pomocą klasy ClientGeocoder. Jej konstruktor przyjmuje tylko jeden, opcjonalny parametr, którym jest obiekt klasy ClientGeocoderOptions definiujący parametry geolokalizowania.
Po utworzeniu instancji klasy ClientGeocoder dodajemy do niej nasłuchiwanie zdarzeń: GeocodingEvent.GEOCODING_SUCCESS i GeocodingEvent.GEOCODING_FAILURE, które będą informować nas odpowiednio o pomyślnym lub niepomyślnym zakończeniu procesu geolokalizacji.

var clientGeocoder:ClientGeocoder = new ClientGeocoder;
clientGeocoder.addEventListener(GeocodingEvent.GEOCODING_SUCCESS, clientGeocoder_GEOCODING_SUCCESS);
clientGeocoder.addEventListener(GeocodingEvent.GEOCODING_FAILURE, clientGeocoder_GEOCODING_FAILURE);

Parametry geolokalizacji

Parametry geolokalizacji określamy za pomocą obiektu klasy ClientGeocoderOptions, który możemy przekazać do konstruktora klasy ClientGeocoder lub ustawić ustawić w dowolnym momencie za pomocą metody setOptions klasy ClientGeocoder. Określić możemy trzy parametry:

  • countryCode: Oznaczenie kraju (“PL”,”EN” itp.) dla zapytania geolokalizacji. W przypadku nie ustawienia tego parametru jego wartość zostanie ustalona na podstawie ustawień przeglądarki. Nie zauważyłem żadnych zmian w działaniu aplikacji przy różnych ustawieniach tego parametru.
  • language: Język (“en”, “pl” itd.) dla zapytania dla geolokalizacji. W przypadku nie ustawienia tego parametru jego wartość zostanie ustalona na podstawie ustawień przeglądarki. Wartość tego parametru wpływa na język w jakim będą dostępne informacje o lokacji.
  • viewport: Współrzędne wyznaczające obszar podwyższonego priorytetu w procesie geolokalizacji. Jeżeli w wyznaczonym obszarze znajdzie się lokacja pasująca do słów kluczowych wtedy wtedy zostanie zwrócona tylko ona, w przeciwnym razie zostaną zwrócone wszystkie odnalezione lokacje

Przykład:

var clientGeocoderOptions:ClientGeocoderOptions = new ClientGeocoderOptions({
    countryCode: "EN",
    language: "en",
    viewport: new LatLngBounds(
        new LatLng(51.00,22.05),
        new LatLng(51.53,23.10)
    )
});

Wysłanie zapytania geolokalizacji

Zapytanie geolokalizacji wysyłamy za pomocą metody geocode klasy ClientGeocoder, która jako parametr przyjmuje łańcuch opisujący szukaną lokację.

Przykład:

clientGeocoder.geocode("stara wieś");

Odebranie zapytania geolokalizacji

Po wywołaniu metody geocode wykonany zostanie kod jednej z dwóch funkcji obsługujących zdarzenia pomyślnego i niepomyślnego zakończenia procesu geolokalizacji.


Geolokalizacja zakończyła się sukcesem

W przypadku pomyślnego zakończenia geolokalizacji wywołana zostanie funkcja obsługująca zdarzenie GeocodingEvent.GEOCODING_SUCCESS. W niej odwołujemy się kolejno do pól request i placermarks zdarzenia w celu uzyskania dostępu do danych wszystkich lokacji pasujących do klucza. Dane przechowywane są w tablicy ponieważ do jednego klucza może pasować wiele lokacji. Wystarczy np. zlecić geolokalizatorowi odnalezienie “starej wsi” aby przekonać się o tym, że jest ich w Polsce co najmniej dziesięć.

Przykład:

private function clientGeocoder_GEOCODING_SUCCESS(event:GeocodingEvent):void {
    var placemarks:Array = event.response.placemarks;
}

Tablica placemarks zawiera obiekty klasy Placemark, które przechowują dane o:

  • adresie lokacji (typ: String),
  • szczegółach adresu lokacji (typ: Object),
  • współrzędnych geograficznych lokacji (typ: LatLng).

Dostęp do powyższych danych uzyskujemy poprzez odwołanie się do następujących pól klasy Placemark:

adres lokacji: address
kod kraju: AddressDetails.Country.CountryNameCode
nazwa kraju: AddressDetails.Country.CountryName
województwo: AddressDetails.Country.AdministrativeArea.AdministrativeAreaName
powiat: AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName
miasto: AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName
ulica: AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName
kod pocztowy: AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber
dokładność: AddressDetails.Accuracy
współrzędne: point

Jedyną z powyższych informacji, która nie tłumaczy się sama jest dokładność. Dokładność przyjmuje wartości od 0 do 9 oznaczające stopień precyzji z jakim udało się wyznaczyć położenie danej lokacji.

Opis stopni precyzji:

  • 0: nieokreślona,
  • 1: państwo,
  • 2: województwo,
  • 3: powiat,
  • 4: miasto,
  • 5: kod pocztowy,
  • 6: ulica,
  • 7: skrzyżowanie (ang. intersection),
  • 8: numer budynku,
  • 9: nazwa lokacji (budynku, posiadłości, uczelni, centrum handlowego).

Ze wszystkich powyższych nie udało mi się jedynie uzyskać wyniku o stopniu dokładności równym 7 dlatego nie mam pewności co on tak naprawdę oznacza. Nie wydaje mi się żeby to było skrzyżowanie, ale też nie mam pomysłu co innego może oznaczać słowo intersection.


Geolokalizacja zakończyła się błędem

W przypadku wystąpienia błędu podczas geolokalizacji wywołana zostanie funkcja obsługująca zdarzenie GeocodingEvent.GEOCODING_FAILURE. Żeby zidentyfikować przyczynę błędu pobieramy jego kod znajdujący się w polu status zdarzenia i sprawdzamy jego znaczenie w dokumentacji lub poniżej:

  • 400: Zapytanie nie mogło zostać poprawnie przetworzone przez serwer
  • 500: Wystąpiły problemy po stronie serwera geolokalizacji.
  • 601: Nie podano adresu do geolokalizacji.
  • 602: Nieznany lub nieprawidłowy adres.
  • 603: Ze względów prawnych lub innych wynik zapytania nie może zostać zwrócony.
  • 620: Liczba dozwolonych zapytań w ciągu ostatnich 24 godzin została przekroczona.

Przykładowa implementacja metody obsługującej zdarzenie niepomyślnego wyznaczenia trasy:

private function clientGeocoder_GEOCODING_FAILURE(event:GeocodingEvent):void {
    var description:String;
    switch (event.directions.status) {
        case 400: description = "Zapytanie nie mogło zostać poprawnie przetworzone przez serwer."; break;
        case 500: description = "Wystąpiły problemy po stronie serwera geolokalizacji."; break;
        case 601: description = "Nie podano adresu do geolokalizacji."; break;
        case 603: description = "Ze względów prawnych lub innych wynik zapytania nie może zostać zwrócony."; break;
        case 602: description = "Nieznany lub nieprawidłowy adres."; break;
        case 603: description = "Ze względów prawnych lub innych wynik zapytania nie może zostać zwrócony."; break;
        case 620: description = "Liczba dozwolonych zapytań w ciągu ostatnich 24 godzin została przekroczona."; break;
        default: description = "Nieobsługiwany błąd: "+event.directions.status;
    }
    Alert.show(description,"Błąd");
}
Advertisement

Leave a Reply

Flexmaniaks on Facebook