Wyznaczanie trasy pomiędzy dowolnymi lokacjami to jedna z usług do jakiej dostęp umożliwia Google Maps API. Dzięki niej ustalimy parametry wyznaczania trasy, odrysujemy na mapie trasę przebiegającą przez dowolną ilość lokacji oraz uzyskamy dostęp do wskazówek podróży, które pozwolą nam podążać wzdłuż określonej ścieżki.
Spis treści
- Aplikacja
- Przygotowanie komunikacji z usługą
- Parametry wyznaczania trasy
- Wysłanie zapytania wyznaczenia trasy
- Odebranie wyniku zapytania wyznaczenia trasy
Aplikacja
Poniższa aplikacja demonstruje możliwości usługi Driving Directions: wyznaczania trasy pomiędzy dwiema lub trzema lokacjami, ustawiania parametrów wyznaczania trasy, odrysowywania trasy na mapie, przeglądania wskazówek podróżowania według wyznaczonej trasy. 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.
![]()
Przygotowanie komunikacji z usługą
W celu wyznaczenia trasy musimy posłużyć się obiektem klasy Directions. Za jego pośrednictwem ustawimy wszystkie parametry wyznaczania trasy, wyślemy zapytanie do serwera i odbierzemy jego wynik. Do obiektu klasy Directions dodajemy nasłuchiwanie na dwa zdarzenia: DirectionsEvent.DIRECTIONS_SUCCESS i DirectionsEvent.DIRECTIONS_FAILURE, które będą informować nas odpowiednio o pomyślnym lub niepomyślnym zakończeniu procesu wyznaczania trasy.
directions.addEventListener(DirectionsEvent.DIRECTIONS_SUCCESS, directions_DIRECTIONS_SUCCESS);
directions.addEventListener(DirectionsEvent.DIRECTIONS_FAILURE, directions_DIRECTIONS_FAILURE);
Parametry wyznaczania trasy
Parametry wyznaczania trasy określamy za pomocą obiektu klasy DirectionsOptions, który możemy przekazać do konstruktora klasy Directions lub ustawić ustawić w dowolnym momencie za pomocą metody setOptions klasy Directions. Określić możemy cztery parametry:
- avoidHighways - Wartość logiczna określająca czy autostrady mają być brane pod uwagę podczas wyznaczania trasy. Domyślna wartość to true.
- countryCode - Oznaczenie kraju (“PL”,”EN” itp.) dla zapytania wyznaczania trasy. W przypadku nie ustawienia tego parametru zostanie użyta wartość zapisana w polu countryCode mapy (o ile sama została ustawiona). 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 wyznaczania trasy. W przypadku nie ustawienia tego parametru zostanie użyta wartość zapisana w polu language mapy, a jeżeli i ta wartość nie jest ustawiona wtedy język zostanie ustalony na podstawie ustawień przeglądarki. Wartość tego parametru wpływa na język w jakim będą dostępne opisy kolejnych kroków trasy.
- travelMode - Rodzaj podróżowania dla jakiego zostanie wyznaczona trasa. Do wyboru mamy podróżowanie przy pomocy auta lub pieszo, dla których parametr powinien przyjąć odpowiednio wartości: TRAVEL_MODE_DRIVING lub TRAVEL_MODE_WALKING. Wartość domyślna to TRAVEL_MODE_DRIVING.
Przykład:
avoidHighways: true,
language: 'en',
countryCode: 'US',
travelMode: DirectionsOptions.TRAVEL_MODE_WALKING
});
Wysłanie zapytania wyznaczenia trasy
Zapytanie wyznaczenia trasy wysyłamy za pomocą metody load klasy Directions, która jako parametr przyjmuje łańcuch opisujący lokacje przez jakie powinna przebiegać trasa.
Minimalnie wystarczy podać jedna lokację po “from:” i jedną po “to:”. Jeżeli jednak chcemy wyznaczyć trasę przebiegającą przez jakieś konkretne lokacje wtedy podajemy je, w dowolnej ilości, po kolejnych ciągach “to:”. Zamiast podawania nazw lokacji dopuszczalne jest podawanie ich współrzędnych geograficznych. Można w tym celu skorzystać z geolokaliztatora dostępnego np. w aplikacjach zamieszczonych we wpisach “Flex i Google Maps API – rysowanie po mapie” lub “Flex i Google Maps API – geolokalizacja”.
Odebranie wyniku zapytania wyznaczenia trasy
Po wywołaniu metody load wykonany zostanie kod jednej z dwóch funkcji obsługujących zdarzenia pomyślnego i niepomyślnego zakończenia procesu wyznaczania trasy.
Wyznaczanie trasy zakończyło się sukcesem
Po pomyślnym wyznaczeniu trasy możemy odwołać się do obiektu directions w celu uzyskania różnych interesujących nas danych trasy takich jak:
- długość trasy,
- przybliżony czas trwania podróży,
- opis kolejnych kroków podróży,
- graficzna reprezentacja trasy.
Dostęp do trzech pierwszych uzyskujemy poprzez wywołanie metody getRoute obiektu directions, która jako parametr przyjmuje numer trasy. Jeżeli trasa została wyznaczona od punktu A do punktu B wtedy istnieje tylko jedna trasa. Jeżeli jednak wysłaliśmy zapytanie, w którym zdefiniowaliśmy np. dwie dodatkowe lokacje na drodze do punktu docelowego wtedy będziemy posiadali dostęp do trzech tras łączących odpowiednio punkty: A-B, B-C, C-D. Każda z tych tras będzie miała oddzielnie określoną długość, czas podróży oraz kolejne kroki podróży.
Przykładowe pobranie danych o długości trasy i czasie podróży:
travelTimeTextArea.htmlText = directions.getRoute(routeIndex).durationHtml;
Dostęp do poszczególnych kroków podróży uzyskujemy poprzez wywołanie metody getStep na wyniku zwróconym przez metodę getRoute. Metoda getStep zwraca obiekt klasy Step, który zawiera informacje o wybranym kroku podróży:
- opis,
- czas wykonania,
- współrzędne graficzne,
- indeks pierwszego punktu tworzącego ten krok w graficznej reprezentacji trasy.
Przykładowe pobranie opisu pierwszego kroku pierwszej trasy:
Chcąc narysować na mapie kształt trasy wystarczy dodać jako warstwę rezultat wywołania metody createPolyline.
Wyznaczanie trasy zakończyło się błędem
W przypadku wystąpienia błędu podczas wyznaczania trasy wywołana zostanie funkcja obsługująca zdarzenie DirectionsEvent.DIRECTIONS_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.
- 604: Trasa nie może zostać wyznaczona.
- 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:
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 604: description = "Trasa nie może zostać wyznaczona."; 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");
}