Metode computeRoutes (REST) dan metode ComputeRoutes (gRPC) menampilkan rute yang direpresentasikan oleh polyline sebagai bagian dari respons. API ini menampilkan dua jenis polyline:
Polyline dasar (default), merepresentasikan rute, tetapi tanpa informasi lalu lintas yang disematkan dalam polyline. Permintaan yang menampilkan polyline dasar ditagih dengan tarif Routes Basic. Pelajari lebih lanjut penagihan untuk Routes API.
Polyline yang mengetahui lalu lintas, berisi informasi tentang kondisi lalu lintas di sepanjang rute. Kondisi lalu lintas dinyatakan dalam kategori kecepatan (
NORMAL,SLOW,TRAFFIC_JAM) yang berlaku pada interval polyline tertentu. Permintaan polyline yang mengetahui lalu lintas ditagih dengan tarif Routes Preferred. Pelajari lebih lanjut penagihan untuk Routes API. Untuk mengetahui detailnya, lihat Mengonfigurasi kualitas polyline
Untuk mengetahui informasi selengkapnya tentang polyline, lihat:
Utilitas Encoder Polyline Interaktif memungkinkan Anda membuat polyline yang dienkodekan di UI atau mendekodekan polyline untuk ditampilkan di peta. Misalnya, gunakan utilitas ini untuk mendekodekan polyline yang dibuat oleh kode di bawah.
Meminta polyline dasar untuk rute, segmen, atau langkah
Polyline direpresentasikan oleh objek Polyline (REST) atau Polyline (gRPC). Anda dapat menampilkan polyline dalam respons di tingkat rute, segmen, dan langkah.
Tentukan polyline yang akan ditampilkan menggunakan mask kolom respons :
Di tingkat rute, tampilkan polyline dalam respons dengan menyertakan
routes.polylinedi mask kolom respons.Di tingkat segmen, tampilkan polyline dalam respons untuk setiap segmen rute dengan menyertakan
routes.legs.polyline.Di tingkat langkah, tampilkan polyline dalam respons untuk setiap langkah segmen dengan menyertakan
routes.legs.steps.polyline.
Misalnya, untuk menampilkan polyline untuk seluruh rute, untuk setiap segmen, dan untuk setiap langkah dari setiap segmen:
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'
Permintaan ini menampilkan respons berikut yang menyertakan polyline untuk rute, untuk setiap segmen rute, dan untuk setiap langkah segmen:
{ "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_@@_@?" } } ] }
Karena permintaan ini hanya berisi tempat asal dan tujuan, rute yang ditampilkan hanya berisi satu segmen. Oleh karena itu, polyline untuk segmen dan untuk rute sama.
Jika Anda menambahkan titik jalan perantara ke permintaan, rute yang ditampilkan akan berisi dua segmen:
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'
Permintaan ini menampilkan dua segmen, masing-masing dengan polyline unik, dan polyline untuk seluruh rute:
{ "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" } } ] }
Kualitas polyline
Kualitas polyline dapat dijelaskan dalam istilah berikut:
Presisi floating point dari titik
Titik ditentukan sebagai nilai garis lintang dan garis bujur, yang direpresentasikan dalam format floating point presisi tunggal. Hal ini berfungsi dengan baik untuk nilai kecil (yang dapat direpresentasikan secara akurat), tetapi presisi akan menurun seiring dengan peningkatan nilai karena error pembulatan floating point.
Dalam computeRoutes (REST) dan ComputeRoutes, hal ini dikontrol oleh
polylineEncoding.Jumlah titik yang membentuk polyline
Semakin banyak titik, semakin halus polyline (terutama dalam kurva).
Dalam computeRoutes (REST) dan ComputeRoutes, hal ini dikontrol oleh
polylineQuality.
Mengonfigurasi jenis encoding polyline
Gunakan opsi permintaan polylineEncoding untuk mengontrol jenis polyline. Properti
polylineEncoding mengontrol apakah polyline akan dienkodekan sebagai
ENCODED_POLYLINE (default), yang berarti Format Algoritma Polyline yang Dienkodekan akan digunakan, atau
GEO_JSON_LINESTRING, yang berarti format GeoJSON LineString akan digunakan.
Misalnya, di isi permintaan:
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'
Mengonfigurasi kualitas Polyline
polylineQuality menentukan kualitas polyline sebagai HIGH_QUALITY atau OVERVIEW (default). Dengan OVERVIEW, polyline disusun menggunakan sejumlah kecil titik dan memiliki latensi permintaan yang lebih rendah daripada HIGH_QUALITY.
Misalnya, di isi permintaan:
{ "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", ... }
Meminta polyline yang mengetahui lalu lintas
Contoh yang ditampilkan di atas semuanya menampilkan polyline dasar, yang berarti polyline tanpa informasi lalu lintas. Selain itu, Anda juga dapat meminta agar polyline berisi informasi lalu lintas untuk rute dan untuk setiap segmen rute.
Polyline yang mengetahui lalu lintas berisi informasi tentang kondisi lalu lintas di sepanjang rute. Kondisi lalu lintas dinyatakan dalam kategori kecepatan (NORMAL, SLOW, TRAFFIC_JAM) untuk interval polyline respons tertentu.
Interval ditentukan oleh indeks titik polyline awal (inklusif) dan akhir (eksklusif).
Misalnya, respons berikut menunjukkan lalu lintas NORMAL antara titik polyline 2 dan 4:
{ "startPolylinePointIndex": 2, "endPolylinePointIndex": 4, "speed": "NORMAL" }
Untuk membuat permintaan untuk menghitung polyline yang mengetahui lalu lintas, tetapkan properti berikut dalam permintaan:
Tetapkan kolom array
extraComputationskeTRAFFIC_ON_POLYLINEuntuk mengaktifkan perhitungan lalu lintas.Tetapkan
travelModekeDRIVEatauTWO_WHEELER. Permintaan untuk mode perjalanan lainnya akan menampilkan error.Tentukan preferensi perutean
TRAFFIC_AWAREatauTRAFFIC_AWARE_OPTIMALdalam permintaan. Untuk mengetahui informasi selengkapnya, lihat Mengonfigurasi kualitas versus latensi.Tetapkan mask kolom respons yang menentukan untuk menampilkan properti respons:
Di tingkat rute, tampilkan semua informasi perjalanan dalam respons dengan menyertakan
routes.travelAdvisorydi mask kolom respons. Untuk hanya menampilkan informasi lalu lintas, tentukanroutes.travelAdvisory.speedReadingIntervalsDi tingkat segmen, tampilkan semua informasi perjalanan dalam respons untuk setiap segmen rute dengan menyertakan
routes.legs.travelAdvisory. Untuk hanya menampilkan informasi lalu lintas, tentukanroutes.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'Contoh respons untuk polyline yang mengetahui lalu lintas
Dalam respons, data lalu lintas dienkodekan dalam polyline dan terdapat di kolom
travelAdvisory dengan jenis
RouteLegTravelAdvisory
objek (setiap segmen) dan
RouteTravelAdvisory objek (rute).
Contoh:
{
"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"
}
]
}
}
]
}
RouteTravelAdvisory dan RouteLegTravelAdvisory menyertakan kolom array yang disebut speedReadingIntervals yang berisi informasi kecepatan lalu lintas. Setiap
objek dalam array direpresentasikan oleh objek
SpeedReadingInterval (REST) atau
SpeedReadingInterval
(gRPC).
Objek SpeedReadingInterval menyertakan pembacaan kecepatan untuk interval rute, seperti NORMAL, SLOW, atau TRAFFIC_JAM. Seluruh array objek mencakup seluruh polyline rute tanpa tumpang-tindih. Titik awal interval yang ditentukan sama dengan titik akhir interval sebelumnya.
Setiap interval dijelaskan oleh startPolylinePointIndex, endPolylinePointIndex, dan kategori kecepatan yang sesuai. Perhatikan bahwa tidak adanya indeks awal dalam interval sesuai dengan indeks 0 sesuai dengan praktik proto3.
Nilai startPolylinePointIndex dan endPolylinePointIndex tidak selalu berurutan. Contoh:
{
"startPolylinePointIndex": 2,
"endPolylinePointIndex": 4,
"speed": "NORMAL"
}
Dalam hal ini, kondisi lalu lintas sama dari indeks 2 hingga indeks 4.
Merender polyline yang mengetahui lalu lintas dengan Maps SDK
Sebaiknya tampilkan polyline yang mengetahui lalu lintas di peta menggunakan berbagai fitur yang ditawarkan oleh Google Maps SDK, termasuk pewarnaan kustom, stroke, dan pola di sepanjang rentang polyline. Untuk mengetahui detail selengkapnya tentang penggunaan polyline, lihat Fitur Polyline untuk Android dan Fitur Polyline untuk iOS.
Contoh rendering Polyline
Pengguna Maps SDK memiliki peluang untuk menentukan logika pemetaan yang disesuaikan antara kategori kecepatan dan skema rendering polyline. Sebagai contoh, seseorang dapat memutuskan untuk menampilkan kecepatan "NORMAL" sebagai garis biru tebal di peta, sedangkan kecepatan "SLOW" dapat ditampilkan sebagai garis oranye tebal, misalnya.
Cuplikan berikut menambahkan polyline biru tebal dengan segmen geodesi dari Melbourne ke Perth. Untuk mengetahui informasi selengkapnya, lihat Menyesuaikan tampilan (untuk Android) dan Menyesuaikan Polyline (untuk 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
Menggunakan polyline yang dienkodekan dengan Search Along Route
Gunakan Places API Text Search untuk menelusuri sepanjang rute yang dihitung. Anda meneruskan polyline yang dienkodekan dari rute yang telah dihitung sebelumnya dari Routes API Compute Routes ke permintaan Text Search. Respons kemudian berisi tempat yang cocok dengan kriteria penelusuran dan juga terletak di dekat rute yang ditentukan. Untuk mengetahui detailnya, lihat menelusuri sepanjang rute.
Misalnya, untuk menampilkan kafe di sepanjang rute antara tempat asal dan tujuan:
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();