La codificación de polilínea es un algoritmo de compresión con pérdida que te permite almacenar una serie de coordenadas, por ejemplo, una ruta, como una sola string. El proceso de codificación convierte un valor binario en una serie de códigos de caracteres para caracteres ASCII con el esquema de codificación Base64. Para obtener una descripción completa del proceso de codificación, consulta Formato del algoritmo de polilínea codificada.
Los métodos computeRoutes (REST) y ComputeRoutes (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 según la tarifa básica de Routes. Obtén más información sobre la facturación de la API de Routes.
Polilínea compatible con el tráfico: Incluye 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 las categorías de velocidad (
NORMAL
,SLOW
,TRAFFIC_JAM
) aplicables a un intervalo determinado de la polilínea. Las solicitudes de polilíneas de reconocimiento de tráfico se facturan según la tarifa de Routes Preferred. 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 las polilíneas
Para obtener más información sobre las polilíneas, consulta lo siguiente:
- Configura la calidad frente a la latencia para obtener información sobre cómo configurar la calidad de la polilínea.
- En Formato del algoritmo de polilínea codificada, se describe el algoritmo para codificar una polilínea.
La utilidad interactiva de codificador de polilíneas te permite crear polilíneas codificadas en una IU o decodificar polilíneas para que se muestren en un mapa. Por ejemplo, usa esta utilidad para decodificar una polilínea creada por el siguiente código.
Cómo solicitar 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 devolver una polilínea en la respuesta a nivel de ruta, segmento y paso.
Especifica la polilínea que se mostrará con la máscara de campo de respuesta:
A nivel de la ruta, incluye
routes.polyline
en la máscara de campo de respuesta para mostrar una polilínea en la respuesta.A nivel del tramo, incluye
routes.legs.polyline
para mostrar una polilínea en la respuesta para cada tramo de la ruta.En el nivel del paso, incluye
routes.legs.steps.polyline
para mostrar una polilínea en la respuesta para cada paso del segmento.
Por ejemplo, para mostrar una polilínea para toda la ruta, para cada tramo y cada paso de cada uno, 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, para cada tramo y cada paso:
{ "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_@@_@?" } } ] }
Debido a que 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 tramo y de la ruta es la misma.
Si agregas un punto de referencia intermedio a la solicitud, la ruta que se muestra contendrá 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" } } ] }
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
especifica cómo codificar la polilínea como ENCODED_POLYLINE
(predeterminado), es decir, usa el algoritmo de codificación de polilínea, o GEO_JSON_LINESTRING
, que es el formato GeoJSON LineString.
Por ejemplo, en el cuerpo de la solicitud, sucede 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",
"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 solicitar una polilínea de reconocimiento de tráfico
Los ejemplos anteriores muestran polilíneas básicas, es decir, polilíneas sin información sobre el tráfico. Además, también puedes solicitar que la polilínea contenga información sobre el tráfico de la ruta y de cada uno de sus tramos.
Las polilíneas conscientes del 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 según los índices de los puntos de la polilínea inicial (incluidos) y final (exclusivo).
Por ejemplo, la siguiente respuesta muestra el tráfico NORMAL
entre los puntos de polilínea 2 y 4:
{ "startPolylinePointIndex": 2, "endPolylinePointIndex": 4, "speed": "NORMAL" }
Si deseas realizar una solicitud para calcular una polilínea optimizada para el tráfico, configura las siguientes propiedades en la solicitud:
Establece el campo de array
extraComputations
enTRAFFIC_ON_POLYLINE
para habilitar el cálculo del tráfico.Establece
travelMode
enDRIVE
oTWO_WHEELER
. Las solicitudes para cualquier otro modo de viaje muestran un error.Especifica la preferencia de enrutamiento
TRAFFIC_AWARE
oTRAFFIC_AWARE_OPTIMAL
en la solicitud. Si deseas obtener más información, consulta Cómo configurar la calidad frente a la latencia.Establece una máscara de campo de respuesta que especifique que se deben mostrar las propiedades de la 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 del 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 con
routes.legs.travelAdvisory
. 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'
Respuesta de ejemplo para una polilínea de reconocimiento de tráfico
En la respuesta, los datos de tráfico se codifican en la polilínea y se encuentran en el campo travelAdvisory
, del tipo RouteLegTravelAdvisory (cada etapa) y el objeto RouteTravelAdvisory (route).
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
. El array completo 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 punto de finalización del intervalo anterior.
Cada intervalo se describe mediante su startPolylinePointIndex
, endPolylinePointIndex
y la categoría de velocidad correspondiente.
Ten en cuenta que la falta de un í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 del índice 2 al índice 4.
Cómo renderizar polilíneas conscientes del tráfico con el SDK de Maps
Te recomendamos que muestres polilíneas con reconocimiento de tráfico en el mapa mediante las diversas funciones que ofrecen los SDKs de Google Maps, incluidos colores, trazos y patrones personalizados a lo largo de los estiramientos de polilínea. Para obtener más detalles sobre el uso de polilíneas, consulta Funciones de polilíneas para Android y Funciones de polilíneas para iOS.
Ejemplo de renderización de polilíneas
Los usuarios del SDK de Maps pueden 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, es posible que se decida mostrar la velocidad "NORMAL" como una línea azul gruesa en el mapa, mientras que la velocidad "LENTA" se puede mostrar como una línea naranja gruesa.
En los siguientes fragmentos, se agrega una polilínea azul gruesa con segmentos geodésicos desde Mellbourne hasta Perth. Para obtener más información, consulta Cómo personalizar los aspectos (para Android) y Cómo personalizar 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