Solicita polilíneas de rutas

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

La codificación de polilínea es un algoritmo de compresión con pérdida que te permite almacenar una serie de coordenadas, como una ruta, como una sola string. El proceso de codificación convierte un valor binario en una serie de códigos de caracteres para los caracteres ASCII mediante el esquema de codificación base64. Para obtener una descripción completa del proceso de codificación, consulta el formato del algoritmo de polilínea codificada.

El método computeRoutes (REST) y el método ComputeRoutes (gRPC) muestran la ruta representada por una polilínea como parte de la respuesta. Estas API muestran dos tipos de polilíneas:

  • La polilínea básica (opción 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, que contiene información sobre las condiciones del tráfico en 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 optimizadas para el tráfico se facturan con 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 sobre las polilíneas, consulta:

Cómo solicitar una polilínea básica para una ruta, tramo o 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, tramo y paso.

Especifica qué polilínea se debe mostrar con la máscara de campo de respuesta:

  • A nivel de la ruta, se muestra una polilínea en la respuesta mediante la inclusión de routes.polyline en la máscara del campo de respuesta.

  • A nivel de pierna, muestra routes.legs.polyline en una respuesta para cada etapa de la ruta.

  • A nivel de paso, muestra routes.legs.steps.polyline en una respuesta para cada paso de la etapa.

Por ejemplo, a fin de mostrar una polilínea para toda la ruta, para cada etapa y para cada paso de cada etapa:

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 etapa de la ruta y para cada paso de la etapa:

{
  "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 de la pierna y de la ruta son las mismas.

Si agregas un punto de referencia intermedio a la solicitud, la ruta que se muestra contiene dos etapas:

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 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"
      }
    }
  ]
}

Cómo configurar 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 (predeterminada), lo que significa que se usa el algoritmo de codificación de polilínea, o GEO_JSON_LINESTRING, lo que significa que se usa 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'

Solicita una polilínea que tenga en cuenta el tráfico

Los ejemplos que se muestran arriba muestran polilíneas básicas, es decir, polilíneas sin información de tráfico. Además, puedes solicitar que la polilínea contenga información sobre el tráfico para la ruta y para cada tramo de la ruta.

Las polilíneas optimizadas para el tráfico contienen información sobre las condiciones de tráfico en 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 sus puntos de polilínea inicial (inclusiva) y final (exclusiva).

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 procesar una polilínea optimizada para tráfico, configura las siguientes propiedades en la solicitud:

  • Establece el campo de arreglo extraComputations como TRAFFIC_ON_POLYLINE para habilitar el cálculo del tráfico.

  • Establece travelMode en DRIVE o TWO_WHEELER. Las solicitudes para cualquier otro medio de transporte muestran un error.

  • Especifica la preferencia de enrutamiento TRAFFIC_AWARE o TRAFFIC_AWARE_OPTIMAL en la solicitud. Para 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 para mostrar las propiedades de respuesta:

    • A nivel de la ruta, se muestra toda la información de viaje en la respuesta mediante la inclusión de routes.travelAdvisory en la máscara del campo de respuesta. Para mostrar solo la información del tráfico, especifica routes.travelAdvisory.speedReadingIntervals.

    • A nivel de etapa, incluye routes.legs.travelAdvisory para mostrar toda la información de viaje en la respuesta de cada etapa de la ruta. Para mostrar solo la información del tráfico, especifica routes.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 optimizada para el tráfico

En la respuesta, los datos del tráfico se codifican en la polilínea y se incluyen en el campo travelAdvisory, del tipo RouteLegTravelAdvisory (cada etapa) y el objeto 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 arreglo llamado speedReadingIntervals que contiene información sobre la velocidad del tráfico. Cada objeto en el arreglo 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 arreglo completo de objetos cubre toda la polilínea de la ruta sin superposición. El punto de inicio de un intervalo especificado es el mismo que el punto final del intervalo anterior.

Cada intervalo se describe según el startPolylinePointIndex, el endPolylinePointIndex y la categoría de velocidad correspondiente. Ten en cuenta que la falta del índice de inicio dentro del intervalo corresponde con el índice 0 de acuerdo con las prácticas proto3.

Los valores startPolylinePointIndex y endPolylinePointIndex no siempre son consecutivos. Por ejemplo:

{
  "startPolylinePointIndex": 2,
  "endPolylinePointIndex": 4,
  "speed": "NORMAL"
}

En este caso, las condiciones del tráfico fueron las mismas del índice 2 al índice 4.

Cómo renderizar polilíneas optimizadas para el tráfico con el SDK de Maps

Te recomendamos que muestres polilíneas acordes al tráfico en el mapa mediante las diversas funciones que ofrecen los SDK de Google Maps, incluidos los colores, trazos y patrones personalizados, a lo largo de la extensión de polilínea. Si deseas 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 procesamiento 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 procesamiento de polilíneas. A modo de ejemplo, se podría mostrar la velocidad "NORMAL" como una línea gruesa azul en el mapa, la velocidad "LENTA" podría mostrarse como una línea naranja gruesa, etcétera.

Los siguientes fragmentos agregan una polilínea azul gruesa con segmentos geodésicos desde Melbourne 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