L'API Place Autocomplete Data ti consente di recuperare le previsioni dei luoghi in modo programmatico, per creare esperienze di completamento automatico personalizzate con un controllo più preciso di quanto non sia possibile fare con il widget di completamento automatico. In questa guida, imparerai a utilizzare Posiziona l'API Autocomplete Data per effettuare richieste di completamento automatico in base all'utente query.
L'esempio seguente mostra un'integrazione semplice type-ahead. Inserisci la query di ricerca, poi fai clic su per selezionare il risultato desiderato.
Richieste Autocomplete
Una richiesta di completamento automatico prende una stringa di input della query e restituisce un elenco di previsioni dei luoghi. A
effettua una richiesta di completamento automatico, chiama fetchAutocompleteSuggestions()
e passare una richiesta con le proprietà necessarie. La input
contiene la stringa da cercare; in un'applicazione tipica questo valore viene aggiornato
l'utente digita una query. La richiesta deve includere un elemento sessionToken
,
utilizzato ai fini della fatturazione.
Lo snippet seguente mostra la creazione di un corpo della richiesta e l'aggiunta di un token di sessione, quindi la chiamata
fetchAutocompleteSuggestions()
per visualizzare un elenco di
PlacePrediction
.
// Add an initial request body. let request = { input: "Tadi", locationRestriction: { west: -122.44, north: 37.8, east: -122.39, south: 37.78, }, origin: { lat: 37.7893, lng: -122.4039 }, includedPrimaryTypes: ["restaurant"], language: "en-US", region: "us", }; // Create a session token. const token = new AutocompleteSessionToken(); // Add the token to the request. // @ts-ignore request.sessionToken = token;
Limita previsioni di completamento automatico
Per impostazione predefinita, Place Autocomplete presenta tutti i tipi di luogo, con una differenziazione delle previsioni in base alle posizione e recupera tutti i campi di dati disponibili per il luogo selezionato dell'utente. Imposta luogo Opzioni di completamento automatico per presentare previsioni più pertinenti, limitando o differenziando i risultati.
Se limiti i risultati, il widget di completamento automatico ignora tutti i risultati al di fuori del area ad accesso limitato. È prassi comune limitare i risultati ai limiti della mappa. Differenziazione dei risultati mostra al widget di completamento automatico i risultati all'interno dell'area specificata, ma alcune corrispondenze potrebbero essere al di fuori di quell'area.
Utilizza la proprietà origin
per specificare il punto di origine da cui calcolare
distanza geodetica dalla destinazione. Se questo valore viene omesso, la distanza non viene restituita.
Utilizza la includedPrimaryTypes
per specificare fino a cinque tipi di luogo.
Se non viene specificato alcun tipo, verranno restituiti luoghi di tutti i tipi.
Visualizza i dettagli del luogo
Per restituire un Place
oggetto da un risultato della previsione di un luogo, prima chiamata toPlace()
,
quindi chiama fetchFields()
sull'oggetto Place
risultante (l'ID sessione della previsione del luogo viene incluso automaticamente). La chiamata a fetchFields()
termina il
sessione di completamento automatico.
let place = suggestions[0].placePrediction.toPlace(); // Get first predicted place. await place.fetchFields({ fields: ["displayName", "formattedAddress"], }); const placeInfo = document.getElementById("prediction"); placeInfo.textContent = "First predicted place: " + place.displayName + ": " + place.formattedAddress;
Token di sessione
I token di sessione raggruppano le fasi di query e selezione della ricerca con completamento automatico di un utente in un sessione discreta ai fini della fatturazione. La sessione inizia quando l'utente inizia a digitare. La sessione termina quando l'utente seleziona un luogo e viene effettuata una chiamata a Place Details.
Per creare un nuovo token di sessione e aggiungerlo a una richiesta, crea un'istanza di
AutocompleteSessionToken
,
imposta sessionToken
della richiesta di utilizzare i token, come mostrato nello snippet seguente:
// Create a session token. const token = new AutocompleteSessionToken(); // Add the token to the request. // @ts-ignore request.sessionToken = token;
Una sessione viene terminata quando fetchFields()
. Dopo aver creato l'istanza Place
, non è necessario superare la sessione
in fetchFields()
poiché viene gestito automaticamente.
await place.fetchFields({ fields: ["displayName", "formattedAddress"], });
await place.fetchFields({ fields: ['displayName'], });
Crea un token di sessione per la prossima sessione creando una nuova istanza di AutocompleteSessionToken
.
Suggerimenti per il token di sessione:
- Utilizza i token di sessione per tutte le chiamate Place Autocomplete.
- Generare un nuovo token per ogni sessione.
- Passa un token di sessione univoco per ogni nuova sessione. Utilizzo dello stesso token per più di una sessione farà sì che ogni richiesta venga fatturata individualmente.
Facoltativamente, puoi omettere il token di sessione di completamento automatico da una richiesta. Se il token di sessione è omesso, ogni richiesta viene fatturata separatamente, attivando il Completamento automatico - Per richiesta . Se riutilizzi un token di sessione, la sessione viene considerata non valida e le richieste vengono addebitate come se non fosse stato fornito alcun token di sessione.
Esempio
Mentre l'utente digita una query, viene chiamata una richiesta di completamento automatico le sequenze di tasti (non per carattere) e viene restituito un elenco di possibili risultati. Quando l'utente effettua una selezione dall'elenco dei risultati, la selezione viene conteggiata come una richiesta, in cui tutte le richieste effettuate durante la ricerca vengono raggruppate conteggiati come una singola richiesta. Se l'utente seleziona un luogo, la query di ricerca viene disponibile senza costi aggiuntivi e viene addebitata solo la richiesta di dati del luogo. Se l'utente non effettua una entro pochi minuti dall'inizio della sessione, solo il della query di ricerca viene addebitato.
Dal punto di vista di un'app, il flusso di eventi si svolge in questo modo:
- Un utente inizia a digitare una query per cercare "Parigi, Francia".
- Dopo aver rilevato l'input dell'utente, l'app crea una nuova sessione "Token A".
- Mentre l'utente digita, l'API effettua una richiesta di completamento automatico a intervalli
con un nuovo elenco di potenziali risultati per ciascuno:
"P"
"Par"
"Parigi",
"Parigi, Ven"
- Quando l'utente effettua una selezione:
- Tutte le richieste derivanti dalla query vengono raggruppate e aggiunte al sessione rappresentata da "Token A", come richiesta singola.
- La selezione dell'utente viene conteggiata come una richiesta Dettagli luogo e viene aggiunta alla sessione rappresentata da "Token A".
- La sessione si è conclusa e l'app scarta il "Token A".
Codice di esempio completo
Questa sezione contiene esempi completi che mostrano come utilizzare l'API Place Autocomplete Data .Posiziona le previsioni di completamento automatico
L'esempio seguente mostra la chiamata
fetchAutocompleteSuggestions()
per l'input "Tadi", quindi chiama toPlace()
sul primo risultato della previsione, seguito da una chiamata al numero fetchFields()
per conoscere i dettagli del luogo.
TypeScript
/** * Demonstrates making a single request for Place predictions, then requests Place Details for the first result. */ async function init() { // @ts-ignore const { Place, AutocompleteSessionToken, AutocompleteSuggestion } = await google.maps.importLibrary("places") as google.maps.PlacesLibrary; // Add an initial request body. let request = { input: "Tadi", locationRestriction: { west: -122.44, north: 37.8, east: -122.39, south: 37.78 }, origin: { lat: 37.7893, lng: -122.4039 }, includedPrimaryTypes: ["restaurant"], language: "en-US", region: "us", }; // Create a session token. const token = new AutocompleteSessionToken(); // Add the token to the request. // @ts-ignore request.sessionToken = token; // Fetch autocomplete suggestions. const { suggestions } = await AutocompleteSuggestion.fetchAutocompleteSuggestions(request); const title = document.getElementById('title') as HTMLElement; title.appendChild(document.createTextNode('Query predictions for "' + request.input + '":')); for (let suggestion of suggestions) { const placePrediction = suggestion.placePrediction; // Create a new list element. const listItem = document.createElement('li'); const resultsElement = document.getElementById("results") as HTMLElement; listItem.appendChild(document.createTextNode(placePrediction.text.toString())); resultsElement.appendChild(listItem); } let place = suggestions[0].placePrediction.toPlace(); // Get first predicted place. await place.fetchFields({ fields: ['displayName', 'formattedAddress'], }); const placeInfo = document.getElementById("prediction") as HTMLElement; placeInfo.textContent = 'First predicted place: ' + place.displayName + ': ' + place.formattedAddress; } init();
JavaScript
/** * Demonstrates making a single request for Place predictions, then requests Place Details for the first result. */ async function init() { // @ts-ignore const { Place, AutocompleteSessionToken, AutocompleteSuggestion } = await google.maps.importLibrary("places"); // Add an initial request body. let request = { input: "Tadi", locationRestriction: { west: -122.44, north: 37.8, east: -122.39, south: 37.78, }, origin: { lat: 37.7893, lng: -122.4039 }, includedPrimaryTypes: ["restaurant"], language: "en-US", region: "us", }; // Create a session token. const token = new AutocompleteSessionToken(); // Add the token to the request. // @ts-ignore request.sessionToken = token; // Fetch autocomplete suggestions. const { suggestions } = await AutocompleteSuggestion.fetchAutocompleteSuggestions(request); const title = document.getElementById("title"); title.appendChild( document.createTextNode('Query predictions for "' + request.input + '":'), ); for (let suggestion of suggestions) { const placePrediction = suggestion.placePrediction; // Create a new list element. const listItem = document.createElement("li"); const resultsElement = document.getElementById("results"); listItem.appendChild( document.createTextNode(placePrediction.text.toString()), ); resultsElement.appendChild(listItem); } let place = suggestions[0].placePrediction.toPlace(); // Get first predicted place. await place.fetchFields({ fields: ["displayName", "formattedAddress"], }); const placeInfo = document.getElementById("prediction"); placeInfo.textContent = "First predicted place: " + place.displayName + ": " + place.formattedAddress; } init();
CSS
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */ #map { height: 100%; } /* * Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; }
HTML
<html> <head> <title>Place Autocomplete Data API Predictions</title> <link rel="stylesheet" type="text/css" href="./style.css" /> <script type="module" src="./index.js"></script> </head> <body> <div id="title"></div> <ul id="results"></ul> <p><span id="prediction"></span></p> <img class="powered-by-google" src="https://storage.googleapis.com/geo-devrel-public-buckets/powered_by_google_on_white.png" alt="Powered by Google" /> <!-- 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: "AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg", v: "weekly"});</script> </body> </html>
Prova Sample
Posiziona il completamento automatico con tipo di completamento automatico con le sessioni
Questo esempio mostra la chiamata
fetchAutocompleteSuggestions()
in base alle query degli utenti, mostrando un elenco di
luoghi previsti in risposta e, infine, recuperando
i dettagli relativi al luogo selezionato. L'esempio mostra anche l'uso di token di sessione per
Raggruppa una query utente con la richiesta Place Details finale.
TypeScript
let title; let results; let input; let token; // Add an initial request body. let request = { input: "", locationRestriction: { west: -122.44, north: 37.8, east: -122.39, south: 37.78 }, origin: { lat: 37.7893, lng: -122.4039 }, includedPrimaryTypes: ["restaurant"], language: "en-US", region: "us", }; async function init() { token = new google.maps.places.AutocompleteSessionToken(); title = document.getElementById('title'); results = document.getElementById('results'); input = document.querySelector("input"); input.addEventListener("input", makeAcRequest); request = refreshToken(request) as any; } async function makeAcRequest(input) { // Reset elements and exit if an empty string is received. if (input.target.value == '') { title.innerText = ''; results.replaceChildren(); return; } // Add the latest char sequence to the request. request.input = input.target.value; // Fetch autocomplete suggestions and show them in a list. // @ts-ignore const { suggestions } = await google.maps.places.AutocompleteSuggestion.fetchAutocompleteSuggestions(request); title.innerText = 'Query predictions for "' + request.input + '"'; // Clear the list first. results.replaceChildren(); for (const suggestion of suggestions) { const placePrediction = suggestion.placePrediction; // Create a link for the place, add an event handler to fetch the place. const a = document.createElement('a'); a.addEventListener('click', () => { onPlaceSelected(placePrediction.toPlace()); }); a.innerText = placePrediction.text.toString(); // Create a new list element. const li = document.createElement('li'); li.appendChild(a); results.appendChild(li); } } // Event handler for clicking on a suggested place. async function onPlaceSelected(place) { await place.fetchFields({ fields: ['displayName', 'formattedAddress'], }); let placeText = document.createTextNode(place.displayName + ': ' + place.formattedAddress); results.replaceChildren(placeText); title.innerText = 'Selected Place:'; input.value = ''; refreshToken(request); } // Helper function to refresh the session token. async function refreshToken(request) { // Create a new session token and add it to the request. token = new google.maps.places.AutocompleteSessionToken(); request.sessionToken = token; return request; } declare global { interface Window { init: () => void; } } window.init = init;
JavaScript
let title; let results; let input; let token; // Add an initial request body. let request = { input: "", locationRestriction: { west: -122.44, north: 37.8, east: -122.39, south: 37.78, }, origin: { lat: 37.7893, lng: -122.4039 }, includedPrimaryTypes: ["restaurant"], language: "en-US", region: "us", }; async function init() { token = new google.maps.places.AutocompleteSessionToken(); title = document.getElementById("title"); results = document.getElementById("results"); input = document.querySelector("input"); input.addEventListener("input", makeAcRequest); request = refreshToken(request); } async function makeAcRequest(input) { // Reset elements and exit if an empty string is received. if (input.target.value == "") { title.innerText = ""; results.replaceChildren(); return; } // Add the latest char sequence to the request. request.input = input.target.value; // Fetch autocomplete suggestions and show them in a list. // @ts-ignore const { suggestions } = await google.maps.places.AutocompleteSuggestion.fetchAutocompleteSuggestions( request, ); title.innerText = 'Query predictions for "' + request.input + '"'; // Clear the list first. results.replaceChildren(); for (const suggestion of suggestions) { const placePrediction = suggestion.placePrediction; // Create a link for the place, add an event handler to fetch the place. const a = document.createElement("a"); a.addEventListener("click", () => { onPlaceSelected(placePrediction.toPlace()); }); a.innerText = placePrediction.text.toString(); // Create a new list element. const li = document.createElement("li"); li.appendChild(a); results.appendChild(li); } } // Event handler for clicking on a suggested place. async function onPlaceSelected(place) { await place.fetchFields({ fields: ["displayName", "formattedAddress"], }); let placeText = document.createTextNode( place.displayName + ": " + place.formattedAddress, ); results.replaceChildren(placeText); title.innerText = "Selected Place:"; input.value = ""; refreshToken(request); } // Helper function to refresh the session token. async function refreshToken(request) { // Create a new session token and add it to the request. token = new google.maps.places.AutocompleteSessionToken(); request.sessionToken = token; return request; } window.init = init;
CSS
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */ #map { height: 100%; } /* * Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; } a { cursor: pointer; text-decoration: underline; color: blue; } input { width: 300px; }
HTML
<html> <head> <title>Place Autocomplete Data API Session</title> <link rel="stylesheet" type="text/css" href="./style.css" /> <script type="module" src="./index.js"></script> </head> <body> <input id="input" type="text" placeholder="Search for a place..." /> <div id="title"></div> <ul id="results"></ul> <img class="powered-by-google" src="https://storage.googleapis.com/geo-devrel-public-buckets/powered_by_google_on_white.png" alt="Powered by Google" /> <!-- The `defer` attribute causes the script to execute after the full HTML document has been parsed. For non-blocking uses, avoiding race conditions, and consistent behavior across browsers, consider loading using Promises. See https://developers.google.com/maps/documentation/javascript/load-maps-js-api for more information. --> <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg&callback=init&libraries=places&v=weekly" defer ></script> </body> </html>