Routen-Polylinien anfordern

Die Polyliniencodierung ist ein verlustbehafteter Komprimierungsalgorithmus, mit dem Sie eine Reihe von Koordinaten wie eine Route als einzelnen String speichern können. Beim Codierungsprozess wird ein binärer Wert mithilfe des base64-Codierungsschemas in eine Reihe von Zeichencodes für ASCII-Zeichen umgewandelt. Eine vollständige Beschreibung des Codierungsprozesses finden Sie unter Algorithmusformat für codierte Polylinien.

Die Methode computeRoutes (REST) und die Methode ComputeRoutes (gRPC) geben beide die durch eine Polylinie dargestellte Route als Teil der Antwort zurück. Diese APIs geben zwei Arten von Polylinien zurück:

  • Einfache Polylinie (Standard) steht für eine Route, jedoch ohne in die Polylinie eingebettete Verkehrsinformationen. Anfragen, die eine einfache Polylinie zurückgeben, werden auf der Basisroutenbasis abgerechnet. Weitere Informationen zur Abrechnung für die Routes API

  • Traffic-sensitive Polylinie enthält Informationen zu den Verkehrsverhältnissen entlang der Route. Die Verkehrslage wird in Bezug auf die Geschwindigkeitskategorien (NORMAL, SLOW, TRAFFIC_JAM) für ein bestimmtes Intervall der Polylinie ausgedrückt. Anfragen für kontextsensitive Polylinien werden zu den „Routes Preferred“-Preisen abgerechnet. Weitere Informationen zur Abrechnung für die Routes API

Weitere Informationen zu Polylinien finden Sie unter:

Einfache Polylinie für eine Route, einen Abschnitt oder einen Schritt anfordern

Eine Polylinie wird durch ein Objekt vom Typ Polylinie (REST) oder Polylinie (gRPC) dargestellt. Sie können eine Polylinie in der Antwort auf Routen-, Streckenabschnitt- und Schrittebene zurückgeben.

Geben Sie mithilfe der Antwortfeldmaske an, welche Polylinie zurückgegeben werden soll:

  • Auf Routenebene geben Sie eine Polylinie in die Antwort zurück, indem Sie routes.polyline in die Antwortfeldmaske einfügen.

  • Auf Routenebene geben Sie für jeden Abschnitt der Route eine Polylinie zurück, indem Sie routes.legs.polyline angeben.

  • Auf Schrittebene geben Sie eine Polylinie in der Antwort für jeden Schritt des Abschnitts zurück, indem Sie routes.legs.steps.polyline angeben.

So geben Sie beispielsweise eine Polylinie für die gesamte Route, für jeden Abschnitt und für jeden Schritt jedes Abschnitts zurück:

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'

Diese Anfrage gibt die folgende Antwort zurück, die die Polylinie für die Route, für jeden Abschnitt und für jeden Schritt des Abschnitts enthält:

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

Da diese Anfrage nur einen Start- und einen Zielort enthält, enthält die zurückgegebene Route nur einen einzelnen Streckenabschnitt. Daher sind die Polylinie für den Abschnitt und die Route identisch.

Wenn Sie der Anfrage einen Zwischenwegpunkt hinzufügen, enthält die zurückgegebene Route zwei Streckenabschnitte:

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'

Diese Anfrage gibt zwei Abschnitte zurück, die jeweils eine eindeutige Polylinie und eine Polylinie für die gesamte Route enthalten:

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

Polylinien-Codierungstyp konfigurieren

Mit der Anfrageoption polylineEncoding können Sie den Polylinientyp steuern. Mit dem Attribut polylineEncoding wird angegeben, wie die Polylinie als ENCODED_POLYLINE (Standard, d. h. Verwendung des Polylinien-Codierungs-Algorithmus) oder mit GEO_JSON_LINESTRING, also dem GeoJSON-LineString-Format, codiert wird.

Beispiel im Anfragetext:

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'

Traffic-sensitive Polylinie anfordern

Die Beispiele oben zeigen grundlegende Polylinien, d. h. Polylinien ohne Verkehrsinformationen. Außerdem können Sie anfordern, dass die Polylinie Verkehrsinformationen für die Route und für jeden Abschnitt der Route enthält.

Verkehrssensitive Polylinien enthalten Informationen zu den Verkehrsbedingungen auf der Route. Die Verkehrslage wird in Bezug auf die Geschwindigkeitskategorien (NORMAL, SLOW, TRAFFIC_JAM) für ein bestimmtes Intervall der Antwortlinie angegeben. Die Intervalle werden durch die Indexe ihrer Anfangs- (einschließlich) und ihr enden (exklusiven) Polylinienpunkte definiert.

Die folgende Antwort zeigt beispielsweise NORMAL-Traffic zwischen den Polylinienpunkten 2 und 4:

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

Wenn Sie eine Anfrage zum Berechnen einer Polylinie mit hohem Traffic-Aufkommen stellen möchten, legen Sie in der Anfrage die folgenden Attribute fest:

  • Legen Sie das Array-Feld extraComputations auf TRAFFIC_ON_POLYLINE fest, um die Traffic-Berechnung zu aktivieren.

  • Legen Sie travelMode auf DRIVE oder TWO_WHEELER fest. Bei Anfragen für alle anderen Mobilitätsformen wird ein Fehler zurückgegeben.

  • Geben Sie in der Anfrage entweder die Routingeinstellung TRAFFIC_AWARE oder TRAFFIC_AWARE_OPTIMAL an. Weitere Informationen finden Sie unter Qualität vs. Latenz konfigurieren.

  • Legen Sie eine Antwortfeldmaske fest, die angibt, dass die Antwortattribute zurückgegeben werden:

    • Auf Routenebene geben Sie alle Reiseinformationen in der Antwort zurück. Dazu fügen Sie routes.travelAdvisory in die Antwortfeldmaske ein. Wenn nur die Verkehrsinformationen zurückgegeben werden sollen, geben Sie routes.travelAdvisory.speedReadingIntervals an.

    • Auf Routenebene: Geben Sie alle Fahrtinformationen in der Antwort für jeden Abschnitt der Route zurück, indem Sie routes.legs.travelAdvisory angeben. Wenn nur die Verkehrsinformationen zurückgegeben werden sollen, geben Sie routes.legs.travelAdvisory.speedReadingIntervals an.

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'

Beispielantwort für eine Traffic-sensitive Polylinie

In der Antwort werden Verkehrsdaten in der Polylinie codiert und sind im Feld travelAdvisory vom Typ RouteLegTravelAdvisory (jedes Bein) und RouteTravelAdvisory-Objekt (Route) enthalten.

Beispiel:

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

Sowohl RouteTravelAdvisory als auch RouteLegTravelAdvisory enthalten ein Arrayfeld mit dem Namen speedReadingIntervals, das Informationen zur Verkehrsgeschwindigkeit enthält. Jedes Objekt im Array wird durch ein SpeedReadingInterval-Objekt (REST) oder SpeedReadingInterval-Objekt (gRPC) dargestellt.

Ein SpeedReadingInterval-Objekt enthält die Geschwindigkeit für ein Routenintervall, z. B. NORMAL, SLOW oder TRAFFIC_JAM. Das gesamte Objektarray deckt die gesamte Polylinie der Route ab. Der Startpunkt eines angegebenen Intervalls ist mit dem Endpunkt des vorherigen Intervalls identisch.

Jedes Intervall wird durch startPolylinePointIndex, endPolylinePointIndex und die entsprechende Geschwindigkeitskategorie beschrieben. Das Fehlen des Startindex im Intervall entspricht dem Index 0 gemäß den Best Practices für Proto3.

Die Werte startPolylinePointIndex und endPolylinePointIndex sind nicht immer aufeinanderfolgend. Beispiel:

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

In diesem Fall waren die Verkehrsbedingungen von Index 2 bis Index 4 identisch.

Trafficsensitive Polylinien mit dem Maps SDK rendern

Wir empfehlen, für Traffic-unterschiedliche Polylinien die verschiedenen Funktionen von Google Maps SDKs wie benutzerdefinierte Farben, Striche und Muster entlang der Streckenabschnitte zu verwenden. Weitere Informationen zur Verwendung von Polylinien finden Sie unter Polylinien-Funktionen für Android und Polylinien-Funktionen für iOS.

Beispiele für das Rendern von Polylinien

Die Nutzer des Maps SDK haben die Möglichkeit, eine benutzerdefinierte Zuordnungslogik zwischen den Geschwindigkeitskategorien und den Polylinien-Renderingschemas zu definieren. Beispielsweise kann eine „NORMAL“-Geschwindigkeit als dicke blaue Linie auf der Karte angezeigt werden, während „Langsame“ Geschwindigkeit als dicke orange Linie angezeigt wird.

Mit den folgenden Snippets wird eine dicke blaue Polylinie mit geodätischen Segmenten von Melbourne nach Perth hinzugefügt. Weitere Informationen finden Sie unter Darstellung anpassen (für Android) und Polylinie anpassen (für 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