Demander des polylignes d'itinéraire

La méthode computeRoutes (REST) et ComputeRoutes (gRPC) renvoient toutes deux l'itinéraire représenté par une polyligne dans le cadre de de réponse. Ces API renvoient deux types de polylignes:

  • Polyligne de base (par défaut) : représente un itinéraire, mais sans trafic. les informations intégrées dans la polyligne. Requêtes qui renvoient une polyligne de base sont facturés au tarif des routes Basic. En savoir plus sur Billing pour l'API Routes.

  • Polyligne tenant compte du trafic, contenant des informations sur les conditions de circulation tout au long de la route. Les conditions de circulation sont exprimées en vitesse catégories (NORMAL, SLOW, TRAFFIC_JAM) applicables à un intervalle donné de la polyligne. Les requêtes pour les polylignes sensibles au trafic sont facturées Tarif préférentiel pour les routes. En savoir plus sur la facturation pour API Routes. Pour en savoir plus, consultez Configurer la qualité de la polyligne

Pour en savoir plus sur les polylignes, consultez les articles suivants:

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

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

Spécifiez la polyligne à renvoyer à l'aide de la méthode 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 la section, renvoyez une polyligne dans la réponse pour chaque étape de la en incluant routes.legs.polyline.

  • Au niveau de l'étape, renvoyez une polyligne dans la réponse pour chaque étape de la section 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 étape:

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 pour le pour chaque section 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, le l'itinéraire ne contient qu'une seule section. Par conséquent, la polyligne pour la jambe et pour l'itinéraire sont identiques.

Si vous ajoutez un point de cheminement intermédiaire à la requête, le comporte deux étapes:

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 parties, chacune avec une polyligne unique et une polyligne pour l'intégralité de la route:

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

Qualité des polylignes

La qualité d'une polyligne peut être décrite dans les termes suivants:

  • Précision des points à virgule flottante

    Les points sont spécifiés sous forme de valeurs de latitude et de longitude, qui sont représentées au format à virgule flottante à simple précision. Cela fonctionne bien pour les petites valeurs (qui peut être représentée avec précision), mais la précision diminue à mesure que les valeurs augmentent en raison des erreurs d'arrondi à virgule flottante.

    Dans computeRoutes (REST) et ComputeRoutes ce paramètre est contrôlé par polylineEncoding.

  • Nombre de points qui composent la polyligne

    Plus il y a de points, plus la polyligne est lisse (surtout dans les courbes de modèle).

    Dans computeRoutes (REST) et ComputeRoutes ce paramètre est contrôlé par polylineQuality.

Configurer le type d'encodage des polylignes

Utilisez l'option de requête polylineEncoding pour contrôler le type de polyligne. La propriété polylineEncoding détermine si la polyligne sera encodée sous la forme ENCODED_POLYLINE (par défaut), ce qui signifie que Format d'algorithme des polylignes encodées sera utilisé, ou GEO_JSON_LINESTRING, qui signifie Format LineString GeoJSON sera utilisé.

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'

Configurer la qualité des polylignes

polylineQuality spécifie la qualité de la polyligne comme HIGH_QUALITY ou OVERVIEW (par défaut). Avec OVERVIEW, la polyligne est composée à l'aide d'un petit bloc de points et présente une latence de requête inférieure à HIGH_QUALITY.

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

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

Demander une polyligne tenant compte du trafic

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

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

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

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

Pour envoyer une requête de calcul d'une polyligne basée sur le trafic, définissez les éléments suivants : dans la requête:

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

  • Définissez travelMode sur DRIVE ou TWO_WHEELER. Toute demande concernant d'autres le mode de transport renvoie une erreur.

  • Spécifiez le routage TRAFFIC_AWARE ou TRAFFIC_AWARE_OPTIMAL dans la requête. Pour en savoir plus, consultez la section Configurer les paramètres latence.

  • Définissez un masque de champ de réponse spécifiant à renvoyer les propriétés de réponse:

    • Au niveau de l'itinéraire, renvoyez toutes les informations sur le trajet dans la réponse en en incluant routes.travelAdvisory dans le masque de champ de réponse. Pour retourner uniquement les informations sur le trafic, routes.travelAdvisory.speedReadingIntervals

    • Au niveau de la section, renvoyez toutes les informations sur le trajet dans la réponse pour chaque section de l'itinéraire en incluant routes.legs.travelAdvisory. Pour retourner uniquement les informations sur le trafic, 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 sensible au trafic

Dans la réponse, les données de trafic sont encodées dans la polyligne et sont contenues dans Champ travelAdvisory, de type RouteLegTravelAdvisory (chaque pied) et un objet RouteTravelAdvisory (route).

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 du tableau est représenté par SpeedReadingInterval (REST) ou SpeedReadingInterval gRPC.

Un objet SpeedReadingInterval inclut les indications de vitesse pour un intervalle d'un itinéraire. comme 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'une l'intervalle est identique au point final de l'intervalle précédent.

Chaque intervalle est décrit par son startPolylinePointIndex, endPolylinePointIndex et la catégorie de vitesse correspondante. Notez que l'absence d'index de départ dans l'intervalle correspond à l'index 0. conformément aux pratiques 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 étaient identiques entre l'index 2 et l'index 4.

Afficher des polylignes tenant compte du trafic avec le SDK Maps

Nous vous recommandons d'afficher les polylignes sensibles au trafic sur la carte à l'aide des différentes disponibles par les SDK Google Maps, y compris des couleurs, des traits et des motifs le long des étirements de la polyligne. Pour en savoir plus sur l'utilisation des polylignes, voir Fonctionnalités des polylignes pour Android et les fonctionnalités Polyline pour iOS.

Exemple de rendu de polylignes

Les utilisateurs du SDK Maps ont la possibilité de définir une carte personnalisée entre les catégories de vitesse et les schémas de rendu polyligne. En tant que Par exemple, vous pouvez choisir d'afficher "NORMAL" comme une épaisse ligne bleue sur la carte lorsque l'état "SLOW" est activé la vitesse peut être affichée sous la forme d'une épaisse ligne orange, par exemple.

Les extraits de code suivants ajoutent une polyligne épaisse bleue avec des segments géodésiques provenant 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