Metoda computeRoutes (REST) i metoda ComputeRoutes (gRPC) zwracają trasę reprezentowaną przez polilinię w ramach odpowiedzi. Te interfejsy API zwracają 2 typy polilinii:
Podstawowa linia łamana (domyślnie) – 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. Szczegółowe informacje 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ą tego narzędzia 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óre linie złożone mają być zwrócone, używając pola odpowiedzi maski:
Na poziomie trasy zwracaj w odpowiedzi ścieżkę wieloliniową, podając w polu maski odpowiedzi wartość
routes.polyline
.Na poziomie odcinka zwracaj w odpowiedzi wielolinię 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ź, która zawiera ś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 etapu i dla trasy jest taka sama.
Jeśli dodasz do żądania pośredni punkt orientacyjny, 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ść polilinii 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 jest linia wielosegmentowa (zwłaszcza na łukach).
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 wielokąta zostanie zakodowana jako ENCODED_POLYLINE
(wartość domyślna), co oznacza, że zostanie użyty algorytm kodowania linii wielokąta, 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ć, aby linia wielokąta zawierała informacje o ruchu drogowym na trasie i na każdym jej odcinku.
Wielokąty uwzględniające natężenie ruchu zawierają informacje o warunkach na drodze na całej trasie. Warunki na drogach są wyrażane w kategoriach prędkości (NORMAL
, SLOW
, TRAFFIC_JAM
) w przypadku danego przedziału w wieloboku odpowiedzi.
Interwał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
. W przypadku innych trybów podróży zwracany jest błąd.W żądaniu podaj preferencję routingu
TRAFFIC_AWARE
lubTRAFFIC_AWARE_OPTIMAL
. Więcej informacji znajdziesz w artykule Konfigurowanie jakości a opóźnienie.Ustaw maskę pola odpowiedzi, która określa zwracanie właściwości odpowiedzi:
Na poziomie trasy: zwracaj wszystkie informacje o podróży w odpowiedzi, uwzględniając
routes.travelAdvisory
w polu odpowiedzi. 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 ruchu. 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 zawsze są 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 korzystaniu z polilinii znajdziesz w artykułach Funkcje polilinii na Androida i Funkcje polilinii 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 artykułach Dostosowywanie wyglądu (w przypadku Androida) i Dostosowywanie linii złożonej (w przypadku 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 system. Do żądania wyszukiwania tekstu przekazujesz zakodowaną linię łamaną z wyprzedzeniem obliczonej trasy z interfejsu API Trasy. Odpowiedź zawiera miejsca, które spełniają kryteria 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 wylotu a celem podróży:
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();