Demander des polylignes d'itinéraire

L'encodage des polylignes est un algorithme de compression avec pertes qui vous permet de stocker une série de coordonnées, telle qu'une route, sous la forme d'une seule chaîne. Le processus d'encodage convertit une valeur binaire en une série de codes de caractères ASCII en utilisant le schéma d'encodage base64. Pour obtenir une description complète du processus d'encodage, consultez la page Format d'algorithme des polylignes encodées.

Les méthodes computeRoutes (REST) et ComputeRoutes (gRPC) renvoient toutes deux la route représentée par une polyligne dans la réponse. Ces API renvoient deux types de polylignes:

  • Polyligne de base (par défaut) : représente un itinéraire, mais sans informations sur le trafic intégrées à la polyligne. Les requêtes qui renvoient une polyligne de base sont facturées au tarif de Routes Basic. Apprenez-en plus sur la facturation pour l'API Routes.

  • Les polylignes tenant compte du trafic contiennent des informations sur les conditions de circulation tout au long de l'itinéraire. Les conditions de trafic sont exprimées en catégories de vitesse (NORMAL, SLOW, TRAFFIC_JAM) applicables à un intervalle donné de la polyligne. Les requêtes de polylignes avec détection du trafic sont facturées au tarif préférentiel sur les routes. Apprenez-en plus sur la facturation pour l'API Routes. Pour en savoir plus, consultez Configurer la qualité des polylignes.

Pour en savoir plus sur les polylignes, consultez les sections suivantes:

Demander une polyligne de base pour un itinéraire, une section ou une étape

Une polyligne est représentée par un objet Polyligne (REST) ou Polyligne (gRPC). Vous pouvez renvoyer une polyligne dans la réponse au niveau de l'itinéraire, de l'étape et des étapes.

Spécifiez la polyligne à renvoyer en utilisant le masque de champ de réponse:

  • Au niveau de l'itinéraire, renvoyez une polyligne dans la réponse en incluant routes.polyline dans le masque de champ de réponse.

  • Au niveau de l'étape, renvoyez une polyligne dans la réponse pour chaque section de l'itinéraire en incluant routes.legs.polyline.

  • Au niveau de l'étape, renvoyez une polyligne dans la réponse pour chaque étape de l'étape en incluant routes.legs.steps.polyline.

Par exemple, pour renvoyer une polyligne pour l'intégralité de l'itinéraire, pour chaque section et pour chaque étape de chaque section:

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'

Cette requête renvoie la réponse suivante, qui inclut la polyligne de l'itinéraire, pour chaque section de l'itinéraire et pour chaque étape de la section:

{
  "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_@@_@?"
      }
    }
  ]
}

Étant donné que cette requête ne contient qu'un point de départ et une destination, l'itinéraire renvoyé ne contient qu'une seule section. Par conséquent, la polyligne pour la section et pour l'itinéraire est identique.

Si vous ajoutez un point de cheminement intermédiaire à la requête, l'itinéraire renvoyé contient deux sections:

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'

Cette requête renvoie deux sections, chacune avec une polyligne unique et une polyligne pour l'itinéraire complet:

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

Configurer le type d'encodage de polyligne

Utilisez l'option de requête polylineEncoding pour contrôler le type de polyligne. La propriété polylineEncoding indique comment encoder la polyligne au format ENCODED_POLYLINE (par défaut), ce qui signifie que vous devez utiliser l'algorithme d'encodage des polylignes, ou au format GEO_JSON_LINESTRING, qui signifie que vous utilisez le format LineString GeoJSON.

Par exemple, dans le corps de la requête:

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'

Demander une polyligne tenant compte du trafic

Les exemples présentés ci-dessus renvoient tous des polylignes de base, c'est-à-dire des polylignes sans informations sur le trafic. En outre, vous pouvez demander à ce que la polyligne contienne des informations sur le trafic pour l'itinéraire et pour chaque section de celui-ci.

Les polylignes tenant compte du trafic contiennent des informations sur les conditions de circulation le long de l'itinéraire. Les conditions de circulation sont exprimées en catégories de vitesse (NORMAL, SLOW, TRAFFIC_JAM) sur un intervalle donné de la polyligne de réponse. Les intervalles sont définis par les index de leurs points de polyligne de départ (inclusifs) et de fin (exclusifs).

Par exemple, la réponse suivante affiche le trafic NORMAL entre les points de polyligne 2 et 4:

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

Pour effectuer une requête de calcul de polyligne tenant compte du trafic, définissez les propriétés suivantes dans la requête:

  • Définissez le champ du tableau extraComputations sur TRAFFIC_ON_POLYLINE pour activer le calcul du trafic.

  • Définissez travelMode sur DRIVE ou TWO_WHEELER. Les requêtes pour tout autre mode de transport renvoient une erreur.

  • Spécifiez la préférence de routage TRAFFIC_AWARE ou TRAFFIC_AWARE_OPTIMAL dans la requête. Pour en savoir plus, consultez la section Configurer la qualité ou la latence.

  • Définissez un masque de champ de réponse qui indique de renvoyer les propriétés de réponse:

    • Au niveau de l'itinéraire, renvoyez toutes les informations de voyage dans la réponse en incluant routes.travelAdvisory dans le masque de champ de réponse. Pour ne renvoyer que les informations sur le trafic, spécifiez routes.travelAdvisory.speedReadingIntervals.

    • Au niveau de l'étape, renvoyez toutes les informations de voyage dans la réponse pour chaque section de l'itinéraire en incluant routes.legs.travelAdvisory. Pour ne renvoyer que les informations sur le trafic, spécifiez 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'

Exemple de réponse pour une polyligne tenant compte du trafic

Dans la réponse, les données de trafic sont encodées dans la polyligne et sont contenues dans le champ travelAdvisory, de type RouteLegTravelAdvisory (chaque section) et RouteTravelAdvisory (itinéraire).

Exemple :

{
  "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 et RouteLegTravelAdvisory incluent tous deux un champ de tableau appelé speedReadingIntervals qui contient des informations sur la vitesse du trafic. Chaque objet du tableau est représenté par un objet SpeedReadingInterval (REST) ou SpeedReadingInterval (gRPC).

Un objet SpeedReadingInterval inclut la lecture de la vitesse pour un intervalle d'itinéraire, tel que NORMAL, SLOW ou TRAFFIC_JAM. L'ensemble du tableau d'objets couvre l'intégralité de la polyligne de l'itinéraire, sans chevauchement. Le point de départ d'un intervalle spécifié est identique au point d'arrivée de l'intervalle précédent.

Chaque intervalle est décrit par ses valeurs startPolylinePointIndex et endPolylinePointIndex, ainsi que par la catégorie de vitesse correspondante. Notez que l'absence d'index de départ dans l'intervalle correspond à l'indice 0, conformément aux pratiques de proto3.

Les valeurs startPolylinePointIndex et endPolylinePointIndex ne sont pas toujours consécutives. Exemple :

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

Dans ce cas, les conditions de trafic sont identiques entre l'index 2 et l'index 4.

Afficher des polylignes avec détection du trafic avec le SDK Maps

Nous vous recommandons d'afficher des polylignes tenant compte du trafic sur la carte à l'aide des différentes fonctionnalités proposées par les SDK Google Maps, y compris des couleurs, des traits et des motifs personnalisés le long des étirements des polylignes. Pour en savoir plus sur l'utilisation des polylignes, consultez Fonctionnalités des polylignes pour Android et Fonctionnalités des polylignes pour iOS.

Exemple de rendu de polylignes

Les utilisateurs du SDK Maps ont la possibilité de définir une logique de mappage personnalisée entre les catégories de vitesse et les schémas de rendu des polylignes. Par exemple, vous pouvez afficher la vitesse "NORMAL" sous la forme d'une ligne bleue épaisse sur la carte, tandis que la vitesse "LENTE" peut être affichée sous la forme d'une ligne orange épaisse.

Les extraits de code suivants ajoutent une polyligne épaisse bleue avec des segments géodésiques de Melbourne à Perth. Pour en savoir plus, consultez Personnaliser l'apparence (pour Android) et Personnaliser la polyligne (pour 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