Metoda computeRoutes (REST) i ComputeRoutes (gRPC) zwracają w odpowiedzi trasę przedstawioną przez linię łamaną. Te interfejsy API zwracają 2 typy linii łamanych:
Podstawowa linia łamana (domyślna) przedstawia trasę, ale bez osadzonych w nich informacji o natężeniu ruchu. Żądania, które zwracają podstawową linię łamaną, są rozliczane według stawki podstawowej dotyczącej tras. Dowiedz się więcej o płatnościach za interfejs Routes API.
Zorientowana na natężenie ruchu linia łamana zawiera informacje o warunkach drogowych na trasie. Warunki ruchu są wyrażone w postaci kategorii prędkości (
NORMAL
,SLOW
,TRAFFIC_JAM
) mających zastosowanie w danym przedziale linii łamanej. Żądania dotyczące linii łamanych rozpoznających ruch są rozliczane według stawki Preferowana tras. Dowiedz się więcej o płatnościach za interfejs Routes API. Więcej informacji znajdziesz w artykule o konfigurowaniu jakości linii łamanych
Więcej informacji o liniach łamanych:
Narzędzie interaktywnego kodera łamanego umożliwia tworzenie zakodowanych linii łamanych w interfejsie użytkownika oraz dekodowanie tych linii do wyświetlania na mapie. Za pomocą tego narzędzia możesz na przykład zdekodować linię łamaną utworzoną w poniższym kodzie.
Wysyłanie żądania podstawowej linii łamanej dla trasy, etapu lub kroku
Linia łamana jest reprezentowana przez obiekt linii łamanej (REST) lub Polyline (gRPC). Linię łamaną możesz zwrócić w odpowiedzi na poziomie trasy, etapu i kroku.
Określ, która linia łamana ma zostać zwrócona, korzystając z maski pola odpowiedzi:
Na poziomie trasy zwraca w odpowiedzi linię łamaną, dodając w odpowiedzi
routes.polyline
do maski pola odpowiedzi.Na poziomie nogi zwraca linię łamaną w odpowiedzi na każdy etap trasy, uwzględniając
routes.legs.polyline
.Na poziomie kroku zwróć linię łamaną w odpowiedzi dla każdego kroku etapu, dodając
routes.legs.steps.polyline
.
Aby na przykład zwrócić linię łamaną dla całej trasy, dla każdego etapu i każdego kroku każdego etapu:
curl -X POST -d '{ "origin":{ "address": "1600 Amphitheatre Parkway, Mountain View, CA" }, "destination":{ "address": "24 Willie Mays Plaza, San Francisco, CA 94107" }, "travelMode": "DRIVE" }' \ -H 'Content-Type: application/json' \ -H 'X-Goog-Api-Key: YOUR_API_KEY' \ -H 'X-Goog-FieldMask: routes.duration,routes.distanceMeters,routes.polyline,routes.legs.polyline,routes.legs.steps.polyline' \ 'https://routes.googleapis.com/directions/v2:computeRoutes'
To żądanie zwraca odpowiedź zawierającą linię łamaną trasy, każdy etap trasy i każdy etap trasy:
{ "routes": [ { "legs": [ { "polyline": { "encodedPolyline": "ipkcFfich...@Bs@?A?O?SD{A@o@B}@I?qA?_AA_@@_@?" } }, "steps": [ { "polyline": { "encodedPolyline": "kclcF...@sC@YIOKI" } }, { "polyline": { "encodedPolyline": "wblcF~...SZSF_@?" } }, ... ], "distanceMeters": 56901, "duration": "2420s", "polyline": { "encodedPolyline": "ipkcFfich...@Bs@?A?O?SD{A@o@B}@I?qA?_AA_@@_@?" } } ] }
Ponieważ to żądanie zawiera tylko punkt początkowy i miejsce docelowe, zwrócona trasa zawiera tylko jeden etap. Dlatego linia łamana odcinka jest taka sama dla trasy.
Jeśli dodasz do żądania pośredni punkt pośredni, zwrócona trasa będzie miała 2 etapy:
curl -X POST -d '{ "origin":{ "address": "1600 Amphitheatre Parkway, Mountain View, CA" }, "destination":{ "address": "24 Willie Mays Plaza, San Francisco, CA 94107" }, "intermediates": [ { "address": "450 Serra Mall, Stanford, CA 94305, USA"}, ], "travelMode": "DRIVE", }' \ -H 'Content-Type: application/json' \ -H 'X-Goog-Api-Key: YOUR_API_KEY' \ -H 'X-Goog-FieldMask: routes.duration,routes.distanceMeters,routes.polyline,routes.legs.polyline' \ 'https://routes.googleapis.com/directions/v2:computeRoutes'
To żądanie zwraca 2 etapy, każdą z niepowtarzalną linią łamaną, i linię łamaną dla całej trasy:
{ "routes": [ { "legs": [ { "polyline": { "encodedPolyline": "kclcFfqchV?A...?I@G?GAECCCEKICBAFG" } "steps": [ { "polyline": { "encodedPolyline": "kclcFfqch...YIOKI" } }, ... }, { "polyline": { "encodedPolyline": "ojmcFtethV?K...QOYQOGA?_@MUG[Ga@G" } "steps": [ { "polyline": { "encodedPolyline": "uypeFbo`jVgJq...PoBiC" } }, ... } ], "distanceMeters": 68403, "duration": "3759s", "polyline": { "encodedPolyline": "kclcFfqchV?A?CBKF[Ha...?GAECCCEKICBAFGJEBE" } } ] }
Jakość linii łamanej
Jakość linii łamanej można opisać takimi terminami:
Dokładność punktów zmiennoprzecinkowych
Punkty są określane za pomocą szerokości i długości geograficznej, czyli w formacie liczb zmiennoprzecinkowych o pojedynczej precyzji. Sprawdza się to dobrze w przypadku małych wartości (które można dokładnie przedstawić), ale precyzja maleje, gdy wartości rosną z powodu błędów zaokrąglania liczb zmiennoprzecinkowych.
W metodach computeRoutes (REST) i ComputeRoutes steruje nimi
polylineEncoding
.Liczba punktów tworzących linię łamaną
Im więcej punktów, tym gładsza linia łamana (zwłaszcza na krzywych).
W metodach computeRoutes (REST) i ComputeRoutes steruje nimi
polylineQuality
.
Skonfiguruj typ kodowania linii łamanej
Aby określić typ linii łamanej, użyj opcji żądania polylineEncoding
.
Właściwość polylineEncoding
określa, czy linia łamana będzie kodowana jako ENCODED_POLYLINE
(domyślnie), co oznacza, że używany będzie format zakodowanego algorytmu łamanego lub GEO_JSON_LINESTRING
, co oznacza, że używany będzie format linii GeoJSON.
Na przykład w treści żądania:
curl -X POST -d '{ "origin":{ "address": "1600 Amphitheatre Parkway, Mountain View, CA" }, "destination":{ "address": "24 Willie Mays Plaza, San Francisco, CA 94107" }, "travelMode": "DRIVE", "polylineEncoding": "ENCODED_POLYLINE" }' \ -H 'Content-Type: application/json' \ -H 'X-Goog-Api-Key: YOUR_API_KEY' \ -H 'X-Goog-FieldMask: routes.duration,routes.distanceMeters,routes.polyline,routes.legs.polyline' \ 'https://routes.googleapis.com/directions/v2:computeRoutes'
Skonfiguruj jakość linii Poyline
polylineQuality
określa jakość linii łamanej jako HIGH_QUALITY
lub OVERVIEW
(domyślną). W przypadku OVERVIEW
linia łamana składa się z niewielkiej liczby punktów i ma krótszy czas oczekiwania na żądanie niż HIGH_QUALITY
.
Na przykład w treści żądania:
{ "origin":{ "location":{ "latLng":{ "latitude": 37.419734, "longitude": -122.0827784 } } }, "destination":{ "location":{ "latLng":{ "latitude": 37.417670, "longitude": -122.079595 } } }, "travelMode": "DRIVE", "routingPreference": "TRAFFIC_AWARE", "polylineQuality": "HIGH_QUALITY", "polylineEncoding": "ENCODED_POLYLINE", "departureTime": "2023-10-15T15:01:23.045123456Z", ... }
Żądanie linii łamanej uwzględniającej ruch
Powyższe przykłady zwracają podstawowe linie łamane, czyli linie łamane bez informacji o natężeniu ruchu. Możesz też poprosić, aby linia łamana zawierała informacje o natężeniu ruchu na trasie i jej każdym jej etapie.
Linie łamane uwzględniające natężenie ruchu zawierają informacje o ruchu drogowym na trasie. Warunki ruchu są wyrażone w postaci kategorii prędkości (NORMAL
, SLOW
, TRAFFIC_JAM
) w danym przedziale linii łamanej odpowiedzi. Przedziały są definiowane przez indeksy ich początkowych (włącznie) i końcowych punktów linii łamanej (wyłącznie).
Na przykład ta odpowiedź pokazuje ruch NORMAL
między punktami 2 i 4 linii łamanej:
{ "startPolylinePointIndex": 2, "endPolylinePointIndex": 4, "speed": "NORMAL" }
Aby wysłać żądanie obliczenia linii łamanej uwzględniającej ruch, ustaw w żądaniu te właściwości:
Ustaw w polu tablicy
extraComputations
wartośćTRAFFIC_ON_POLYLINE
, aby włączyć obliczanie ruchu.Ustaw
travelMode
naDRIVE
lubTWO_WHEELER
. Żądania dotyczące innych środków transportu zwracają błąd.Określ w żądaniu ustawienie routingu
TRAFFIC_AWARE
lubTRAFFIC_AWARE_OPTIMAL
. Więcej informacji znajdziesz w artykule o konfigurowaniu jakości i czasu oczekiwania.Ustaw maskę pola odpowiedzi, która określa, czy mają być zwracane właściwości odpowiedzi:
Na poziomie trasy zwraca w odpowiedzi wszystkie informacje dotyczące podróży, dodając w odpowiedzi
routes.travelAdvisory
w masce pola odpowiedzi. Aby zwracać tylko informacje o ruchu, wpiszroutes.travelAdvisory.speedReadingIntervals
Na poziomie etapu zwraca w odpowiedzi na każdy etap trasy wszystkie informacje dotyczące podróży, uwzględniając
routes.legs.travelAdvisory
. Aby zwracać tylko informacje o ruchu, wpiszroutes.legs.travelAdvisory.speedReadingIntervals
.
curl -X POST -d '{ "origin":{ "address": "1600 Amphitheatre Parkway, Mountain View, CA" }, "destination":{ "address": "24 Willie Mays Plaza, San Francisco, CA 94107" }, "travelMode": "DRIVE", "extraComputations": ["TRAFFIC_ON_POLYLINE"], "routingPreference": "TRAFFIC_AWARE_OPTIMAL" }' \ -H 'Content-Type: application/json' \ -H 'X-Goog-Api-Key: YOUR_API_KEY' \ -H 'X-Goog-FieldMask: routes.duration,routes.distanceMeters,routes.polyline,routes.legs.polyline,routes.travelAdvisory,routes.legs.travelAdvisory' \ 'https://routes.googleapis.com/directions/v2:computeRoutes'
Przykładowa odpowiedź dla linii łamanej rozpoznającej ruch
W odpowiedzi dane o ruchu są zakodowane na linii łamanej i zawarte w polu travelAdvisory
typu RouteLegTravelAdvisory (każdy etap) lub w obiekcie RouteTravelAdvisory (trasa).
Na przykład:
{ "routes": [ { "legs": { "polyline": { "encodedPolyline": "}boeF~zbjVAg@EmB`GWHlD" }, // Traffic data for the leg. "travelAdvisory": { "speedReadingIntervals": [ { "endPolylinePointIndex": 1, "speed": "NORMAL" }, { "startPolylinePointIndex": 1, "endPolylinePointIndex": 2, "speed": "SLOW" }, { "startPolylinePointIndex": 2, "endPolylinePointIndex": 4, "speed": "NORMAL" } ] } }, "polyline": { "encodedPolyline": "}boeF~zbjVAg@EmB`GWHlD" }, // Traffic data for the route. "travelAdvisory": { "speedReadingIntervals": [ { "endPolylinePointIndex": 1, "speed": "NORMAL" }, { "startPolylinePointIndex": 1, "endPolylinePointIndex": 2, "speed": "SLOW" }, { "startPolylinePointIndex": 2, "endPolylinePointIndex": 4, "speed": "NORMAL" } ] } } ] }
Zarówno RouteTravelAdvisory
, jak i RouteLegTravelAdvisory
zawierają pole tablicy o nazwie speedReadingIntervals
, które zawiera informacje o prędkości ruchu. Każdy obiekt w tablicy jest reprezentowany przez obiekt SpeedReadingInterval (REST) lub SpeedReadingInterval (gRPC).
Obiekt SpeedReadingInterval
uwzględnia odczyt prędkości dla interwału trasy, np. NORMAL
, SLOW
lub TRAFFIC_JAM
. Cała tablica obiektów obejmuje całą linię łamaną trasy bez nakładania się. Punkt początkowy określonego przedziału czasu jest taki sam jak punkt końcowy poprzedniego interwału.
Każdy interwał jest opisany przez jego startPolylinePointIndex
, endPolylinePointIndex
oraz odpowiednią kategorię prędkości.
Zwróć uwagę, że brak indeksu początkowego w przedziale odpowiada indeksowi 0 zgodnie z protokołami protokołu 3.
Wartości startPolylinePointIndex
i endPolylinePointIndex
nie zawsze występują po sobie. Na przykład:
{ "startPolylinePointIndex": 2, "endPolylinePointIndex": 4, "speed": "NORMAL" }
W tym przypadku warunki na drodze były takie same od indeksu 2 do indeksu 4.
Renderuj rozpoznające ruchy łamane za pomocą pakietu Maps SDK
Zalecamy wyświetlanie na mapie linii łamanych związanych z natężeniem ruchu za pomocą różnych funkcji oferowanych w pakietach SDK Map Google, takich jak niestandardowe kolorowanie, kreski i wzory wzdłuż rozciągnięć linii łamanej. Więcej informacji o używaniu linii łamanych znajdziesz w opisach funkcji Polyline na Androida i artykule o funkcjach Polyline na iOS.
Przykład renderowania linii łamanej
Użytkownicy pakietu SDK Map Google mogą zdefiniować niestandardową logikę mapowania między kategoriami prędkości a schematami renderowania linii łamanych. Na przykład można wyświetlić szybkość „NORMAL” jako grubą niebieską linię na mapie, a „WOLNA” – na przykład grubą pomarańczową linię.
Poniższe fragmenty kodu dodają grubą niebieską linię łamaną z segmentami geodezyjnymi z Melbourne do Perth. Więcej informacji znajdziesz w sekcjach Dostosowywanie wyglądu (na Androidzie) i Dostosowywanie Polyline (na iOS).
Android
Java
Polyline line = map.addPolyline(new PolylineOptions() .add(new LatLng(-37.81319, 144.96298), new LatLng(-31.95285, 115.85734)) .width(25) .color(Color.BLUE) .geodesic(true));
Kotlin
val line: Polyline = map.addPolyline( PolylineOptions() .add(LatLng(-37.81319, 144.96298), LatLng(-31.95285, 115.85734)) .width(25f) .color(Color.BLUE) .geodesic(true) )
iOS
Objective-C
GMSMutablePath *path = [GMSMutablePath path]; [path addLatitude:-37.81319 longitude:144.96298]; [path addLatitude:-31.95285 longitude:115.85734]; GMSPolyline *polyline = [GMSPolyline polylineWithPath:path]; polyline.strokeWidth = 10.f; polyline.strokeColor = .blue; polyline.geodesic = YES; polyline.map = mapView;
Swift
let path = GMSMutablePath() path.addLatitude(-37.81319, longitude: 144.96298) path.addLatitude(-31.95285, longitude: 115.85734) let polyline = GMSPolyline(path: path) polyline.strokeWidth = 10.0 polyline.geodesic = true polyline.map = mapView