El método computeRoutes (REST) y el método ComputeRoutes (gRPC) muestran la ruta representada por un polilinea como parte de la respuesta. Estas APIs muestran dos tipos de polilíneas:
Polilínea básica (predeterminada): Representa una ruta, pero sin información de tráfico incorporada en la polilínea. Las solicitudes que muestran una polilínea básica se facturan a la tarifa básica de rutas. Obtén más información sobre la facturación de la API de Routes.
Polilíneas con información sobre el tráfico: Contienen información sobre las condiciones de tráfico a lo largo de la ruta. Las condiciones de tráfico se expresan en términos de categorías de velocidad (
NORMAL
,SLOW
,TRAFFIC_JAM
) aplicables en un intervalo determinado del polilinea. Las solicitudes de polilíneas que tienen en cuenta el tráfico se facturan a la tarifa de rutas preferidas. Obtén más información sobre la facturación de la API de Routes. Para obtener más información, consulta Cómo configurar la calidad de los polilineas.
Para obtener más información sobre los polilíneas, consulta los siguientes vínculos:
La utilidad codificadora de polilínea interactiva te permite crear polilíneas codificadas en una IU o decodificar polilíneas para mostrarlas en un mapa. Por ejemplo, usa esta utilidad para decodificar una polilínea creada por el siguiente código.
Solicita una polilínea básica para una ruta, un tramo o un paso
Una polilínea se representa con un objeto Polyline (REST) o Polyline (gRPC). Puedes mostrar una polilínea en la respuesta a nivel de la ruta, el tramo y el paso.
Especifica qué polilínea mostrar con la máscara de campo de respuesta:
A nivel de la ruta, incluye
routes.polyline
en la máscara del campo de respuesta para mostrar un polilinea en la respuesta.A nivel de la etapa, incluye
routes.legs.polyline
para mostrar un polilinea en la respuesta de cada etapa de la ruta.A nivel del paso, incluye
routes.legs.steps.polyline
para mostrar un polilinea en la respuesta de cada paso de la etapa.
Por ejemplo, para mostrar una polilínea para toda la ruta, para cada tramo y para cada paso de cada tramo, haz lo siguiente:
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'
Esta solicitud muestra la siguiente respuesta, que incluye el polilinea de la ruta, para cada tramo de la ruta y para cada paso del tramo:
{ "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_@@_@?" } } ] }
Como esta solicitud solo contiene un origen y un destino, la ruta que se muestra solo contiene un tramo. Por lo tanto, la polilínea de la etapa y la de la ruta son las mismas.
Si agregas un punto de referencia intermedio a la solicitud, la ruta que se muestra contiene dos tramos:
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'
Esta solicitud muestra dos tramos, cada uno con un polilinea único, y un polilinea para toda la ruta:
{ "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" } } ] }
Calidad de la polilínea
La calidad de un polilinea se puede describir en los siguientes términos:
La precisión de punto flotante de los puntos
Los puntos se especifican como valores de latitud y longitud, que se representan en formato de punto flotante de precisión simple. Esto funciona bien para valores pequeños (que se pueden representar con precisión), pero la precisión disminuye a medida que aumentan los valores debido a los errores de redondeo de punto flotante.
En el método computeRoutes (REST) y ComputeRoutes, esto se controla con
polylineEncoding
.La cantidad de puntos que conforman la polilínea
Cuantos más puntos haya, más suave será la polilínea (especialmente en las curvas).
En el método computeRoutes (REST) y ComputeRoutes, esto se controla con
polylineQuality
.
Configura el tipo de codificación de polilínea
Usa la opción de solicitud polylineEncoding
para controlar el tipo de polilínea.
La propiedad polylineEncoding
controla si la polilínea se codificará como ENCODED_POLYLINE
(predeterminada), lo que significa que se usará el Formato del algoritmo de polilínea codificada, o GEO_JSON_LINESTRING
, lo que significa que se usará el Formato de LineString de GeoJSON.
Por ejemplo, en el cuerpo de la solicitud:
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'
Cómo configurar la calidad de la polilínea
polylineQuality
especifica la calidad del polilínea como HIGH_QUALITY
o OVERVIEW
(predeterminada). Con OVERVIEW
, la polilínea se compone con una pequeña cantidad de puntos y tiene una latencia de solicitud más baja que HIGH_QUALITY
.
Por ejemplo, en el cuerpo de la solicitud:
{ "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", ... }
Cómo solicitar una polilínea que tenga en cuenta el tráfico
Los ejemplos que se muestran anteriormente muestran polilíneas básicas, es decir, sin información de tráfico. Además, también puedes solicitar que el polilinea contenga información de tráfico para la ruta y para cada tramo de la ruta.
Las polilíneas con información sobre el tráfico contienen información sobre las condiciones del tráfico a lo largo de la ruta. Las condiciones de tráfico se expresan en términos de categorías de velocidad (NORMAL
, SLOW
, TRAFFIC_JAM
) para un intervalo determinado del polilínea de la respuesta. Los intervalos se definen por los índices de sus puntos de polilínea inicial (inclusivo) y final (exclusivo).
Por ejemplo, la siguiente respuesta muestra el tráfico de NORMAL
entre los puntos 2 y 4 del polilinea:
{ "startPolylinePointIndex": 2, "endPolylinePointIndex": 4, "speed": "NORMAL" }
Para realizar una solicitud para calcular un polilínea que tenga en cuenta el tráfico, establece las siguientes propiedades en la solicitud:
Establece el campo del array
extraComputations
enTRAFFIC_ON_POLYLINE
para habilitar el cálculo del tráfico.Configura
travelMode
comoDRIVE
oTWO_WHEELER
. Las solicitudes de cualquier otro modo de viaje muestran un error.Especifica la preferencia de enrutamiento
TRAFFIC_AWARE
oTRAFFIC_AWARE_OPTIMAL
en la solicitud. Para obtener más información, consulta Configura la calidad en función de la latencia.Establece una máscara de campo de respuesta que especifique que se devuelvan las propiedades de respuesta:
A nivel de la ruta, muestra toda la información de viaje en la respuesta. Para ello, incluye
routes.travelAdvisory
en la máscara de campo de respuesta. Para mostrar solo la información de tráfico, especificaroutes.travelAdvisory.speedReadingIntervals
.A nivel del tramo, incluye
routes.legs.travelAdvisory
para mostrar toda la información de viaje en la respuesta de cada tramo de la ruta. Para mostrar solo la información del tráfico, especificaroutes.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'
Ejemplo de respuesta para una polilínea que tiene en cuenta el tráfico
En la respuesta, los datos de tráfico se codifican en la polilínea y se contienen en el campo travelAdvisory
, del tipo de objeto RouteLegTravelAdvisory (cada tramo) y RouteTravelAdvisory (ruta).
Por ejemplo:
{ "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" } ] } } ] }
Tanto RouteTravelAdvisory
como RouteLegTravelAdvisory
incluyen un campo de array llamado speedReadingIntervals
que contiene información sobre la velocidad del tráfico. Cada objeto del array está representado por un objeto SpeedReadingInterval (REST) o SpeedReadingInterval (gRPC).
Un objeto SpeedReadingInterval
incluye la lectura de velocidad para un intervalo de ruta, como NORMAL
, SLOW
o TRAFFIC_JAM
. Todo el array de objetos cubre toda la polilínea de la ruta sin superponerse. El punto de inicio de un intervalo especificado es el mismo que el punto final del intervalo anterior.
Cada intervalo se describe con su startPolylinePointIndex
, endPolylinePointIndex
y la categoría de velocidad correspondiente.
Observa que la falta de índice de inicio dentro del intervalo corresponde al índice 0 según las prácticas de proto3.
Los valores startPolylinePointIndex
y endPolylinePointIndex
no siempre son consecutivos. Por ejemplo:
{ "startPolylinePointIndex": 2, "endPolylinePointIndex": 4, "speed": "NORMAL" }
En este caso, las condiciones de tráfico fueron las mismas del índice 2 al índice 4.
Renderiza polilíneas que tengan en cuenta el tráfico con el SDK de Maps
Te recomendamos que muestres polilíneas con información sobre el tráfico en el mapa con las diversas funciones que ofrecen los SDK de Google Maps, como colores, trazos y patrones personalizados a lo largo de los tramos de la polilínea. Para obtener más detalles sobre el uso de polilíneas, consulta Componentes de polilínea para Android y Componentes de polilínea para iOS.
Ejemplo de renderización de polilínea
Los usuarios del SDK de Maps tienen la oportunidad de definir una lógica de asignación personalizada entre las categorías de velocidad y los esquemas de renderización de polilíneas. Por ejemplo, se podría decidir mostrar la velocidad "NORMAL" como una línea azul gruesa en el mapa, mientras que la velocidad "LENTA" podría mostrarse como una línea naranja gruesa.
En los siguientes fragmentos, se agrega una polilínea azul gruesa con segmentos geodésicos desde Melbourne hasta Perth. Para obtener más información, consulta Cómo personalizar la apariencia (para Android) y Cómo personalizar el polilinea (para 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
Usa polilíneas codificadas con la Búsqueda a lo largo de la ruta
Usa Text Search de la API de Places para realizar búsquedas a lo largo de una ruta calculada. Pasas el polilínea codificado de una ruta calculada previamente de la API de Routes a la solicitud de Búsqueda de texto. Luego, la respuesta contiene lugares que coinciden con los criterios de búsqueda y que también se encuentran cerca de la ruta especificada. Para obtener más información, consulta Cómo buscar a lo largo de una ruta.
Por ejemplo, para mostrar cafeterías a lo largo de la ruta entre el origen y el destino, escribe lo siguiente:
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();