Routen-Polylinien anfordern

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

  • Einfache Polylinie (Standard): Stellt eine Route dar, aber ohne in die Polylinie eingebettete Verkehrsinformationen. Anfragen, für die eine einfache Polylinie zurückgegeben wird, werden zum „Routes Basic“-Tarif abgerechnet. Weitere Informationen zur Abrechnung für die Routes API

  • Polylinie, die auf die Verkehrslage zugeschnitten ist: Enthält Informationen zur Verkehrslage entlang der Route. Die Verkehrslage wird in Form von Geschwindigkeitskategorien (NORMAL, SLOW, TRAFFIC_JAM) angegeben, die für ein bestimmtes Intervall der Polylinie gelten. Anfragen für Polylinien, die Traffic berücksichtigen, werden zum Tarif „Routes Preferred“ abgerechnet. Weitere Informationen zur Abrechnung für die Routes API Weitere Informationen findest du unter Qualität von Polylinien konfigurieren.

Weitere Informationen zu Polylinien finden Sie unter:

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

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

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

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

  • Auf Streckenabschnittsebene wird in der Antwort für jeden Abschnitt der Route eine Polylinie zurückgegeben, indem routes.legs.polyline einbezogen wird.

  • Auf Schrittebene wird in der Antwort für jeden Schritt des Abschnitts eine Polylinie zurückgegeben, indem routes.legs.steps.polyline einbezogen wird.

So wird beispielsweise eine Polylinie für die gesamte Route, für jeden Streckenabschnitt und für jeden Schritt jedes Abschnitts zurückgegeben:

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'

Bei dieser Anfrage wird die folgende Antwort zurückgegeben, die die Polylinie für die Route, für jeden Abschnitt der Route und für jeden Schritt des Streckenabschnitts 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 ist die Polylinie für den Streckenabschnitt und die Route gleich.

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 Streckenabschnitte mit jeweils einer eindeutigen Polylinie und einer Polylinie für die gesamte Route zurück:

{
  "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ät der Polylinie

Die Qualität einer Polylinie kann folgendermaßen beschrieben werden:

  • Die Gleitkommagenauigkeit der Punkte

    Punkte werden als Breiten- und Längengradwerte angegeben und als Gleitkommazahl mit einfacher Genauigkeit dargestellt. Dies funktioniert gut bei kleinen Werten, die genau dargestellt werden können. Die Genauigkeit verringert sich jedoch, wenn die Werte aufgrund von Gleitkommafehlern Rundungsfehler werden.

    In der Methode computeRoutes (REST) und ComputeRoutes wird dies von polylineEncoding gesteuert.

  • Die Anzahl der Punkte, aus denen die Polylinie besteht

    Je mehr Punkte vorhanden sind, desto weicher ist die Polylinie (insbesondere bei Kurven).

    In der Methode computeRoutes (REST) und ComputeRoutes wird dies von polylineQuality gesteuert.

Codierungstyp für Polylinien konfigurieren

Verwenden Sie die Anfrageoption polylineEncoding, um den Polylinientyp zu steuern. Die Eigenschaft polylineEncoding steuert, ob die Polylinie als ENCODED_POLYLINE (Standardeinstellung) codiert wird, d. h. als Algorithmus für codierte Polylinien, oder als GEO_JSON_LINESTRING, was das GeoJSON-LineString-Format verwendet.

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

Qualität der Polylinie konfigurieren

polylineQuality gibt die Qualität der Polylinie als HIGH_QUALITY oder OVERVIEW (Standardeinstellung) an. Mit OVERVIEW setzt sich die Polylinie aus wenigen Punkten zusammen und hat eine niedrigere Anfragelatenz als HIGH_QUALITY.

Zum Beispiel im Anfragetext:

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

Polylinie mit Verkehrsdaten anfordern

In den Beispielen oben werden grundlegende Polylinien zurückgegeben, d. h. Polylinien ohne Verkehrsinformationen. Außerdem können Sie festlegen, dass die Polylinie Verkehrsinformationen für die Route und für jeden Abschnitt der Route enthält.

Polylinien, die auf die Verkehrslage abgestimmt sind, enthalten Informationen zur Verkehrslage entlang der Route. Die Verkehrslage wird in Form von Geschwindigkeitskategorien (NORMAL, SLOW, TRAFFIC_JAM) für ein bestimmtes Intervall der Antwortpolylinie ausgedrückt. Die Intervalle werden durch die Indexe ihrer Ausgangs- (einschließlich) und End-Polylinienpunkte (exklusive) definiert.

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

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

Legen Sie in der Anfrage die folgenden Attribute fest, um eine Anfrage zur Berechnung einer Polylinie auf Basis von Verkehrsdaten zu stellen:

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

  • Setzen Sie travelMode auf DRIVE oder TWO_WHEELER. Anfragen für andere Mobilitätsformen geben einen Fehler zurück.

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

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

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

    • Auf Streckenabschnittsebene geben Sie in der Antwort für jeden Abschnitt der Route alle Reiseinformationen zurück, indem Sie routes.legs.travelAdvisory einschließen. 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 verkehrsorientierte Polylinie

In der Antwort sind die Verkehrsdaten in der Polylinie codiert und im Feld travelAdvisory des Typs RouteLegTravelAdvisory-Objekt (jeder Abschnitt) 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 Array-Feld mit dem Namen speedReadingIntervals, das Informationen zur Verkehrsgeschwindigkeit enthält. Jedes Objekt im Array wird durch ein Objekt vom Typ SpeedReadingInterval (REST) oder SpeedReadingInterval (gRPC) dargestellt.

Ein SpeedReadingInterval-Objekt enthält Geschwindigkeitsmessungen für ein Routenintervall wie NORMAL, SLOW oder TRAFFIC_JAM. Das gesamte Objektarray deckt die gesamte Polylinie der Route ohne Überschneidung ab. Der Startpunkt eines angegebenen Intervalls ist mit dem Endpunkt des vorhergehenden Intervalls identisch.

Jedes Intervall wird durch seine startPolylinePointIndex, endPolylinePointIndex und die entsprechende Geschwindigkeitskategorie beschrieben. Beachten Sie, dass das Fehlen des Startindex innerhalb des Intervalls dem Index 0 gemäß den proto3-Praktiken entspricht.

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.

Polylinien mit Verkehrserkennungstechnik mit dem Maps SDK rendern

Wir empfehlen, verkehrsbewusste Polylinien auf der Karte mithilfe der verschiedenen Funktionen der Google Maps SDKs anzuzeigen, darunter benutzerdefinierte Farben, Striche und Muster entlang der Polylinienstrecken. Weitere Informationen zur Verwendung von Polylinien finden Sie unter Polylinienfunktionen für Android und Polylinienfunktionen für iOS.

Beispiel für das Rendering einer Polylinie

Nutzer des Maps SDK haben die Möglichkeit, eine benutzerdefinierte Kartenlogik zwischen den Geschwindigkeitskategorien und den Renderingschemas für Polylinien zu definieren. Beispielsweise könnte die Geschwindigkeit für „NORMAL“ als dicke blaue Linie auf der Karte und für „Langsame Geschwindigkeit“ als dicke orangefarbene Linie dargestellt werden.

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