Metoda computeRoutes (REST) i metoda ComputeRoutes (gRPC) zwracają trasę reprezentowaną przez polilinię w ramach odpowiedzi. Te interfejsy API zwracają 2 typy wielokątów:
Podstawowa linia łamana (domyślna) – reprezentuje trasę, ale bez informacji o ruchu drogowym zawartych w linii. Żądania zwracające podstawowy wielokąt są rozliczane według stawki podstawowej dla tras. Więcej informacji o płatnościach w przypadku interfejsu Routes API.
Polilinia uwzględniająca natężenie ruchu, która zawiera informacje o warunkach na drodze. Warunki na drogach są wyrażane w kategoriach prędkości (
NORMAL
,SLOW
,TRAFFIC_JAM
) obowiązujących na danym odcinku ścieżki wielokąta. Zapytania dotyczące polilinii uwzględniającej natężenie ruchu są rozliczane według stawki preferencyjnej dla tras. Więcej informacji o płatnościach w przypadku interfejsu Routes API. Więcej informacji znajdziesz w artykule Konfigurowanie jakości ścieżki wielopunktowej.
Więcej informacji o poliliniach:
Interaktywna aplikacja do kodowania linii łamanych umożliwia tworzenie zakodowanych linii łamanych w interfejsie lub dekodowanie linii łamanych w celu wyświetlenia ich na mapie. Za pomocą tej funkcji możesz na przykład zdekodować linię łamaną utworzoną za pomocą kodu podanego poniżej.
Przesyłanie podstawowej linii łamanej dla trasy, etapu lub kroku
Linia łamana jest reprezentowana przez obiekt Polyline (REST) lub Polyline (gRPC). W odpowiedzi możesz zwrócić linię łamaną na poziomie trasy, etapu i kroku.
Określ, który wielokąt ma zostać zwrócony, używając maski pola odpowiedzi:
Na poziomie trasy zwracaj w odpowiedzi ścieżkę wieloliniową, podając w polu maski odpowiedzi wartość
routes.polyline
.Na poziomie odcinka zwracaj w odpowiedzi ścieżkę wieloliniową dla każdego odcinka trasy, podając
routes.legs.polyline
.Na poziomie kroku zwracaj w odpowiedzi ścieżkę wieloliniową dla każdego kroku w trasie, uwzględniając
routes.legs.steps.polyline
.
Aby na przykład zwrócić ścieżkę wieloliniową dla całej trasy, dla każdego etapu oraz dla 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ą ścieżkę wielokąta dla trasy, dla każdego odcinka trasy i dla każdego kroku na odcinku:
{ "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 docelowy, zwrócona trasa zawiera tylko jeden odcinek. Dlatego linia łamana dla odcinka i dla trasy jest taka sama.
Jeśli do żądania dodasz punkt pośredni, zwrócona trasa będzie zawierać 2 odcinki:
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 zapytanie zwraca 2 odcinki, z których każdy ma niepowtarzalny wielokąt oraz wielokąt 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ść ścieżki wielokąta można opisać w tych terminach:
Precyzja punktów w postaci liczb zmiennoprzecinkowych
Punkty są określane jako wartości szerokości i długości geograficznej, które są reprezentowane w formacie zmiennoprzecinkowym o pojedynczej precyzji. Ta metoda sprawdza się w przypadku małych wartości (które można przedstawić dokładnie), ale dokładność maleje wraz ze wzrostem wartości z powodu błędów zaokrągleń w przypadku liczb zmiennoprzecinkowych.
W metodzie computeRoutes (REST) i ComputeRoutes jest to kontrolowane przez parametr
polylineEncoding
.Liczba punktów tworzących polilinię
Im więcej punktów, tym gładsza linia wielokąta (zwłaszcza w zakrętach).
W metodzie computeRoutes (REST) i ComputeRoutes jest to kontrolowane przez parametr
polylineQuality
.
Konfigurowanie typu kodowania linii złożonej
Aby kontrolować typ wielokąta, użyj opcji polylineEncoding
w żądaniu.
Właściwość polylineEncoding
określa, czy linia złożona zostanie zakodowana jako ENCODED_POLYLINE
(domyślnie), co oznacza, że zostanie użyty algorytm kodowania linii złożonej, czy GEO_JSON_LINESTRING
, co oznacza, że zostanie użyty format GeoJSON LineString.
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'
Konfigurowanie jakości linii złożonej
polylineQuality
określa jakość polilinii jako HIGH_QUALITY
lub OVERVIEW
(domyślnie). W przypadku OVERVIEW
linia złożona jest z małej liczby punktów i ma mniejsze opóźnienie żądania 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", ... }
Prośba o linie łamane uwzględniające natężenie ruchu
Wszystkie przykłady pokazane powyżej zwracają podstawowe wielokąty, czyli wielokąty bez informacji o ruchu. Możesz też poprosić o to, aby linia wielokąta zawierała informacje o ruchu drogowym na trasie i na poszczególnych odcinkach.
Wielokąty uwzględniające natężenie ruchu zawierają informacje o warunkach na drodze na trasie. Warunki na drogach są wyrażane w kategoriach prędkości (NORMAL
, SLOW
, TRAFFIC_JAM
) w przypadku danego przedziału odpowiedzi typu polilinia. Przedziały są definiowane przez indeksy punktów początkowych (włącznie) i końcowych (wyłącznie) ścieżki wielokąta.
Na przykład odpowiedź poniżej pokazuje NORMAL
ruch między punktami 2 i 4 łańcucha ścieżki:
{ "startPolylinePointIndex": 2, "endPolylinePointIndex": 4, "speed": "NORMAL" }
Aby przesłać żądanie obliczenia ścieżki wielokąta uwzględniającej natężenie ruchu, ustaw w żądaniu te właściwości:
Aby włączyć obliczenie ruchu, ustaw pole tablicy
extraComputations
naTRAFFIC_ON_POLYLINE
.Ustaw wartość
travelMode
naDRIVE
lubTWO_WHEELER
. Zapytania dotyczące innych trybów podróży zwracają błąd.W żądaniu podaj preferencję routingu
TRAFFIC_AWARE
lubTRAFFIC_AWARE_OPTIMAL
. Więcej informacji znajdziesz w artykule Konfigurowanie jakości i opóźnienia.Ustaw maskę pola odpowiedzi, która określa zwracanie właściwości odpowiedzi:
Na poziomie trasy zwracaj wszystkie informacje o podróży, podając w polu maski odpowiedzi wartość
routes.travelAdvisory
. Aby zwrócić tylko informacje o natężeniu ruchu, określ:routes.travelAdvisory.speedReadingIntervals
Na poziomie odcinka: w odpowiedzi zwracaj wszystkie informacje o podróży dotyczące każdego odcinka trasy, podając
routes.legs.travelAdvisory
. Aby zwrócić tylko informacje o natężeniu ruchu, określroutes.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ład odpowiedzi dla ścieżki poliliniowej uwzględniającej natężenie ruchu
W odpowiedzi dane o ruchu są zakodowane w wielokącie i znajdują się w polu travelAdvisory
obiektu typu RouteLegTravelAdvisory (każda odnoga) i obiektu 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 tabela RouteTravelAdvisory
, jak i tabela RouteLegTravelAdvisory
zawierają pole tablicy o nazwie speedReadingIntervals
, które zawiera informacje o prędkości w ruchu drogowym. Każdy obiekt w tablicy jest reprezentowany przez obiekt SpeedReadingInterval (REST) lub SpeedReadingInterval (gRPC).
Obiekt SpeedReadingInterval
zawiera odczyt prędkości dla przedziału trasy,
taki jak NORMAL
, SLOW
lub TRAFFIC_JAM
. Cały zbiór obiektów obejmuje całą wielokątną ścieżkę bez nakładania się. Punkt początkowy określonego przedziału czasowego jest taki sam jak punkt końcowy poprzedniego przedziału.
Każdy przedział jest opisany przez startPolylinePointIndex
,
endPolylinePointIndex
i odpowiadającą kategorię prędkości.
Zwróć uwagę, że brak indeksu początkowego w interwale odpowiada indeksowi 0 zgodnie z praktykami proto3.
Wartości startPolylinePointIndex
i endPolylinePointIndex
nie są zawsze kolejne. Na przykład:
{ "startPolylinePointIndex": 2, "endPolylinePointIndex": 4, "speed": "NORMAL" }
W tym przypadku warunki ruchu były takie same od indeksu 2 do indeksu 4.
Renderowanie linii złożonych uwzględniających natężenie ruchu za pomocą pakietu SDK Maps
Zalecamy wyświetlanie na mapie linii łamanych uwzględniających natężenie ruchu za pomocą różnych funkcji dostępnych w pakietach SDK Map Google, takich jak niestandardowe kolory, obrysy i wzory na odcinkach linii łamanej. Więcej informacji o używaniu linii złożonych znajdziesz w artykułach Funkcje linii złożonych na Androida i Funkcje linii złożonych na iOS.
Przykład renderowania linii łamanej
Użytkownicy pakietu Maps SDK mogą definiować niestandardową logikę mapowania między kategoriami prędkości a schematami renderowania linii złożonych. Na przykład można wyświetlić prędkość „NORMALNA” jako grubą niebieską linię na mapie, a prędkość „POCIECHA” jako grubą pomarańczową linię.
Poniższe fragmenty kodu dodają grubą niebieską polilinię z geodezyjnymi segmentami z Melbourne do Perth. Więcej informacji znajdziesz w artykule Dostosowywanie wyglądu (Android) i Dostosowywanie ścieżki wielokąta (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
Używanie zakodowanych linii łamanych z funkcją wyszukiwania na trasie
Użyj wyszukiwania tekstowego w interfejsie Places API, aby wyszukiwać miejsca na trasie obliczonej przez aplikację. Do żądania wyszukiwania tekstowego przekazujesz zakodowany poligon z wyprzedzeniem obliczonej trasy z interfejsu Routes API. Odpowiedź zawiera miejsca, które pasują do kryteriów wyszukiwania i znajdują się w pobliżu określonej trasy. Więcej informacji znajdziesz w artykule Wyszukiwanie wzdłuż trasy.
Aby na przykład znaleźć kawiarnie na trasie między miejscem wyjazdu a miejscem docelowym:
Node.js
const API_KEY = 'YOUR_API_KEY'; const routes_service = 'https://routes.googleapis.com/directions/v2:computeRoutes'; const textSearch_service = 'https://places.googleapis.com/v1/places:searchText';function init(){ const routes_request = { "origin":{ "address": "1600 Amphitheatre Parkway, Mountain View, CA" }, "destination":{ "address": "24 Willie Mays Plaza, San Francisco, CA 94107" }, "travelMode": "DRIVE" }; const textSearch_request = { "textQuery": "cafe", "searchAlongRouteParameters": { "polyline": { "encodedPolyline": "" } } }; fetchResources(routes_service,routes_request).then(routes => { textSearch_request.searchAlongRouteParameters.polyline.encodedPolyline = routes.routes[0].polyline.encodedPolyline; fetchResources(textSearch_service,textSearch_request).then(places => { console.log(places); }); }); } async function fetchResources(resource,reqBody){ const response = await fetch(resource, { method: 'POST', body: JSON.stringify(reqBody), headers: { 'Content-Type': 'application/json', 'X-Goog-Api-Key': API_KEY, 'X-Goog-FieldMask': '*' } }); const responseJSON = await response.json(); return responseJSON; } init();