Phương thức computeRoutes (REST) và phương thức ComputeRoutes (gRPC) đều trả về tuyến đường được biểu thị bằng một đường đa tuyến trong phản hồi. Các API này trả về 2 loại đường nhiều đoạn:
Đường nhiều đoạn cơ bản (mặc định), biểu thị một tuyến đường nhưng không có thông tin giao thông được nhúng trong đường nhiều đoạn. Các yêu cầu trả về một đường nhiều đoạn cơ bản sẽ được tính phí theo mức giá của Routes Basic. Tìm hiểu thêm về việc thanh toán cho Routes API.
Đường nhiều đoạn có thông tin giao thông, chứa thông tin về tình trạng giao thông dọc theo tuyến đường. Tình trạng giao thông được thể hiện bằng các danh mục tốc độ (
NORMAL
,SLOW
,TRAFFIC_JAM
) áp dụng cho một khoảng thời gian nhất định của đường nhiều đoạn. Các yêu cầu về đường nhiều đoạn có nhận biết lưu lượng truy cập sẽ được tính phí theo mức giá Đường đi ưu tiên. Tìm hiểu thêm về cách thanh toán cho Routes API. Để biết thông tin chi tiết, hãy xem phần Định cấu hình chất lượng đường nhiều đoạn
Để biết thêm thông tin về đường nhiều đoạn, hãy xem:
Tiện ích mã hoá đường nhiều đoạn tương tác cho phép bạn tạo đường nhiều đoạn được mã hoá trong giao diện người dùng hoặc giải mã đường nhiều đoạn để hiển thị trên bản đồ. Ví dụ: hãy dùng tiện ích này để giải mã một đường nhiều đoạn do mã bên dưới tạo.
Yêu cầu một đường nhiều đoạn cơ bản cho một tuyến đường, đoạn đường hoặc bước
Đường nhiều đoạn được biểu thị bằng đối tượng Polyline (REST) hoặc Polyline (gRPC). Bạn có thể trả về một đường nhiều đường trong phản hồi ở cấp độ tuyến đường, chặng và bước.
Chỉ định đường nhiều đoạn cần trả về bằng cách sử dụng mặt nạ trường phản hồi:
Ở cấp tuyến đường, hãy trả về một đường nhiều đoạn trong phản hồi bằng cách thêm
routes.polyline
vào mặt nạ trường phản hồi.Ở cấp chặng, hãy trả về một đường nhiều đoạn trong phản hồi cho từng chặng của tuyến đường bằng cách thêm
routes.legs.polyline
.Ở cấp bước, hãy trả về một đường nhiều đoạn trong phản hồi cho từng bước của chặng bằng cách thêm
routes.legs.steps.polyline
.
Ví dụ: để trả về một đường nhiều đoạn cho toàn bộ tuyến đường, cho từng đoạn và cho từng bước của mỗi đoạn:
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'
Yêu cầu này trả về phản hồi sau đây, bao gồm đường nhiều đường cho tuyến đường, cho từng đoạn của tuyến đường và cho từng bước của đoạn đường:
{ "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_@@_@?" } } ] }
Vì yêu cầu này chỉ chứa điểm xuất phát và điểm đến, nên tuyến đường được trả về chỉ chứa một chặng. Do đó, đường nhiều đường cho chặng và cho tuyến đường là như nhau.
Nếu bạn thêm một điểm tham chiếu trung gian vào yêu cầu, thì tuyến đường được trả về sẽ chứa 2 chặng:
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'
Yêu cầu này trả về 2 chặng, mỗi chặng có một đường nhiều đường riêng biệt và một đường nhiều đường cho toàn bộ tuyến đường:
{ "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" } } ] }
Chất lượng đường nhiều đoạn
Bạn có thể mô tả chất lượng của một đường nhiều đoạn bằng các thuật ngữ sau:
Độ chính xác của dấu phẩy động của các điểm
Các điểm được chỉ định dưới dạng giá trị vĩ độ và kinh độ, được biểu thị ở định dạng dấu phẩy động có độ chính xác đơn. Điều này hoạt động tốt đối với các giá trị nhỏ (có thể biểu thị chính xác), nhưng độ chính xác sẽ giảm khi giá trị tăng do lỗi làm tròn số có dấu phẩy động.
Trong phương thức computeRoutes (REST) và ComputeRoutes, việc này được kiểm soát bằng
polylineEncoding
.Số lượng điểm tạo nên đường nhiều đoạn
Đường càng có nhiều điểm thì càng mượt (đặc biệt là ở các đường cong).
Trong phương thức computeRoutes (REST) và ComputeRoutes, việc này được kiểm soát bằng
polylineQuality
.
Định cấu hình loại mã hoá đường nhiều đường
Sử dụng lựa chọn yêu cầu polylineEncoding
để kiểm soát loại đường nhiều đoạn. Thuộc tính polylineEncoding
kiểm soát việc đường nhiều đoạn sẽ được mã hoá dưới dạng ENCODED_POLYLINE
(mặc định), tức là Định dạng thuật toán đường nhiều đoạn được mã hoá sẽ được dùng, hoặc GEO_JSON_LINESTRING
, tức là Định dạng GeoJSON LineString sẽ được dùng.
Ví dụ: trong nội dung yêu cầu:
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'
Định cấu hình chất lượng của đường nhiều đường
polylineQuality
chỉ định chất lượng của đường nhiều đoạn là HIGH_QUALITY
hoặc OVERVIEW
(mặc định). Với OVERVIEW
, đường nhiều đoạn được tạo thành từ một số ít điểm và có độ trễ yêu cầu thấp hơn HIGH_QUALITY
.
Ví dụ: trong nội dung yêu cầu:
{ "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", ... }
Yêu cầu một đường nhiều đường có nhận biết lưu lượng truy cập
Tất cả các ví dụ nêu trên đều trả về các đường nhiều đoạn cơ bản, tức là đường nhiều đoạn không có thông tin giao thông. Ngoài ra, bạn cũng có thể yêu cầu đường đa tuyến chứa thông tin giao thông cho tuyến đường và cho từng đoạn của tuyến đường.
Đường nhiều đoạn có nhận biết tình trạng giao thông chứa thông tin về tình trạng giao thông dọc theo tuyến đường. Tình trạng giao thông được thể hiện bằng các danh mục tốc độ (NORMAL
, SLOW
, TRAFFIC_JAM
) cho một khoảng thời gian nhất định của đường nhiều đoạn trong phản hồi.
Các khoảng được xác định bằng chỉ mục của các điểm bắt đầu (bao gồm) và kết thúc (không bao gồm) của đường nhiều đường.
Ví dụ: phản hồi sau đây cho thấy lưu lượng truy cập NORMAL
giữa các điểm đường đa tuyến 2 và 4:
{ "startPolylinePointIndex": 2, "endPolylinePointIndex": 4, "speed": "NORMAL" }
Để đưa ra yêu cầu tính toán một đường nhiều đoạn có tính đến tình trạng giao thông, hãy đặt các thuộc tính sau trong yêu cầu:
Đặt trường mảng
extraComputations
thànhTRAFFIC_ON_POLYLINE
để bật tính năng tính toán lưu lượng truy cập.Đặt
travelMode
thànhDRIVE
hoặcTWO_WHEELER
. Yêu cầu về bất kỳ phương thức di chuyển nào khác đều trả về lỗi.Chỉ định lựa chọn ưu tiên về định tuyến
TRAFFIC_AWARE
hoặcTRAFFIC_AWARE_OPTIMAL
trong yêu cầu. Để biết thêm thông tin, hãy xem phần Định cấu hình chất lượng so với độ trễ.Đặt một mặt nạ trường phản hồi chỉ định trả về các thuộc tính phản hồi:
Ở cấp tuyến đường, hãy trả về tất cả thông tin đi lại trong phản hồi bằng cách thêm
routes.travelAdvisory
vào mặt nạ trường phản hồi. Để chỉ trả về thông tin giao thông, hãy chỉ địnhroutes.travelAdvisory.speedReadingIntervals
Ở cấp chặng, hãy trả về tất cả thông tin du lịch trong phản hồi cho từng chặng của tuyến đường bằng cách thêm
routes.legs.travelAdvisory
. Để chỉ trả về thông tin giao thông, hãy chỉ địnhroutes.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'
Ví dụ về phản hồi cho một đường nhiều đoạn có nhận biết lưu lượng truy cập
Trong phản hồi, dữ liệu giao thông được mã hoá trong đường nhiều đường và nằm trong trường travelAdvisory
, thuộc loại đối tượng RouteLegTravelAdvisory (mỗi chặng) và đối tượng RouteTravelAdvisory (tuyến đường).
Ví dụ:
{ "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" } ] } } ] }
Cả RouteTravelAdvisory
và RouteLegTravelAdvisory
đều có một trường mảng có tên là speedReadingIntervals
chứa thông tin về tốc độ giao thông. Mỗi đối tượng trong mảng được biểu thị bằng một đối tượng SpeedReadingInterval (REST) hoặc SpeedReadingInterval (gRPC).
Đối tượng SpeedReadingInterval
bao gồm tính năng đọc nhanh cho một khoảng thời gian của tuyến đường, chẳng hạn như NORMAL
, SLOW
hoặc TRAFFIC_JAM
. Toàn bộ mảng đối tượng bao phủ toàn bộ đường nhiều đường của tuyến đường mà không bị trùng lặp. Điểm bắt đầu của một khoảng thời gian được chỉ định giống với điểm cuối của khoảng thời gian trước đó.
Mỗi khoảng thời gian được mô tả bằng startPolylinePointIndex
, endPolylinePointIndex
và danh mục tốc độ tương ứng. Xin lưu ý rằng việc thiếu chỉ mục bắt đầu trong khoảng thời gian tương ứng với chỉ mục 0 theo các phương pháp proto3.
Giá trị startPolylinePointIndex
và endPolylinePointIndex
không phải lúc nào cũng liên tiếp. Ví dụ:
{ "startPolylinePointIndex": 2, "endPolylinePointIndex": 4, "speed": "NORMAL" }
Trong trường hợp này, điều kiện giao thông từ chỉ mục 2 đến chỉ mục 4 là như nhau.
Kết xuất nhiều đường thẳng có tính năng nhận biết lưu lượng truy cập bằng Maps SDK
Bạn nên hiển thị các đường nhiều đoạn có thông tin về lưu lượng truy cập trên bản đồ bằng cách sử dụng nhiều tính năng do Google Maps SDK cung cấp, bao gồm cả màu sắc, nét vẽ và mẫu tuỳ chỉnh dọc theo các đoạn đường nhiều đoạn. Để biết thêm thông tin chi tiết về cách sử dụng đường nhiều đoạn, hãy xem Các tính năng đường nhiều đoạn cho Android và Các tính năng đường nhiều đoạn cho iOS.
Ví dụ về kết xuất nhiều đường
Người dùng Maps SDK có thể xác định logic ánh xạ tuỳ chỉnh giữa các danh mục tốc độ và các lược đồ kết xuất đường nhiều đoạn. Ví dụ: bạn có thể quyết định hiển thị tốc độ "BÌNH THƯỜNG" dưới dạng một đường màu xanh dương dày trên bản đồ, trong khi tốc độ "CHẬM" có thể hiển thị dưới dạng một đường màu cam dày, chẳng hạn.
Các đoạn mã sau đây sẽ thêm một đường nhiều đoạn màu xanh dương đậm có các đoạn đường trắc địa từ Melbourne đến Perth. Để biết thêm thông tin, hãy xem phần Tuỳ chỉnh giao diện (đối với Android) và Tuỳ chỉnh Polyline (đối với 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
Sử dụng nhiều đường kẻ được mã hoá với tính năng Tìm dọc tuyến đường
Sử dụng tính năng Tìm kiếm bằng văn bản của Places API để tìm kiếm dọc theo một tuyến đường đã tính toán. Bạn truyền đường nhiều đoạn được mã hoá của một tuyến đường đã tính toán trước từ Routes API Compute Routes đến yêu cầu Tìm kiếm văn bản. Sau đó, phản hồi sẽ chứa những địa điểm phù hợp với tiêu chí tìm kiếm và cũng nằm gần tuyến đường đã chỉ định. Để biết thông tin chi tiết, hãy xem phần tìm kiếm dọc theo một tuyến đường.
Ví dụ: để trả về các quán cà phê dọc theo tuyến đường giữa điểm khởi hành và điểm đến:
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();