Solicita polilíneas de rutas

Desarrolladores del Espacio Económico Europeo (EEE)

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 APIs devuelven 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 devuelven una polilínea básica se facturan según la tarifa de Routes Basic. Obtén más información sobre la facturación de la API de Routes.

  • Polilínea que tiene en cuenta el tráfico, que 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 en un intervalo determinado de la polilínea. Las solicitudes de polilíneas que tienen en cuenta el tráfico se facturan según 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 la polilínea.

Para obtener más información sobre las polilíneas, consulta los siguientes recursos:

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 devolver una polilínea en la respuesta a nivel de la ruta, el tramo y el paso.

Para especificar qué polilínea devolver, usa la máscara de campo de respuesta:

  • A nivel de la ruta, incluye una polilínea en la respuesta agregando routes.polyline en la máscara de campos de la respuesta.

  • A nivel de tramo, devuelve una polilínea en la respuesta para cada tramo de la ruta si se incluye routes.legs.polyline.

  • A nivel del paso, devuelve una polilínea en la respuesta para cada paso del tramo, incluido routes.legs.steps.polyline.

Por ejemplo, para devolver 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 devuelve la siguiente respuesta, que incluye la polilínea 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_@@_@?"
      }
    }
  ]
}

Dado que esta solicitud solo contiene un origen y un destino, la ruta que se devuelve 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 devuelta contendrá 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 devuelve 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"
      }
    }
  ]
}

Calidad de la polilínea

La calidad de una polilínea 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 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 con polylineQuality.

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 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 como 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 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",
  ...
}

Cómo solicitar una polilínea que tenga en cuenta el tráfico

Todos los ejemplos anteriores 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 del tráfico para la ruta y para cada tramo de la ruta.

Las polilíneas que tienen en cuenta 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 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 solicitar el cálculo de una polilínea que tenga en cuenta el tráfico, establece las siguientes propiedades en la solicitud:

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

  • Configura travelMode como DRIVE o TWO_WHEELER. Las solicitudes para cualquier otro medio de transporte devuelven 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 en comparación con la latencia.

  • Establece una máscara de campo de respuesta que especifique que se devuelvan las propiedades de la respuesta:

    • A nivel de la ruta, devuelve toda la información de viaje en la respuesta. Para ello, incluye routes.travelAdvisory en la máscara de campo de la respuesta. Para devolver solo la información del tráfico, especifica routes.travelAdvisory.speedReadingIntervals.

    • A nivel del tramo, devuelve toda la información del viaje en la respuesta para cada tramo de la ruta, incluido routes.legs.travelAdvisory. Para devolver 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 que tiene en cuenta el tráfico

En la respuesta, los datos de tráfico se codifican en la polilínea y se incluyen en el campo travelAdvisory, del objeto RouteLegTravelAdvisory (cada tramo) y del 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 array se representa con 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 superposiciones. 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 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 desde el índice 2 hasta el índice 4.

Renderiza polilíneas que tienen en cuenta el tráfico con el SDK de Maps

Te recomendamos que muestres polilíneas que tengan en cuenta el tráfico en el mapa con las diversas funciones que ofrecen los SDKs 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íneas para Android y Funciones de polilíneas 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" se podría mostrar como una línea naranja gruesa.

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 la apariencia (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

Cómo usar polilíneas codificadas con la función Búsqueda a lo largo de la ruta

Usa la función Text Search de la API de Places para buscar a lo largo de una ruta calculada. Pasas la polilínea codificada de una ruta precalculada desde la API de Routes Compute Routes a la solicitud de Text Search. 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 devolver las cafeterías que se encuentran 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();