Routen-Polylinien anfordern

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

  • Grundlegende Polylinie (Standard): Stellt eine Route dar, ohne dass in die Polylinie Verkehrsinformationen eingebettet sind. Anfragen, die eine einfache Polylinie zurückgeben, werden zum Basispreis für Routen abgerechnet. Weitere Informationen zur Abrechnung für die Routes API

  • Polylinie mit Verkehrserkennung – enthalten Informationen zur Verkehrslage entlang der Route. Die Verkehrslage wird in Bezug auf die Geschwindigkeit angegeben. Kategorien (NORMAL, SLOW, TRAFFIC_JAM) in einem bestimmten Intervall der Polylinie auf. Anfragen für verkehrsabhängige Polylinien werden zum Preis für bevorzugte Routen abgerechnet. Weitere Informationen zur Abrechnung für die Routes API Weitere Informationen finden Sie unter Polylinienqualität konfigurieren.

Weitere Informationen zu Polylinien finden Sie unter:

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

Eine Polylinie wird durch ein Polyline-Objekt (REST) oder ein Polyline-Objekt (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 eine Polylinie in der Antwort zurück, indem Sie routes.polyline in der Antwortfeldmaske.

  • Auf Beinebene wird in der Antwort für jeden Abschnitt des unter Berücksichtigung von routes.legs.polyline berechnet.

  • Auf Schrittebene wird in der Antwort für jeden Schritt von das Etappen durch Einfügen von routes.legs.steps.polyline.

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 der Route 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, wird die zurückgegebene enthält nur einen einzigen Streckenabschnitt. Daher sind die Polylinien für den Abschnitt und für die Route identisch.

Wenn Sie der Anfrage einen Wegpunkt hinzufügen, wird der zurückgegebene Route enthält 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 Anforderung gibt zwei Streckenabschnitte mit jeweils einer eindeutigen Polylinie sowie eine Polylinie für der gesamten 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"
      }
    }
  ]
}

Polylinienqualität

Die Qualität einer Polylinie kann anhand der folgenden Kriterien beschrieben werden:

  • Die Gleitkommagenauigkeit der Punkte

    Punkte werden als Breiten- und Längengradwerte angegeben, die durch im Gleitkommaformat mit einfacher Genauigkeit. Das funktioniert gut für kleine Werte, die genau dargestellt werden können. Die Genauigkeit nimmt jedoch mit zunehmenden Werten aufgrund von Rundungsfehlern bei Gleitkommazahlen ab.

    Bei der Methode computeRoutes (REST) und ComputeRoutes wird dies durch polylineEncoding gesteuert.

  • Die Anzahl der Punkte, aus denen die Polylinie besteht

    Je mehr Punkte vorhanden sind, desto glatter die Polylinie (insbesondere in Kurven).

    Bei der Methode computeRoutes (REST) und ComputeRoutes wird dies durch polylineQuality gesteuert.

Codierungstyp für Polylinien konfigurieren

Mit der Anfrageoption polylineEncoding können Sie den Polylinientyp steuern. Mit der Property polylineEncoding wird festgelegt, ob die Polylinie als ENCODED_POLYLINE (Standard) codiert wird, was bedeutet, dass das Algorithmusformat für codierte Polylinien verwendet wird, oder als GEO_JSON_LINESTRING, was bedeutet, dass das GeoJSON-LineString-Format verwendet wird.

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 von Polylinien konfigurieren

polylineQuality gibt die Qualität der Polylinie als HIGH_QUALITY oder OVERVIEW (Standardeinstellung) an. Bei OVERVIEW besteht die Polylinie aus einer kleinen Anzahl von Punkten und hat eine geringere 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. Darüber hinaus können Sie auch anfordern, dass die Polylinie Folgendes enthält: Verkehrsinformationen für die Route und für jeden Abschnitt der Route.

Verkehrsabhängige Polylinien enthalten Informationen zur Verkehrslage entlang der Route. Die Verkehrsbedingungen werden in Form von Geschwindigkeitskategorien (NORMAL, SLOW, TRAFFIC_JAM) für ein bestimmtes Intervall des Antwortpolyliniens angegeben. Die Intervalle werden durch die Indexe der Polylinienpunkte am Anfang (inklusive) und am Ende (exklusiv) 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 verkehrsabhängigen Polylinie stellen möchten, legen Sie in der Anfrage die folgenden Eigenschaften fest:

  • Legen Sie zum Aktivieren das Array-Feld extraComputations auf TRAFFIC_ON_POLYLINE fest die Traffic-Berechnung.

  • Legen Sie travelMode auf DRIVE oder TWO_WHEELER fest. Anfragen für andere Mobilitätsform einen Fehler zurück.

  • Geben Sie entweder die Weiterleitung TRAFFIC_AWARE oder TRAFFIC_AWARE_OPTIMAL an in der Anfrage angeben. Weitere Informationen finden Sie unter Qualität und 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, indem Sie einschließlich routes.travelAdvisory in der Antwortfeldmaske. Zurückgeben nur die Verkehrsinformationen, routes.travelAdvisory.speedReadingIntervals

    • Auf Beinebene: Alle Reiseinformationen in der Antwort für für jeden Abschnitt der Route, 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 verkehrsorientierte Polylinie

In der Antwort sind die Verkehrsdaten in der Polylinie codiert und in der Feld „travelAdvisory“ vom Typ RouteLegTravelAdvisory -Objekt (jedes Bein) und RouteTravelAdvisory-Objekt (route).

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 speedReadingIntervals, die Informationen zur Verkehrsgeschwindigkeit enthält. Jedes Objekt im Array wird durch ein SpeedReadingInterval-Objekt (REST) oder ein SpeedReadingInterval-Objekt (gRPC) dargestellt.

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

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

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.

Verkehrserkennungsbasierte Polylinien mit dem Maps SDK rendern

Wir empfehlen, verkehrsabhängige Polylinien auf der Karte mithilfe der verschiedenen Funktionen der Google Maps SDKs anzuzeigen, einschließlich benutzerdefinierter Farben, Striche und Muster entlang der Polylinienabschnitte. Weitere Informationen zur Verwendung von Polylinien Siehe Polylinienfunktionen für Android und Polylinienfunktionen für iOS.

Beispiel für das Rendern von Polylinien

Nutzer des Maps SDK können eine benutzerdefinierte Zuordnungslogik zwischen den Geschwindigkeitskategorien und den Polylinien-Rendering-Schemas definieren. Als könnte beispielsweise „NORMAL“ angezeigt werden, als dicke blaue Linie auf der Karte während "LANGSAM" kann beispielsweise als dicke orangefarbene Linie dargestellt werden.

Die folgenden Snippets fügen eine dicke blaue Polylinie mit geodätischen Segmenten aus Melbourne nach Perth. Weitere Informationen finden Sie unter Darstellung anpassen (Android) und Polylinie anpassen (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