Los métodos computeRoutes (REST) y el ComputeRoutes método (gRPC) muestran la ruta representada por una polilínea 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 con la tarifa básica de Routes. Obtén más información sobre la facturación de la API de Routes.
Polilínea con información sobre el tráfico, contiene 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 de la polilínea. Las solicitudes de polilíneas con información sobre el tráfico se facturan con la tarifa preferida de Routes. Obtén más información sobre la facturación de la API de Routes. Para obtener más detalles, consulta Configura la calidad de la polilínea.
Para obtener más información sobre las polilíneas, consulta lo siguiente:
La utilidad codificadora de polilínea interactiva te permite crear polilíneas codificadas en una IU o decodificarlas para mostrarlas en un mapa. Por ejemplo, usa esta utilidad para decodificar una polilínea creada con el siguiente código.
Solicita una polilínea básica para una ruta, un segmento 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 ruta, segmento y paso.
Para especificar qué polilínea mostrar, usa la máscara de campo de respuesta:
A nivel de la ruta, muestra una polilínea en la respuesta incluyendo
routes.polylineen la máscara de campo de respuesta.A nivel del segmento, muestra una polilínea en la respuesta para cada segmento de la ruta incluyendo
routes.legs.polyline.A nivel del paso, muestra una polilínea en la respuesta para cada paso de la etapa incluyendo
routes.legs.steps.polyline.
Por ejemplo, para mostrar una polilínea para toda la ruta, para cada segmento y para cada paso de cada segmento, 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 la polilínea de la ruta, de cada segmento de la ruta y de cada paso del segmento:
{ "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 segmento. Por lo tanto, la polilínea del segmento 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 segmentos:
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 segmentos, cada uno con una polilínea única, y una polilínea 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 una polilínea se puede describir de las siguientes maneras:
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 computeRoutes método (REST) y ComputeRoutes, esto se controla con
polylineEncoding.La cantidad de puntos que componen la polilínea
Cuantos más puntos haya, más suave será la polilínea (especialmente en las curvas).
En computeRoutes método (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 (predeterminado), 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
GeoJSON LineString.
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'
Configura la calidad de la polilínea
polylineQuality especifica la calidad de la polilínea como HIGH_QUALITY o OVERVIEW (predeterminado). 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", ... }
Solicita una polilínea con información sobre el tráfico
En los ejemplos que se muestran arriba, se muestran polilíneas básicas, es decir, polilíneas sin información de tráfico. Además, también puedes solicitar que la polilínea contenga información de tráfico para la ruta y para cada segmento de la ruta.
Las 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) para un intervalo determinado de la polilínea de respuesta.
Los intervalos se definen por los índices de sus puntos de polilínea iniciales (inclusivos) y finales (exclusivos).
Por ejemplo, la siguiente respuesta muestra el tráfico NORMAL entre los puntos 2 y 4 de la polilínea:
{ "startPolylinePointIndex": 2, "endPolylinePointIndex": 4, "speed": "NORMAL" }
Para realizar una solicitud para calcular una polilínea con información sobre el tráfico, establece las siguientes propiedades en la solicitud:
Establece el campo de array
extraComputationsenTRAFFIC_ON_POLYLINEpara habilitar el cálculo del tráfico.Establece
travelModeenDRIVEoTWO_WHEELER. Las solicitudes de cualquier otro modo de viaje muestran un error.Especifica la preferencia de enrutamiento
TRAFFIC_AWAREoTRAFFIC_AWARE_OPTIMALen la solicitud. Para obtener más información, consulta Configura la calidad en comparación con la latencia.Establece una máscara de campo de respuesta que especifique que se muestren las propiedades de respuesta:
A nivel de la ruta, muestra toda la información de viaje en la respuesta incluyendo
routes.travelAdvisoryen la máscara de campo de respuesta. Para mostrar solo la información de tráfico, especificaroutes.travelAdvisory.speedReadingIntervals.A nivel del segmento, muestra toda la información de viaje en la respuesta para cada segmento de la ruta incluyendo
routes.legs.travelAdvisory. Para mostrar solo la información de 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 con información sobre el tráfico
En la respuesta, los datos de tráfico se codifican en la polilínea y se incluyen en el
travelAdvisory campo, del tipo
RouteLegTravelAdvisory (cada segmento) 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"
}
]
}
}
]
}
RouteTravelAdvisory y RouteLegTravelAdvisory incluyen un campo de array llamado speedReadingIntervals que contiene información sobre la velocidad del tráfico. Cada
objeto del array se representa con un
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 abarca toda la polilínea de la ruta sin superposición. El punto de inicio de un intervalo especificado es el mismo que el extremo del intervalo anterior.
Cada intervalo se describe con su startPolylinePointIndex, endPolylinePointIndex y la categoría de velocidad correspondiente. Ten en cuenta que la
falta de índice de inicio dentro del intervalo corresponde al índice 0 de acuerdo
con 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 desde el índice 2 hasta el índice 4.
Renderiza polilíneas con información sobre el tráfico con el SDK de Maps
Te recomendamos que muestres polilíneas con información sobre el tráfico en el mapa usando 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 Funciones de polilínea para Android y Funciones 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 "SLOW" podría mostrarse como una línea naranja gruesa.
A través de los siguientes fragmentos de código se agrega una polilínea azul gruesa con segmentos geodésicos desde Melbourne hasta Perth. Para obtener más información, consulta Personaliza la apariencia (para Android) y Personaliza la polilínea (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 Search Along Route
Usa la API de Places Text Search para buscar a lo largo de una ruta calculada. Pasa la polilínea codificada de una ruta precalculada de la API de Routes Compute Routes a la solicitud de Text Search. 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 detalles, 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, haz 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();