Una matrice dei percorsi è un array bidimensionale di informazioni sui percorsi, in cui le righe corrispondono alle origini e le colonne alle destinazioni. Dato un elenco di luoghi di partenza e destinazioni, la classe Matrice dei percorsi calcola la distanza e la durata di un percorso che inizia in ogni luogo di partenza e termina in ogni destinazione. Utilizza la classe Matrice dei percorsi per calcolare la distanza e la durata di un percorso per più origini e destinazioni.
Visualizza il codice sorgente dell'esempio completo
Questo esempio mostra come utilizzare la classe Matrice dei percorsi per calcolare le distanze e le durate dei viaggi tra più origini e destinazioni.
TypeScript
// Initialize and add the map. let map: google.maps.Map; const markers: google.maps.marker.AdvancedMarkerElement[] = []; const center = { lat: 51.55, lng: -1.8 }; async function init(): Promise<void> { // Request the needed libraries. const [ { Map }, { Place }, { AdvancedMarkerElement, PinElement }, { RouteMatrix }, { LatLngBounds, UnitSystem }, ] = await Promise.all([ google.maps.importLibrary('maps'), google.maps.importLibrary('places'), google.maps.importLibrary('marker'), google.maps.importLibrary('routes'), google.maps.importLibrary('core'), ]); const bounds = new LatLngBounds(); map = new Map(document.getElementById('map')!, { zoom: 8, 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 destinations = [destinationA, destinationB]; const origins = [origin1, origin2]; const request: google.maps.routes.ComputeRouteMatrixRequest = { origins, destinations, travelMode: 'DRIVING', units: 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 origins) { if (origin.location) { const pin = new PinElement({ glyphText: 'O', glyphColor: 'white', background: '#137333', borderColor: 'white', }); const marker = new AdvancedMarkerElement({ map, position: origin.location, title: `Origin: ${origin.displayName}`, }); marker.append(pin); markers.push(marker); bounds.extend(origin.location); } } // Add markers for the destinations. for (const destination of destinations) { if (destination.location) { const pin = new PinElement({ glyphText: 'D', glyphColor: 'white', background: '#C5221F', borderColor: 'white', }); const marker = new AdvancedMarkerElement({ map, position: destination.location, content: pin, title: `Destination: ${destination.displayName ?? 'Unknown'}`, }); markers.push(marker); bounds.extend(destination.location); } } // Fit the map to the bounds of all markers. map.fitBounds(bounds); } void init();
JavaScript
// Initialize and add the map. let map; const markers = []; const center = { lat: 51.55, lng: -1.8 }; async function init() { // Request the needed libraries. const [ { Map }, { Place }, { AdvancedMarkerElement, PinElement }, { RouteMatrix }, { LatLngBounds, UnitSystem }, ] = await Promise.all([ google.maps.importLibrary('maps'), google.maps.importLibrary('places'), google.maps.importLibrary('marker'), google.maps.importLibrary('routes'), google.maps.importLibrary('core'), ]); const bounds = new LatLngBounds(); map = new Map(document.getElementById('map'), { zoom: 8, 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 destinations = [destinationA, destinationB]; const origins = [origin1, origin2]; const request = { origins, destinations, travelMode: 'DRIVING', units: 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 origins) { if (origin.location) { const pin = new PinElement({ glyphText: 'O', glyphColor: 'white', background: '#137333', borderColor: 'white', }); const marker = new AdvancedMarkerElement({ map, position: origin.location, title: `Origin: ${origin.displayName}`, }); marker.append(pin); markers.push(marker); bounds.extend(origin.location); } } // Add markers for the destinations. for (const destination of destinations) { if (destination.location) { const pin = new PinElement({ glyphText: 'D', glyphColor: 'white', background: '#C5221F', borderColor: 'white', }); const marker = new AdvancedMarkerElement({ map, position: destination.location, content: pin, title: `Destination: ${destination.displayName ?? 'Unknown'}`, }); markers.push(marker); bounds.extend(destination.location); } } // Fit the map to the bounds of all markers. map.fitBounds(bounds); } void init();
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>
<script>
// prettier-ignore
(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: "GOOGLE_MAPS_API_KEY"
});
</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>
</body>
</html>Prova l'esempio
Limiti per le richieste
Il metodo computeRouteMatrix applica i seguenti limiti di richiesta per i waypoint che utilizzano istanze di indirizzi o luoghi e per gli elementi. Gli elementi sono i percorsi tra ogni origine e destinazione in una matrice dei percorsi, pertanto il numero di elementi è il numero di origini moltiplicato per il numero di destinazioni. Ad esempio, se hai 10 origini e 10 destinazioni, hai 100 elementi:
- Il numero di elementi non può superare 625 per i percorsi che non sono percorsi
TRANSIT. TRANSIT- Se specifichi
TRAFFIC_AWARE_OPTIMAL, il numero di elementi non può superare 100. - Se specifichi le origini o le destinazioni utilizzando indirizzi o istanze Place, puoi specificare fino a 50 elementi in questo modo.
Per ulteriori dettagli, consulta Ottieni un percorso con il trasporto pubblico.
Esempio di richiesta di matrice dei percorsi
L'esempio seguente mostra un ComputeRouteMatrixRequest. Questo esempio esegue le seguenti operazioni:
- Mostra come specificare un array di due waypoint di partenza e due di destinazione. Il metodo calcola un percorso da ogni origine a ogni destinazione, pertanto la risposta contiene quattro percorsi.
Nell'array, il primo elemento ha indice 0, il secondo indice 1 e così via. - Specifica i campi da restituire. In questo esempio, la richiesta è configurata per restituire
durationMillis,distanceMeterseconditionper ogni percorso.
TypeScript
const destinations = [destinationA, destinationB]; const origins = [origin1, origin2]; const request: google.maps.routes.ComputeRouteMatrixRequest = { origins, destinations, travelMode: 'DRIVING', units: UnitSystem.METRIC, fields: ['distanceMeters', 'durationMillis', 'condition'], };
JavaScript
const destinations = [destinationA, destinationB]; const origins = [origin1, origin2]; const request = { origins, destinations, travelMode: 'DRIVING', units: UnitSystem.METRIC, fields: ['distanceMeters', 'durationMillis', 'condition'], };
La risposta contiene i quattro percorsi possibili per la combinazione di tutti i waypoint di origine e destinazione, come mostrato nell'esempio seguente:
"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 } ] } ] }
Identifica ogni percorso nel risultato utilizzando l'indice di origine e destinazione per trovare il RouteMatrixItem corrispondente nell'array 2D. Ad esempio, l'elemento RouteMatrixItem che descrive il percorso calcolato dall'origine all'indice 1 e dalla destinazione 0 nella richiesta si troverebbe nel secondo elemento dell'array RouteMatrix.rows e nel primo elemento dell'array RouteMatrixRow.items.
Il seguente snippet di codice mostra come identificare RouteMatrixItem per trovare il percorso per un'origine e una destinazione specifiche:
// Find the route for origin 'x' and destination 'y'. const {matrix} = await RouteMatrix.computeRouteMatrix(request); const myRouteMatrixItem = matrix.rows[x].items[y];
Scegli i campi da restituire
Quando richiedi una matrice dei percorsi, devi utilizzare una maschera di campo per specificare quali informazioni deve restituire la risposta.
L'utilizzo di una maschera di campo garantisce inoltre che non vengano richiesti dati non necessari, il che a sua volta contribuisce alla latenza della risposta ed evita di restituire informazioni di cui il sistema non ha bisogno.
Specifica l'elenco dei campi necessari impostando la proprietà ComputeRoutesMatrixRequest.fields, come mostrato nello snippet seguente:
fields: ['durationMillis', 'distanceMeters', 'condition'],
Determina quali maschere di campo utilizzare
Ecco come determinare i campi da utilizzare e creare le relative maschere:
- Richiedi tutti i campi utilizzando una maschera di campo di
['*']. - Esamina la gerarchia dei campi nella classe
RouteMatrixItemper i campi che ti interessano. Crea le maschere di campo utilizzando la gerarchia dei campi mostrata nel passaggio precedente, utilizzando questo formato:
topLevelField[.secondLevelField][.thirdLevelField][...]
Ad esempio, per questo RouteMatrixItem:
"travelAdvisory": { "fuelConsumptionMicroliters": 0, "tollInfo": { "estimatedPrices": [ { "currencyCode": "USD", "units": 4, "nanos": 400000000 } ] } },
Se vuoi restituire solo il campo tollInfo per RouteMatrixItem, la maschera di campo è la seguente:
fields: ['travelAdvisory.tollInfo']
Se invece vuoi richiedere il consumo di carburante stimato, la maschera di campo è la seguente:
fields: ['travelAdvisory.fuelConsumptionMicroliters']
Se vuoi richiedere entrambi, la maschera di campo è la seguente:
fields: ['travelAdvisory.fuelConsumptionMicroliters', 'travelAdvisory.tollInfo']
Se vuoi richiedere l'insieme completo di avvertenze per i viaggi, la maschera di campo è la seguente:
fields: ['travelAdvisory']
Richiedi una matrice dei percorsi con il trasporto pubblico
Ottieni una matrice dei percorsi di trasporto pubblico che utilizza le opzioni di trasporto pubblico disponibili nella regione. Le opzioni di trasporto pubblico possono includere, tra gli altri, autobus, metropolitane e treni. Per richiedere una matrice dei percorsi con il trasporto pubblico:
- Imposta
travelModesuTRANSIT - Richiedi il campo
travelAdvisory.
Scopri di più sui percorsi con i mezzi pubblici.