In diesem Dokument wird beschrieben, wie Sie entlang einer geplanten Route ein Hotel, ein Restaurant oder eine Tankstelle finden. Sie erfahren, wie Sie mit der Routes API eine Polylinie für eine Route abrufen und diese mit der Places API-Anfrage Suche entlang der Route (SAR) verwenden. Außerdem erfahren Sie, wie Sie die besten Ergebnisse erzielen, indem Sie den Startpunkt der Suche entlang der Route festlegen, z. B. 2 Stunden nach Beginn der Fahrt.
Routes API
Um nach Orten entlang der Route zu suchen, verwenden wir die Routes API. Die Routendaten aus der Routes API-Antwort sind eine Reihe von LatLong-Koordinaten vom Start- bis 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 weitergeben. Die Polyliniencodierung ist ein verlustbehafteter Komprimierungsalgorithmus, mit dem sich eine Reihe von Koordinaten als einzelner String speichern lässt. Es ist nicht zwingend erforderlich, die Polylinie aus der Routes API abzurufen. Sie können die Daten auch selbst erstellen. Für dieses Beispiel ist die Routes API jedoch eine schnelle und zuverlässige Möglichkeit, die erforderlichen Daten abzurufen.
In dieser Anleitung verwenden wir eine Route von London (-37.8167,144.9619) nach Manchester (-37.8155, 144.9663).
Route im Beispiel: London nach Manchester
Schritt 1: Eine Route über die Routes API abrufen
Wenn Sie eine Route über die Routes API abrufen möchten, müssen Sie die folgenden Informationen angeben:
- Abfahrts- und Zielort
- Die Mobilitätsform (Autofahren, zu Fuß gehen usw.)
- Alle Wegpunkte (optional)
- Alle Einstellungen (z. B. Mautstraßen vermeiden, Autobahnen vermeiden)
- Die Option „Verkehrsabhängiges Routing“ liefert die genauesten Schätzungen. Sie ist jedoch 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 Aufruf darauf, das Feld „encodedPolyline“ in die Feldmaske für Header aufzunehmen.
headers = {
"Content-Type": "application/json",
"X-Goog-FieldMask": "routes.distanceMeters,routes.duration,routes.legs,routes.polyline.encodedPolyline"
}
Die vollständige Dokumentation mit Beispielen zum Abrufen einer Route und zum Abrufen von Routenpolylinien.
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 Gesamtstrecke der Route
- Die Gesamtdauer der Route
- Etappen und Schritte der Route
- Die codierte Polylinie der Route, der Abschnitte 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: Anfrage „Suchen entlang der Route“
Die Places API Text Search bietet die Anfrage „Search Along Route“, mit der Sie nach Orten entlang einer Route suchen können. Für eine Suche entlang einer Route müssen Sie mindestens die folgenden Informationen angeben:
- Feldmaske, die angibt, welche Felder in der Antwort zurückgegeben werden
- Einen gültigen API-Schlüssel für die in der Google Cloud Console aktivierte API
- Suchstring, in dem Sie angeben, 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 Endpunkt der Places Text Search API
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)
Beispiel für Anfragedaten
Bei der Anfrage „An Orten entlang der Route suchen“ wird eine Liste von Orten zurückgegeben, die sich entlang der Route befinden. Hier ist ein kurzer Teil der Beispieldaten. Die Länge der Antwort kann durch Festlegen der maximalen Anzahl von Ergebnisparametern begrenzt werden. Durch das Hinzufügen weiterer Felder 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
Routingübersicht und Umleitungszeiten
Es ist zwar gut, die Standorte zu finden, aber es ist auch hilfreich, anzugeben, wie lange es dauert, bis Sie dort sind. SAR in der Places API-Textsuche kann auch ein Feld routing summaries zurückgeben, das sowohl die Dauer als auch die zurückgelegte Entfernung enthält. Das Datenfeld für die Zusammenfassung der Routen ist ein untergeordnetes Element des Antwortstamms. Das Präfix „places.“ darf daher nicht in die Feldmaske aufgenommen werden.
'X-Goog-FieldMask': 'places.displayName,places.formattedAddress,places.priceLevel,routingSummaries'
Damit Sie die Zusammenfassungen erhalten, müssen Sie auch den Parameter „Ort des Ursprungs“ für die Suche angeben, der für die Berechnungen verwendet wird.
"routingParameters": {
"origin": {
"latitude": -37.8167,
"longitude": 144.9619
}
}
Die Antwort enthält einen neuen Abschnitt mit einer Zusammenfassung der Route, 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, wo entlang der Route die Suche beginnen soll.
Schritt 3: Standort 2 Stunden entlang der Route abrufen
Stellen Sie sich einen normalen Anwendungsfall vor, bei dem der Fahrer Restaurants nicht am Anfang der Route, sondern weiter unten finden möchte. In unserem Beispiel dauert die Fahrt von London nach Manchester etwa 4 Stunden. Der Fahrer möchte ein Restaurant finden, das sich zwei Stunden entlang der Route befindet. Mit dieser Anfrage erhalten wir eine Dauer von 120 Minuten * 60 Sekunden = 7.200 Sekunden.
In der Antwort der Routes API finden wir die Dauer jedes Abschnitts der Route und jedes Schritts eines Abschnitts. Achten Sie darauf, das Feld legs in die Feldmaske Ihrer Anfrage aufzunehmen. Wiederhole die Schritte für die einzelnen Beine und Schritte, bis die Gesamtdauer das Limit von 2 Stunden oder 7.200 Sekunden erreicht. Dann haben wir den Abschnitt und den Schritt gefunden, der als Ursprung der SAR-Anfrage festgelegt werden soll.
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.endodedPolyline abrufen.
Führen Sie die folgenden Befehle in Ihrem Terminal 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 zwei Stunden nach Beginn der Fahrt liegt, können wir ihn in der Anfrage verwenden. Fügen Sie dazu einfach den Breiten- und Längengrad in den Parameter „origin“ ein, der wiederum Teil des Parameters „routingParameters“ ist. Wir empfehlen das Datenfeld „routingSummaries“, das wir bereits kennengelernt haben. Sie können auch zusätzliche Parameter wie den Verkehrsmodus und Anweisungen zum Umfahren von Mautstellen hinzufügen.
"routingParameters": {
"origin": {
"latitude": xx.xxxx,
"longitude": yy.yyyy
},
"travelMode":"DRIVE",
"routeModifiers": {
"avoidTolls": true
}
}
Beispielergebnisse (Autosymbol zum Anzeigen des Suchursprungs hinzugefügt)
Wie Sie auf dem Bild sehen, gibt die API Orte zurück, die sich auf das Ende der Route konzentrieren. 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 und Entfernung des Orts berücksichtigt werden.
Schlusswort
In dieser Anleitung haben wir gelernt, wie Sie zwei Google Maps Platform APIs, Routes und Places, kombinieren, um eine Fahrt zu planen und nach zwei Stunden Fahrt Orte zum Essen zu finden. Sie müssen eine codierte Polylinie mit den Breiten- und Längengraden für jeden Schritt der Route abrufen und den Ursprung der Anfrage „Suche entlang der Route“ festlegen, um die besten Ergebnisse zu erzielen.
Mit dieser Funktion wird der bereits vorhandenen Textsuche und Suche in der Nähe in der Places API ein leistungsstarkes neues Tool hinzugefügt. Als Nächstes sollten Sie Standortdienste hinzufügen, damit Sie den Standort des Fahrers als Ausgangspunkt für die Suche nach dem optimalen Startpunkt verwenden können. Außerdem würde diese Funktion perfekt mit einem Sprachassistenten im Auto zusammenarbeiten, dem Sie Ihre bevorzugten Optionen fürs Essen mitteilen könnten.
Nächste Schritte
- Probieren Sie die Beispiele in der Dokumentation aus.
- Feedback geben.
Weitere Informationen:
Mitwirkende
Dieses Dokument wird von Google gepflegt. Der folgende Mitwirkende hat ihn ursprünglich verfasst.
Hauptautor: Mikko Toivanen | Google Maps Platform Solutions Engineer