Solicita polilíneas de rutas

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.

  • La polilínea de reconocimiento del tráfico contiene 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) aplicables a un intervalo determinado de la polilínea. Las solicitudes de polilíneas adaptadas al 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:

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 la ruta, el segmento y el 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 del campo de respuesta para mostrar una polilínea en la respuesta.

  • A nivel de los tramos, incluye routes.legs.polyline para mostrar una polilínea en la respuesta de 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 etapa y cada paso de cada etapa, 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 segmento y cada paso de la ruta:

{
  "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, las polilíneas del tramo y 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 puede describirse 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 los valores aumentan debido a errores de redondeo de punto flotante.

    En el método computeRoutes (REST) y ComputeRoutes, esto se controla mediante 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 el método computeRoutes (REST) y ComputeRoutes, esto se controla mediante 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 (configuración predeterminada), lo que significa que se usará el formato del algoritmo de polilínea codificada, o bien GEO_JSON_LINESTRING, 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'

Configurar la calidad de Poyline

polylineQuality especifica la calidad de la polilínea como HIGH_QUALITY o OVERVIEW (valor predeterminado). Con OVERVIEW, la polilínea se compone con una pequeña cantidad de puntos y tiene una latencia de solicitud menor 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 optimizada para el tráfico

En los ejemplos anteriores, se muestran polilíneas básicas, es decir, polilíneas sin información sobre el tráfico. Además, 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 adaptadas al 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 polilínea inicial (inclusive) y final (exclusivos).

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 en TRAFFIC_ON_POLYLINE para habilitar el cálculo del tráfico.

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

  • Especifica la preferencia de enrutamiento TRAFFIC_AWARE o TRAFFIC_AWARE_OPTIMAL en la solicitud. Para obtener más información, consulta Configura la calidad frente a la latencia.

  • Configura una máscara de campo de respuesta que especifique que se muestren 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, especifica routes.travelAdvisory.speedReadingIntervals.

    • A nivel de los segmentos, incluye routes.legs.travelAdvisory para mostrar toda la información de viaje en la respuesta de cada segmento 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'

Respuesta de ejemplo para una polilínea optimizada para el tráfico

En la respuesta, los datos de tráfico se codifican en la polilínea y están contenidos 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"
          }
        ] 
      }
    }
  ]
}

Tanto RouteTravelAdvisory como RouteLegTravelAdvisory incluyen un campo de array llamado speedReadingIntervals que contiene información sobre la velocidad del tráfico. Cada objeto del arreglo está representado por un objeto SpeedReadingInterval (REST) o SpeedReadingInterval (gRPC).

Un objeto SpeedReadingInterval incluye lectura de velocidad para un intervalo de ruta, como NORMAL, SLOW o TRAFFIC_JAM. El array 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 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 del í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 4.

Cómo renderizar polilíneas adaptadas al tráfico con el SDK de Maps

Te recomendamos que muestres en el mapa las polilíneas compatibles con el tráfico mediante las diversas funciones que ofrecen los SDKs de Google Maps, incluidos colores, trazos y patrones personalizados a lo largo de los tramos de polilínea. Para obtener más información 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 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. A modo de ejemplo, se puede decidir mostrar la velocidad "NORMAL" como una línea gruesa de color azul en el mapa, mientras que la velocidad "LENTA" puede aparecer como una línea gruesa de color naranja, por ejemplo.

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 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