Eine Routenmatrix ist ein zweidimensionales Array mit Routeninformationen, wobei die Zeilen den Startorten und die Spalten den Zielorten entsprechen. Anhand einer Liste von Ausgangs- und Zielorten berechnet die Klasse „Route Matrix“ die Entfernung und Dauer einer Route, die an jedem Ausgangsort beginnt und an jedem Zielort endet. Mit der Klasse „Route Matrix“ können Sie die Entfernung und Dauer einer Route für mehrere Start- und Zielorte berechnen.
Vollständigen Quellcode des Beispiels ansehen
In diesem Beispiel wird gezeigt, wie Sie mit der Klasse „Route Matrix“ die Entfernungen und Reisezeiten zwischen mehreren Start- und Zielorten berechnen.
TypeScript
// Initialize and add the map. let map; let markers: google.maps.marker.AdvancedMarkerElement[] = []; let center = { lat: 51.55, lng: -1.8 }; async function initMap(): Promise<void> { // Request the needed libraries. //@ts-ignore const [{Map}, {Place}, {AdvancedMarkerElement, PinElement}, {RouteMatrix}] = await Promise.all([ google.maps.importLibrary('maps') as Promise<google.maps.MapsLibrary>, google.maps.importLibrary('places') as Promise<google.maps.PlacesLibrary>, google.maps.importLibrary('marker') as Promise<google.maps.MarkerLibrary>, google.maps.importLibrary('routes') as Promise<google.maps.RoutesLibrary> ]); const bounds = new google.maps.LatLngBounds(); map = new Map(document.getElementById('map') as HTMLElement, { zoom: 8, center: center, mapId: 'DEMO_MAP_ID', }); // Build the request using Place instances. const origin1 = new Place({ id: "ChIJ83WZp86p2EcRbMrkYqGncBQ", // Greenwich, London, UK }); const origin2 = new Place({ id: "ChIJCSkVvleJc0gR8HHaTGpajKc", // Southampton, UK }); const destinationA = new Place({ id: "ChIJYdizgWaDcUgRH9eaSy6y5I4", // Bristol, UK }); const destinationB = new Place({ id: "ChIJ9VPsNNQCbkgRDmeGZdsGNBQ", // Cardiff, UK }); await Promise.all([ origin1.fetchFields({ fields: ['location', 'displayName']}), origin2.fetchFields({ fields: ['location', 'displayName']}), destinationA.fetchFields({ fields: ['location', 'displayName']}), destinationB.fetchFields({ fields: ['location', 'displayName']}), ]); const request = { origins: [origin1, origin2], destinations: [destinationA, destinationB], travelMode: 'DRIVING', units: google.maps.UnitSystem.METRIC, fields: ['distanceMeters', 'durationMillis', 'condition'], }; // Show the request. (document.getElementById("request") as HTMLDivElement).innerText = JSON.stringify(request, null, 2); // Get the RouteMatrix response. const response = await RouteMatrix.computeRouteMatrix(request); // Show the response. (document.getElementById("response") as HTMLDivElement).innerText = JSON.stringify(response, null, 2); // Add markers for the origins. for (const origin of request.origins) { if (origin.location) { const pin = new PinElement({ //@ts-ignore glyphText: "O", glyphColor: "white", background: "#137333", borderColor: "white", }); const marker = new AdvancedMarkerElement({ map, position: origin.location, content: pin.element, title: `Origin: ${origin.displayName}`, }); markers.push(marker); bounds.extend(origin.location); } } // Add markers for the destinations. for (let i = 0; i < request.destinations.length; i++) { const destination = request.destinations[i]; if (destination.location) { const pin = new PinElement({ //@ts-ignore glyphText: "D", glyphColor: "white", background: "#C5221F", borderColor: "white", }); const marker = new AdvancedMarkerElement({ map, position: destination.location, content: pin.element, title: `Destination: ${destination.displayName}`, }); markers.push(marker); bounds.extend(destination.location); } } // Fit the map to the bounds of all markers. map.fitBounds(bounds); } initMap();
JavaScript
// Initialize and add the map. let map; let markers = []; let center = { lat: 51.55, lng: -1.8 }; async function initMap() { // Request the needed libraries. //@ts-ignore const [{ Map }, { Place }, { AdvancedMarkerElement, PinElement }, { RouteMatrix }] = await Promise.all([ google.maps.importLibrary('maps'), google.maps.importLibrary('places'), google.maps.importLibrary('marker'), google.maps.importLibrary('routes') ]); const bounds = new google.maps.LatLngBounds(); map = new Map(document.getElementById('map'), { zoom: 8, center: center, mapId: 'DEMO_MAP_ID', }); // Build the request using Place instances. const origin1 = new Place({ id: "ChIJ83WZp86p2EcRbMrkYqGncBQ", // Greenwich, London, UK }); const origin2 = new Place({ id: "ChIJCSkVvleJc0gR8HHaTGpajKc", // Southampton, UK }); const destinationA = new Place({ id: "ChIJYdizgWaDcUgRH9eaSy6y5I4", // Bristol, UK }); const destinationB = new Place({ id: "ChIJ9VPsNNQCbkgRDmeGZdsGNBQ", // Cardiff, UK }); await Promise.all([ origin1.fetchFields({ fields: ['location', 'displayName'] }), origin2.fetchFields({ fields: ['location', 'displayName'] }), destinationA.fetchFields({ fields: ['location', 'displayName'] }), destinationB.fetchFields({ fields: ['location', 'displayName'] }), ]); const request = { origins: [origin1, origin2], destinations: [destinationA, destinationB], travelMode: 'DRIVING', units: google.maps.UnitSystem.METRIC, fields: ['distanceMeters', 'durationMillis', 'condition'], }; // Show the request. document.getElementById("request").innerText = JSON.stringify(request, null, 2); // Get the RouteMatrix response. const response = await RouteMatrix.computeRouteMatrix(request); // Show the response. document.getElementById("response").innerText = JSON.stringify(response, null, 2); // Add markers for the origins. for (const origin of request.origins) { if (origin.location) { const pin = new PinElement({ //@ts-ignore glyphText: "O", glyphColor: "white", background: "#137333", borderColor: "white", }); const marker = new AdvancedMarkerElement({ map, position: origin.location, content: pin.element, title: `Origin: ${origin.displayName}`, }); markers.push(marker); bounds.extend(origin.location); } } // Add markers for the destinations. for (let i = 0; i < request.destinations.length; i++) { const destination = request.destinations[i]; if (destination.location) { const pin = new PinElement({ //@ts-ignore glyphText: "D", glyphColor: "white", background: "#C5221F", borderColor: "white", }); const marker = new AdvancedMarkerElement({ map, position: destination.location, content: pin.element, title: `Destination: ${destination.displayName}`, }); markers.push(marker); bounds.extend(destination.location); } } // Fit the map to the bounds of all markers. map.fitBounds(bounds); } initMap();
CSS
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */ /* Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; } #container { height: 100%; display: flex; } #sidebar { flex-basis: 15rem; flex-grow: 1; padding: 1rem; max-width: 30rem; height: 100%; box-sizing: border-box; overflow: auto; } #map { flex-basis: 0; flex-grow: 4; height: 100%; } #sidebar { flex-direction: column; }
HTML
<html>
<head>
<title>Route matrix</title>
<link rel="stylesheet" type="text/css" href="./style.css" />
<script type="module" src="./index.js"></script>
</head>
<body>
<div id="container">
<div id="map"></div>
<div id="sidebar">
<h3 style="flex-grow: 0">Request</h3>
<pre style="flex-grow: 1" id="request"></pre>
<h3 style="flex-grow: 0">Response</h3>
<pre style="flex-grow: 1" id="response"></pre>
</div>
</div>
<!-- prettier-ignore -->
<script>(g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})
({key: "AIzaSyA6myHzS10YXdcazAFalmXvDkrYCp5cLc8", v: "beta"});</script>
</body>
</html>Testbeispiel
Anfragelimits
Für die Methode computeRouteMatrix gelten die folgenden Anfragebeschränkungen für Wegpunkte mit Adress- oder Ortsinstanzen sowie für Elemente. Elemente sind die Routen zwischen den einzelnen Start- und Zielorten in einer Routenmatrix. Die Anzahl der Elemente entspricht also der Anzahl der Startorte multipliziert mit der Anzahl der Zielorte. Wenn Sie beispielsweise 10 Quellen und 10 Ziele haben, sind das 100 Elemente:
- Die Anzahl der Elemente darf bei Routen, die keine
TRANSIT-Routen sind, 625 nicht überschreiten. - Wenn Sie eine
TRANSIT-Route angeben, darf die Anzahl der Elemente 100 nicht überschreiten. - Wenn Sie
TRAFFIC_AWARE_OPTIMALangeben, darf die Anzahl der Artikel 100 nicht überschreiten. - Wenn Sie Start- oder Zielorte mit Adressen oder Place-Instanzen angeben, können Sie auf diese Weise insgesamt bis zu 50 angeben.
Weitere Informationen finden Sie unter Transitroute abrufen.
Beispiel für eine Anfrage für eine Routenmatrix
Das folgende Beispiel zeigt eine ComputeRouteMatrixRequest. In diesem Beispiel wird Folgendes ausgeführt:
- Hier wird gezeigt, wie ein Array mit zwei Start- und zwei Zielwegpunkten angegeben wird. Die Methode berechnet eine Route von jedem Start- zu jedem Zielort. Die Antwort enthält also vier Routen.
Im Array befindet sich das erste Element an Index 0, das zweite an Index 1 usw. - Gibt die Felder an, die zurückgegeben werden sollen. In diesem Beispiel ist die Anfrage so konfiguriert, dass für jede Route
durationMillis,distanceMetersundconditionzurückgegeben werden.
TypeScript
const request = { origins: [origin1, origin2], destinations: [destinationA, destinationB], travelMode: 'DRIVING', units: google.maps.UnitSystem.METRIC, fields: ['distanceMeters', 'durationMillis', 'condition'], };
JavaScript
const request = { origins: [origin1, origin2], destinations: [destinationA, destinationB], travelMode: 'DRIVING', units: google.maps.UnitSystem.METRIC, fields: ['distanceMeters', 'durationMillis', 'condition'], };
Die Antwort enthält die vier möglichen Routen für die Kombination aller Start- und Ziel-Wegpunkte, wie im folgenden Beispiel gezeigt:
"matrix": { "rows": [ { "items": [ { "condition": "ROUTE_EXISTS", "distanceMeters": 202587, "durationMillis": 10040000 }, { "condition": "ROUTE_EXISTS", "distanceMeters": 252734, "durationMillis": 12240000 } ] }, { "items": [ { "condition": "ROUTE_EXISTS", "distanceMeters": 166135, "durationMillis": 6596000 }, { "condition": "ROUTE_EXISTS", "distanceMeters": 216282, "durationMillis": 8797000 } ] } ] }
Identifizieren Sie jede Route im Ergebnis anhand des Start- und Zielindex, um die entsprechende RouteMatrixItem im 2D-Array zu finden. Beispielsweise wäre die RouteMatrixItem, die die Route vom Startort mit dem Index 1 und dem Zielort mit dem Index 0 in der Anfrage beschreibt, das zweite Element des RouteMatrix.rows-Arrays und das erste Element des RouteMatrixRow.items-Arrays.
Das folgende Code-Snippet zeigt, wie Sie die RouteMatrixItem identifizieren, um die Route für einen bestimmten Start- und Zielort zu finden:
// Find the route for origin 'x' and destination 'y'. const {matrix} = await RouteMatrix.computeRouteMatrix(request); const myRouteMatrixItem = matrix.rows[x].items[y];
Felder für die Rückgabe auswählen
Wenn Sie eine Routenmatrix anfordern, müssen Sie mit einer Feldmaske angeben, welche Informationen in der Antwort zurückgegeben werden sollen.
Mit Feldmasken lässt sich auch verhindern, dass unnötige Daten angefordert werden, was wiederum hilft, die Antwortlatenz zu verringern und Informationen zu vermeiden, die Ihr System nicht benötigt.
Geben Sie die Liste der benötigten Felder an, indem Sie die Property
ComputeRoutesMatrixRequest.fields festlegen, wie im folgenden Snippet gezeigt:
fields: ['durationMillis', 'distanceMeters', 'condition'],
Zu verwendende Feldmasken festlegen
So können Sie festlegen, welche Felder Sie verwenden möchten, und die entsprechenden Feldmasken erstellen:
- Alle Felder anfordern mit der Feldmaske
['*']. - Sehen Sie sich die Hierarchie der Felder in der Klasse
RouteMatrixItemfür die gewünschten Felder an. Erstellen Sie Ihre Feldmasken anhand der Hierarchie der Felder aus dem vorherigen Schritt in diesem Format:
topLevelField[.secondLevelField][.thirdLevelField][...]
Beispiel: RouteMatrixItem
"travelAdvisory": { "fuelConsumptionMicroliters": 0, "tollInfo": { "estimatedPrices": [ { "currencyCode": "USD", "units": 4, "nanos": 400000000 } ] } },
Wenn Sie nur das Feld tollInfo für RouteMatrixItem zurückgeben möchten, sieht Ihre Feldmaske so aus:
fields: ['travelAdvisory.tollInfo']
Wenn Sie stattdessen den geschätzten Kraftstoffverbrauch anfordern möchten, sieht Ihre Feldmaske so aus:
fields: ['travelAdvisory.fuelConsumptionMicroliters']
Wenn Sie beides anfordern möchten, sieht Ihre Feldmaske so aus:
fields: ['travelAdvisory.fuelConsumptionMicroliters', 'travelAdvisory.tollInfo']
Wenn Sie alle Reisehinweise anfordern möchten, sieht Ihre Feldmaske so aus:
fields: ['travelAdvisory']
Matrix für Routen mit öffentlichen Verkehrsmitteln anfordern
Eine Matrix mit Routen für öffentliche Verkehrsmittel abrufen, in der die in der Region verfügbaren Optionen für öffentliche Verkehrsmittel verwendet werden. Zu den Transportmöglichkeiten gehören unter anderem Busse, U-Bahnen und Züge. So fordern Sie eine Matrix für Routen mit öffentlichen Verkehrsmitteln an:
- Setzen Sie den Wert
travelModeaufTRANSIT. - Fordern Sie das Feld
travelAdvisoryan.
Weitere Informationen zu ÖPNV-Routen