Metoda computeRoutes (REST) i metoda ComputeRoutes (gRPC) zwracają w odpowiedzi trasę reprezentowaną przez linię łamaną. Te interfejsy API zwracają 2 rodzaje linii łamanych:
Podstawowa linia łamana (domyślna) reprezentuje trasę, ale nie zawiera informacji o ruchu. Żądania, które zwracają podstawową linię łamaną, są rozliczane według stawki Routes Basic. Więcej informacji o płatnościach za interfejs Routes API.
Łamana uwzględniająca natężenie ruchu zawiera informacje o warunkach na drodze na trasie. Warunki na drodze są wyrażane w kategoriach prędkości (
NORMAL,SLOW,TRAFFIC_JAM) obowiązujących na danym odcinku linii łamanej. Żądania linii łamanych uwzględniających natężenie ruchu są rozliczane według stawki Routes Preferred. Więcej informacji o płatnościach za interfejs Routes API Szczegółowe informacje znajdziesz w sekcji Konfigurowanie jakości linii łamanej.
Więcej informacji o łamanych znajdziesz w tych artykułach:
Interaktywne narzędzie do kodowania linii łamanych umożliwia tworzenie zakodowanych linii łamanych w interfejsie lub dekodowanie linii łamanych w celu wyświetlenia ich na mapie. Możesz na przykład użyć tego narzędzia do zdekodowania linii łamanej utworzonej za pomocą poniższego kodu.
Żądanie podstawowej linii łamanej dla trasy, etapu lub kroku
Linia łamana jest reprezentowana przez obiekt Polyline (REST) lub Polyline (gRPC). Możesz zwrócić linię łamaną w odpowiedzi na poziomie trasy, etapu i kroku.
Określ, którą linię łamaną chcesz zwrócić, używając maski pola odpowiedzi:
Na poziomie trasy zwróć linię łamaną w odpowiedzi, dodając
routes.polylinedo maski pola odpowiedzi.Na poziomie etapu – zwraca linię łamaną w odpowiedzi dla każdego etapu trasy, jeśli uwzględnisz
routes.legs.polyline.Na poziomie kroku – zwraca polilinię w odpowiedzi dla każdego kroku etapu, jeśli uwzględnisz
routes.legs.steps.polyline.
Aby na przykład zwrócić linię łamaną dla całej trasy, każdego etapu i każdego kroku na każdym etapie:
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 tę odpowiedź, która zawiera łamaną dla trasy, dla każdego odcinka trasy i dla każdego kroku odcinka:
{ "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 miejsce wyjazdu i miejsce docelowe, zwrócona trasa zawiera tylko 1 etap. Dlatego linia łamana etapu i trasy jest taka sama.
Jeśli do żądania dodasz punkt pośredni, zwrócona trasa będzie zawierać 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żdy z unikalną linią łamaną, oraz 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ć w następujący sposób:
Reprezentacja zmiennoprzecinkowa punktów
Punkty są określane jako wartości szerokości i długości geograficznej, które są reprezentowane w formacie reprezentacji zmiennoprzecinkowej o pojedynczej precyzji. Sprawdza się to w przypadku małych wartości (które można dokładnie przedstawić), ale precyzja maleje wraz ze wzrostem wartości z powodu błędów zaokrąglania reprezentacji zmiennoprzecinkowej.
W metodach computeRoutes (REST) i ComputeRoutes jest to kontrolowane przez
polylineEncoding.Liczba punktów, z których składa się linia łamana
Im więcej punktów, tym gładsza polilinia (zwłaszcza na zakrętach).
W metodach computeRoutes (REST) i ComputeRoutes jest to kontrolowane przez
polylineQuality.
Konfigurowanie typu kodowania linii łamanej
Aby kontrolować typ linii łamanej, użyj opcji żądania polylineEncoding. Właściwość polylineEncoding określa, czy linia łamana będzie zakodowana jako ENCODED_POLYLINE (domyślnie), co oznacza, że zostanie użyty format algorytmu zakodowanej linii łamanej, czy jako 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 łamanej
polylineQuality określa jakość linii łamanej jako HIGH_QUALITY lub OVERVIEW (domyślnie). W przypadku OVERVIEW łamana składa się z niewielkiej liczby punktów i ma mniejszy czas oczekiwania na żądanie niż w przypadku 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 natężenie ruchu
Wszystkie przykłady pokazane powyżej 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 na każdym jej odcinku.
Polilinie uwzględniające natężenie ruchu zawierają informacje o warunkach na drodze na trasie. Warunki na drodze są wyrażane w postaci kategorii prędkości (NORMAL, SLOW, TRAFFIC_JAM) dla danego interwału linii łamanej odpowiedzi.
Interwały są definiowane przez indeksy punktów początkowych (włącznie) i końcowych (wyłącznie) linii łamanej.
Na przykład ta odpowiedź pokazuje NORMAL ruch między punktami łamanej 2 i 4:
{ "startPolylinePointIndex": 2, "endPolylinePointIndex": 4, "speed": "NORMAL" }
Aby wysłać żądanie obliczenia linii łamanej uwzględniającej natężenie ruchu, ustaw w żądaniu te właściwości:
Aby włączyć obliczanie ruchu, ustaw pole tablicy
extraComputationsnaTRAFFIC_ON_POLYLINE.Ustaw wartość
travelModenaDRIVElubTWO_WHEELER. Żądania dotyczące innych środków transportu zwracają błąd.W żądaniu określ preferencję routingu
TRAFFIC_AWARElubTRAFFIC_AWARE_OPTIMAL. Więcej informacji znajdziesz w artykule o konfigurowaniu jakości i opóźnienia.Ustaw maskę pola odpowiedzi, która określa, że mają być zwracane właściwości odpowiedzi:
Na poziomie trasy zwróć wszystkie informacje o podróży w odpowiedzi, dodając
routes.travelAdvisorydo maski pola odpowiedzi. Aby zwrócić tylko informacje o ruchu, podajroutes.travelAdvisory.speedReadingIntervalsNa poziomie etapu – zwraca wszystkie informacje o podróży w odpowiedzi dla każdego etapu trasy, jeśli uwzględnisz
routes.legs.travelAdvisory. Aby zwrócić tylko informacje o ruchu, podajroutes.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ź dotycząca linii łamanej uwzględniającej natężenie ruchu
W odpowiedzi dane o ruchu są zakodowane w linii łamanej i zawarte w polu travelAdvisory typu RouteLegTravelAdvisory (każdy etap) i 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 zawiera 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 interwału jest taki sam jak punkt końcowy poprzedniego interwału.
Każdy interwał jest opisany przez startPolylinePointIndex, endPolylinePointIndex i odpowiednią 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ą kolejnymi liczbami. 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.
Renderowanie linii łamanych uwzględniających natężenie ruchu za pomocą pakietu Maps SDK
Zalecamy wyświetlanie na mapie linii łamanych uwzględniających natężenie ruchu za pomocą różnych funkcji oferowanych przez pakiety SDK Map Google, w tym spersonalizowanych kolorów, obrysów i wzorów na odcinkach linii łamanych. Więcej informacji o używaniu linii łamanych znajdziesz w sekcji Funkcje linii łamanej na Androidzie i Funkcje linii łamanej na iOS.
Przykładowe renderowanie linii łamanej
Użytkownicy pakietu Maps SDK mogą zdefiniować niestandardową logikę mapowania między kategoriami prędkości a schematami renderowania linii łamanych. Na przykład można zdecydować, że prędkość „NORMALNA” będzie wyświetlana na mapie jako gruba niebieska linia, a prędkość „WOLNA” jako gruba pomarańczowa linia.
Poniższe fragmenty kodu dodają grubą niebieską linię łamaną z segmentami geodezyjnymi z Melbourne do Perth. Więcej informacji znajdziesz w artykule Dostosowywanie wyglądu (na Androida) i Dostosowywanie linii łamanej (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
Używanie zakodowanych linii łamanych z funkcją wyszukiwania na trasie
Użyj funkcji wyszukiwania tekstu (nowej) w Places API (nowym), aby wyszukiwać na obliczonej trasie. Zakodowaną linię łamaną wstępnie obliczonej trasy przekazujesz z interfejsu Routes API Compute Routes do żądania wyszukiwania tekstowego (nowego). Odpowiedź zawiera miejsca, które pasują do kryteriów wyszukiwania i znajdują się w pobliżu określonej trasy. Szczegółowe informacje znajdziesz w artykule Wyszukiwanie na trasie.
Aby na przykład wyświetlić kawiarnie na trasie między miejscem początkowym a 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();