Mit der Places API entlang der Route suchen

In diesem Dokument wird beschrieben, wie Sie entlang einer geplanten Route nach einem Hotel, einem Restaurant oder einer Tankstelle suchen. Sie erfahren, wie Sie mit der Routes API eine Routen-Polyline abrufen und diese mit einer Places API-Anfrage vom Typ Search Along Route (SAR) verwenden. Außerdem erfahren Sie, wie Sie die besten Ergebnisse erzielen, indem Sie den Suchursprung entlang der Route festlegen, z. B. zwei Stunden nach Fahrtbeginn.

Routes API

Um Orte entlang der Route zu suchen, verwenden wir die Routes API. Routendaten aus der Routes API-Antwort sind eine Reihe von LatLong-Koordinaten vom Start- zum Zielort. Routendaten enthalten Abschnitte und Schritte, die dem Straßennetz folgen.

Routen werden auch als codierte Polylinie zurückgegeben, die Sie als Eingabeparameter an die SAR-Anfrage übergeben. Die Polyline-Codierung ist ein verlustbehafteter Komprimierungsalgorithmus, mit dem Sie eine Reihe von Koordinaten als einzelnen String speichern können. Das Abrufen der Polylinie über die Routes API ist nicht zwingend erforderlich. Sie können die Daten selbst erstellen, aber für dieses Beispiel ist die Routes API eine schnelle und sichere Möglichkeit, die erforderlichen Daten zu erhalten.

In dieser Anleitung verwenden wir eine Route von London (-37.8167,144.9619) nach Manchester (-37.8155, 144.9663).

Route von London nach Manchester

Beispielroute: London nach Manchester

Schritt 1: Route über die Routes API abrufen

Wenn Sie mit der Routes API eine Route abrufen möchten, müssen Sie die folgenden Informationen angeben:

  • Start- und Zielort
  • Die Mobilitätsform (Auto, zu Fuß usw.)
  • Alle Wegpunkte (optional)
  • Alle Einstellungen (z. B. Mautstraßen oder Autobahnen vermeiden)
  • Die Option „Verkehrsabhängige Routenführung“ liefert die genauesten Schätzungen, ist aber rechenintensiver und erhöht daher die Latenz der Antwort.
{"origin":{
    "location": {
        "latLng":{
            "latitude":  -37.8167,
            "longitude": 144.9619
        }
    }
},
"destination":{
    "location": {
        "latLng":{
            "latitude":-37.8155,
            "longitude": 144.9663
        }
    }
},
"routingPreference":"TRAFFIC_AWARE",
"travelMode":"DRIVE"
}

Achten Sie beim Aufrufen darauf, dass das Feld „encodedPolyline“ in der Feldmaske für Header enthalten ist.

headers = {
    "Content-Type": "application/json",
    "X-Goog-FieldMask": "routes.distanceMeters,routes.duration,routes.legs,routes.polyline.encodedPolyline"
}

Die vollständige Dokumentation mit Beispielen für das Abrufen einer Route und das Abrufen von Routen-Polylinien.

Sobald Sie diese Informationen in der Anfrage angegeben haben, gibt die Routes API ein Routenobjekt zurück. Das Routenobjekt enthält die folgenden Informationen:

  • Die Gesamtdistanz der Route
  • Die Gesamtdauer der Route
  • Die Abschnitte und Schritte der Route
  • Die codierte Polylinie der Route, der Routenabschnitte und der Schritte.
{
  "routes": [
    {
      "legs": [
        {
          "distanceMeters": 321799,
          "duration": "15401s",
          "staticDuration": "14518s",
          "polyline": {
            "encodedPolyline": "y_kyH`_XOr@q@xKGnBBZ|AlGPj@Y^k@^MEqAfAQLK?eI … <rest of content removed for readability>"
          },
          "startLocation": {
            "latLng": {
              "latitude": 51.507334500000006,
              "longitude": -0.1280107
            }
          },
          "endLocation": {
            "latLng": {
              "latitude": 53.4808513,
              "longitude": -2.2425864
            }
          },
          "steps": [
            {
              "distanceMeters": 320,
              "staticDuration": "82s",
              "polyline": {
                "encodedPolyline": "y_kyH`_XOr@q@xKGnBBZ|AlG"
              },
              "startLocation": {
                "latLng": {
                  "latitude": 51.507334500000006,
                  "longitude": -0.1280107
                }
              },
              "endLocation": {
                "latLng": {
                  "latitude": 51.507207,
                  "longitude": -0.1323681
                }
              },
              "navigationInstruction": {
                "maneuver": "DEPART",
                "instructions": "Head northwest on Trafalgar Sq/A4 toward Spring Gardens\nContinue to follow A4\nLeaving toll zone\nEntering toll zone\nLeaving toll zone in 210m at Haymarket"
              },
              "localizedValues": {
                "distance": {
                  "text": "0.3 km"
                },
                "staticDuration": {
                  "text": "1 min"
                }
              },
# rest of the response removed for readability

Schritt 2: „Suche entlang der Route“-Anfrage

Die Places API Text Search bietet eine „Search Along Route“-Anfrage, mit der Sie nach Orten entlang einer Route suchen können. Für eine „Search Along Route“-Anfrage müssen Sie mindestens die folgenden Informationen angeben:

  • Feldmaske, die angibt, welche Felder in der Antwort zurückgegeben werden
  • Ein gültiger API-Schlüssel für die in der Google Cloud Console aktivierte API
  • Suchtextstring, der angibt, nach welchen Orten Sie suchen, z. B. „scharfes vegetarisches Restaurant“
  • Die codierte Polylinie der Route, die vom vorherigen Routes API-Aufruf abgerufen wurde
  • URL für den Places Text Search API-Endpunkt
import requests

url = 'https://places.googleapis.com/v1/places:searchText'
api_key = 'YOUR_API_KEY'  # Replace with your actual API key
route_polyline = 'YOUR_ROUTE_POLYLINE'  # Replace with your encoded route polyline

headers = {
    'Content-Type': 'application/json',
    'X-Goog-Api-Key': api_key,
    'X-Goog-FieldMask': 'places.displayName,places.formattedAddress,places.priceLevel'
}

data = {
    "textQuery":
 "Spicy Vegetarian Food",
    "searchAlongRouteParameters": {
        "polyline": {
            "encodedPolyline": route_polyline
        }
    }
}

response = requests.post(url, headers=headers, json=data)

Beispieldaten für Anfragen

Bei der Anfrage „Search Along Route“ wird eine Liste von Orten zurückgegeben, die sich auf der Route befinden. Hier sehen Sie einen kurzen Ausschnitt der Beispieldaten. Die Länge der Antwort kann durch Festlegen der Parameter für die maximale Anzahl von Ergebnissen begrenzt werden. Wenn Sie weitere Felder hinzufügen, erhöht sich natürlich die Menge der empfangenen Daten. Weitere Informationen zur Places API-Antwort finden Sie in der Dokumentation.

{
  "places": [
    {
      "formattedAddress": "33 Haymarket, London SW1Y 4HA, UK",
      "displayName": {
        "text": "xxx",
        "languageCode": "en"
      }
    },
    {
      "formattedAddress": "224 Piccadilly, London W1J 9HP, UK",
      "priceLevel": "PRICE_LEVEL_MODERATE",
      "displayName": {
        "text": "yyy",
        "languageCode": "en"
      }
    },
    {
      "formattedAddress": "63 Neal St, London WC2H 9PJ, UK",
      "displayName": {
        "text": "zzz",
        "languageCode": "en"
      }
    },

Beispiel für Antwortdaten

Zusammenfassung der Routen und Umleitungszeiten

Es ist zwar gut, dass die Standorte angezeigt werden, aber es wäre hilfreich, wenn auch die Zeit angegeben würde, die benötigt wird, um dorthin zu gelangen. Bei der SAR in der Places API Text Search kann auch das Feld routing_summaries zurückgegeben werden, das sowohl die Dauer als auch die Entfernung der Fahrt enthält. Das Datenfeld „Routing summaries“ ist ein untergeordnetes Element des Antwortstamms. Daher darf das Präfix „places.“ nicht in der Feldmaske enthalten sein.

'X-Goog-FieldMask': 'places.displayName,places.formattedAddress,places.priceLevel,routingSummaries'

Damit Sie die Zusammenfassungen erhalten, müssen Sie auch den Parameter für den Ausgangsort für die Suche angeben, der für die Berechnungen verwendet wird.

"routingParameters": {
      "origin": {
        "latitude":  -37.8167,
        "longitude": 144.9619
      }
    }

Wenn Sie die Antwort erhalten, enthält sie einen neuen Abschnitt mit einer Zusammenfassung der Routenplanung, die Etappen mit Dauer und Entfernung in Metern enthält.

"routingSummaries": [
    {
      "legs": [
        {
          "duration": "662s",
          "distanceMeters": 3093
        }
      ]
    },

Als Nächstes sehen wir uns an, wie Sie festlegen können, an welcher Stelle der Route die Suche beginnen soll.

Schritt 3: Standort in 2 Stunden auf der Route abrufen

Stellen Sie sich einen normalen Anwendungsfall vor, in dem der Fahrer Restaurants nicht am Start der Route, sondern weiter unten auf der Strecke finden möchte. In unserem Beispiel dauert die Fahrt von London nach Manchester etwa 4 Stunden. Der Fahrer möchte ein Restaurant finden, das in zwei Stunden auf der Route liegt. Mit dieser Anfrage erhalten wir die Dauer von 120 Minuten × 60 Sekunden = 7.200 Sekunden.

In der Routes API-Antwort finden wir die Dauer der einzelnen Abschnitte der Route und der einzelnen Schritte eines Abschnitts. Achten Sie darauf, dass Sie das Feld legs in der Feldmaske in Ihrer Anfrage angeben. Wiederholen Sie die Schritte, bis die kumulierte Dauer das Limit von 2 Stunden oder 7.200 Sekunden erreicht. Dann haben wir den Abschnitt und Schritt gefunden, die als Ausgangspunkt der SAR-Anfrage festgelegt werden sollen.

Um Ihre Arbeit zu beschleunigen, können Sie die Polyline-Bibliothek für Python ausprobieren. Damit können Sie die Koordinaten aus dem Datenfeld polyline.encodedPolyline abrufen.

Führen Sie die folgenden Befehle im Terminal Ihrer Umgebung aus.

> pip install polyline
import requests
import polyline

# We've covered getting a Routes API response earlier,
data = response.json()

  # Extract the first route and its encoded polyline
  route = data["routes"][0]
  polyline_points = polyline.decode(route["polyline"]["encodedPolyline"])

  # Calculate total duration of the route in seconds
  total_duration_seconds = route["duration"]

  # Calculate the desired time offset in seconds, 2h = 120 minutes * 60
  desired_time_offset_seconds = time_offset_minutes * 60

  # Iterate through the legs and steps to find the point at the desired time offset
  elapsed_time_seconds = 0
  for leg in route["legs"]:
      for step in leg["steps"]:
          step_duration_seconds = step["staticDuration"]

          # Check if the desired time offset falls within this step, remove last "s" from string and convert to int
          second_value = int(step_duration_seconds[:-1])
          if elapsed_time_seconds + second_value >= desired_time_offset_seconds:
              # Interpolate to find the exact point within the step
              fraction_of_step = (desired_time_offset_seconds - elapsed_time_seconds) / second_value
              step_polyline_points = polyline.decode(step["polyline"]["encodedPolyline"])
              index = int(len(step_polyline_points) * fraction_of_step)
              return step_polyline_points[index]

          elapsed_time_seconds += second_value

  # If the point is not found (e.g., time offset exceeds route duration)
  return None

Nachdem wir den Ort auf der Route gefunden haben, der 2 Stunden nach Reisebeginn erreicht wird, können wir ihn in der Anfrage verwenden. Fügen Sie einfach den Breitengrad und den Längengrad in den Parameter „origin“ ein, der wiederum Teil des Parameters „routingParameters“ ist. Das Datenfeld „routingSummaries“, das wir bereits behandelt haben, wird empfohlen. Sie können auch zusätzliche Parameter wie den Fortbewegungsmodus und Anweisungen zum Vermeiden von Mautstraßen hinzufügen.


"routingParameters": {
    "origin": {
      "latitude": xx.xxxx,
      "longitude": yy.yyyy
    },
    "travelMode":"DRIVE",
    "routeModifiers": {
      "avoidTolls": true
    }
  }

Route mit Suchergebnissen

Beispielergebnisse (Autosymbol zur Kennzeichnung des Suchursprungs).

Wie Sie auf dem Bild sehen, gibt die API Orte zurück, die auf das Ende der Route ausgerichtet sind. Die Ergebnisse beginnen etwa in der Mitte der Fahrt. Die Suche basiert weiterhin auf denselben Google Maps Platform-Daten, bei denen unter anderem die Relevanz von Orten und die Entfernung berücksichtigt werden.

Schlusswort

In dieser Anleitung haben wir gelernt, wie wir zwei Google Maps Platform APIs, Routes und Places, kombinieren, um eine Reise zu planen und nach zwei Stunden Fahrt Orte zum Essen zu finden. Dazu müssen Sie eine codierte Polylinie mit den Breiten- und Längengradkoordinaten für jeden Schritt der Route abrufen und den Ursprung der Anfrage „Search Along Route“ festlegen, um die besten Ergebnisse zu erzielen.

Diese Funktion ist ein leistungsstarkes neues Tool, das die bereits vorhandene Textsuche und Suche in der Umgebung in der Places API ergänzt. Der logische nächste Schritt wäre, Standortdienste hinzuzufügen, damit Sie den Standort des Fahrers als Ausgangspunkt für die Suche nach dem optimalen Suchursprung verwenden können. Außerdem würde diese Funktion perfekt mit einem Sprachassistenten im Auto zusammenarbeiten, dem Sie Ihre bevorzugten Optionen für das Abendessen mitteilen könnten.

Nächste Aktionen

Empfohlene weiterführende Informationen:

Beitragende

Dieses Dokument wird von Google verwaltet. Der folgende Beitrag wurde ursprünglich von diesem Nutzer geschrieben.

Hauptautor: Mikko Toivanen | Google Maps Platform Solutions Engineer