Esta es la versión experimental del nuevo Place Autocomplete mejorado. Autocomplete es una función de la biblioteca de Places de la API de Maps JavaScript. Puedes usarla para incluir en tus aplicaciones el comportamiento de escritura anticipada del campo de búsqueda de Google Maps. El servicio de Autocomplete puede buscar coincidencias para palabras completas y subcadenas para resolver nombres de lugares, direcciones y Plus Codes. Así, las aplicaciones pueden enviar consultas, a medida que el usuario escribe, para proporcionar predicciones de lugares en el momento.
Requisitos previos
Aquí presentamos el nuevo Place Autocomplete (versión experimental). Para usar Text Search (versión preliminar), tienes que habilitar la "API de Places" en tu proyecto de Google Cloud y especificar el canal alfa (v: "alpha"
) en tu cargador de arranque. Consulta Cómo comenzar para obtener información detallada.
Novedades
Place Autocomplete (versión experimental) incluye las siguientes mejoras:
- La IU del widget de Autocomplete admite la localización regional (incluidos los idiomas RTL) para el marcador de posición de entrada de texto, el logotipo de la lista de predicciones y las predicciones sobre lugares.
- Se mejoró la accesibilidad, incluida la compatibilidad con los lectores de pantalla y la interacción con el teclado.
- El widget de Autocomplete muestra la nueva clase Place para simplificar el manejo del objeto que se devuelve.
- Incluye una mejor compatibilidad con dispositivos móviles y pantallas pequeñas.
- Tiene un mejor rendimiento y una apariencia gráfica mejorada.
Agrega un widget de Autocomplete
Puedes agregar un widget de Autocomplete a una página web o a un mapa de Google Maps. El widget de Autocomplete crea un campo de entrada de texto, proporciona predicciones de lugares en una lista de selección de IU y muestra detalles de lugares en respuesta a un clic del usuario a través del objeto de escucha gmp-placeselect
. En esta sección, se muestra cómo agregar un widget de Autocomplete a una página web o a un mapa de Google.
Cómo agregar un widget de Autocomplete a una página web
Para agregar el widget de Autocomplete a una página web, crea un nuevo elemento input
, úsalo para crear un nuevo google.maps.places.PlaceAutocompleteElement
y agrégalo a la página como se muestra en el siguiente ejemplo:
TypeScript
// Request needed libraries. //@ts-ignore const [{ Map }] = await Promise.all([ google.maps.importLibrary("places"), ]); // Create the input HTML element, and append it. //@ts-ignore const placeAutocomplete = new google.maps.places.PlaceAutocompleteElement(); //@ts-ignore document.body.appendChild(placeAutocomplete);
JavaScript
// Request needed libraries. //@ts-ignore const [{ Map }] = await Promise.all([google.maps.importLibrary("places")]); // Create the input HTML element, and append it. //@ts-ignore const placeAutocomplete = new google.maps.places.PlaceAutocompleteElement(); //@ts-ignore document.body.appendChild(placeAutocomplete);
Ver el ejemplo de código completo
Cómo agregar un widget de Autocomplete a un mapa
Si deseas agregar un widget de Autocomplete a un mapa, crea un nuevo elemento input
, úsalo para crear una nueva instancia de google.maps.places.PlaceAutocompleteElement
, agrega el PlaceAutocompleteElement
a un div
y envíalo al mapa como un control personalizado, tal como se muestra en el siguiente ejemplo:
TypeScript
//@ts-ignore const placeAutocomplete = new google.maps.places.PlaceAutocompleteElement(); //@ts-ignore placeAutocomplete.id = 'place-autocomplete-input'; const card = document.getElementById('place-autocomplete-card') as HTMLElement; //@ts-ignore card.appendChild(placeAutocomplete); map.controls[google.maps.ControlPosition.TOP_LEFT].push(card);
JavaScript
//@ts-ignore const placeAutocomplete = new google.maps.places.PlaceAutocompleteElement(); //@ts-ignore placeAutocomplete.id = "place-autocomplete-input"; const card = document.getElementById("place-autocomplete-card"); //@ts-ignore card.appendChild(placeAutocomplete); map.controls[google.maps.ControlPosition.TOP_LEFT].push(card);
Ver el ejemplo de código completo
Cómo restringir las predicciones de Autocomplete
De forma predeterminada, Place Autocomplete presenta todos los tipos de lugares, personalizados según la ubicación del usuario, y obtiene información de todos los campos de datos disponibles para el lugar que este selecciona. Configura las opciones de Place Autocomplete para presentar predicciones más relevantes mediante la restricción o personalización de los resultados.
La restricción de resultados hace que el widget de Autocomplete ignore cualquier resultado que esté fuera del área de restricción. Una práctica común es restringir los resultados a los límites del mapa. La personalización de resultados hace que el widget de Autocomplete muestre resultados dentro del área especificada, pero algunas coincidencias pueden estar fuera de esa área.
Cómo restringir la búsqueda de lugares por país
Si deseas restringir la búsqueda de lugares a uno o más países específicos, usa la propiedad componentRestrictions
para especificar los códigos de país como se muestra en el siguiente fragmento:
const pac = new google.maps.places.PlaceAutocompleteElement({ inputElement: input, componentRestrictions: {country: ['us', 'au']}, });
Cómo restringir la búsqueda de lugares a los límites del mapa
Para restringir la búsqueda de lugares a los límites de un mapa, usa la propiedad locationRestrictions
para agregar los límites, como se muestra en el siguiente fragmento:
const pac = new google.maps.places.PlaceAutocompleteElement({ inputElement: input, locationRestriction: map.getBounds(), });
Cuando restrinjas la búsqueda a los límites del mapa, asegúrate de agregar un objeto de escucha para actualizar los límites cuando estos cambien:
map.addListener('bounds_changed', () => { autocomplete.locationRestriction = map.getBounds(); });
Para quitar la propiedad locationRestriction
, configúrala como null
.
Cómo personalizar los resultados de la búsqueda de lugares
Personaliza los resultados de la búsqueda a un área circular usando la propiedad locationBias
y pasando un radio, como se muestra aquí:
const autocomplete = new google.maps.places.PlaceAutocompleteElement({ inputElement: input, locationBias: {radius: 100, center: {lat: 50.064192, lng: -130.605469}}, });
Para quitar la propiedad locationBias
, configúrala como null
.
Cómo restringir los resultados de la búsqueda de lugares a determinados tipos
Si deseas restringir los resultados de la búsqueda de lugares a determinados tipos de lugares, utiliza la propiedad types
y especifica uno o más tipos, como se muestra a continuación:
const autocomplete = new google.maps.places.PlaceAutocompleteElement({ inputElement: input, types: ['establishment'], });
Para obtener una lista completa de los tipos admitidos, consulta la Tabla 3: Conjuntos de tipos admitidos en solicitudes de Place Autocomplete.
Cómo obtener detalles de un lugar
Para obtener detalles del lugar seleccionado, agrega un objeto de escucha gmp-place-select
a PlaceAutocompleteElement
, como se muestra en el siguiente ejemplo:
TypeScript
// Add the gmp-placeselect listener, and display the results. //@ts-ignore placeAutocomplete.addEventListener('gmp-placeselect', async ({ place }) => { await place.fetchFields({ fields: ['displayName', 'formattedAddress', 'location'] }); selectedPlaceTitle.textContent = 'Selected Place:'; selectedPlaceInfo.textContent = JSON.stringify( place.toJSON(), /* replacer */ null, /* space */ 2); });
JavaScript
// Add the gmp-placeselect listener, and display the results. //@ts-ignore placeAutocomplete.addEventListener("gmp-placeselect", async ({ place }) => { await place.fetchFields({ fields: ["displayName", "formattedAddress", "location"], }); selectedPlaceTitle.textContent = "Selected Place:"; selectedPlaceInfo.textContent = JSON.stringify( place.toJSON(), /* replacer */ null, /* space */ 2, ); });
Ver el ejemplo de código completo
En el ejemplo anterior, el objeto de escucha de eventos devuelve un objeto de clase Place.
Llama a place.fetchFields()
para obtener los campos de datos de Place Details que necesita tu aplicación.
El objeto de escucha del siguiente ejemplo solicita información sobre un lugar y la muestra en un mapa.
TypeScript
// Add the gmp-placeselect listener, and display the results on the map. //@ts-ignore placeAutocomplete.addEventListener('gmp-placeselect', async ({ place }) => { await place.fetchFields({ fields: ['displayName', 'formattedAddress', 'location'] }); // If the place has a geometry, then present it on a map. if (place.viewport) { map.fitBounds(place.viewport); } else { map.setCenter(place.location); map.setZoom(17); } let content = '<div id="infowindow-content">' + '<span id="place-displayname" class="title">' + place.displayName + '</span><br />' + '<span id="place-address">' + place.formattedAddress + '</span>' + '</div>'; updateInfoWindow(content, place.location); marker.position = place.location; });
JavaScript
// Add the gmp-placeselect listener, and display the results on the map. //@ts-ignore placeAutocomplete.addEventListener("gmp-placeselect", async ({ place }) => { await place.fetchFields({ fields: ["displayName", "formattedAddress", "location"], }); // If the place has a geometry, then present it on a map. if (place.viewport) { map.fitBounds(place.viewport); } else { map.setCenter(place.location); map.setZoom(17); } let content = '<div id="infowindow-content">' + '<span id="place-displayname" class="title">' + place.displayName + "</span><br />" + '<span id="place-address">' + place.formattedAddress + "</span>" + "</div>"; updateInfoWindow(content, place.location); marker.position = place.location; });
Ver el ejemplo de código completo
Cómo obtener resultados de geocodificación para el lugar seleccionado
Si quieres obtener resultados de geocodificación del lugar seleccionado, usa google.maps.Geocoder
para obtener la ubicación, como se muestra en el siguiente fragmento:
const map = new google.maps.Map(document.getElementById('map'), { center: {lat: 50.064192, lng: -130.605469}, zoom: 3, }); const marker = new google.maps.Marker({map}); const inputElement = document.getElementById('pac-input'); const autocomplete = new google.maps.places.PlaceAutocompleteElement({inputElement}); const geocoder = new google.maps.Geocoder(); autocomplete.addListener('gmp-placeselect', async ({prediction: place}) => { const results = await geocoder.geocode({place.id}); marker.setPlace({ placeId: place.id, location: results[0].geometry.location, }); });
Mapas de ejemplo
Esta sección contiene el código completo de los mapas de ejemplo que se muestran en esta página.
Elemento de Autocomplete
En este ejemplo, se agrega un widget de Autocomplete a una página web y se muestran los resultados para cada lugar seleccionado.
TypeScript
async function initMap(): Promise<void> { // Request needed libraries. //@ts-ignore const [{ Map }] = await Promise.all([ google.maps.importLibrary("places"), ]); // Create the input HTML element, and append it. //@ts-ignore const placeAutocomplete = new google.maps.places.PlaceAutocompleteElement(); //@ts-ignore document.body.appendChild(placeAutocomplete); // Inject HTML UI. const selectedPlaceTitle = document.createElement('p'); selectedPlaceTitle.textContent = ''; document.body.appendChild(selectedPlaceTitle); const selectedPlaceInfo = document.createElement('pre'); selectedPlaceInfo.textContent = ''; document.body.appendChild(selectedPlaceInfo); // Add the gmp-placeselect listener, and display the results. //@ts-ignore placeAutocomplete.addEventListener('gmp-placeselect', async ({ place }) => { await place.fetchFields({ fields: ['displayName', 'formattedAddress', 'location'] }); selectedPlaceTitle.textContent = 'Selected Place:'; selectedPlaceInfo.textContent = JSON.stringify( place.toJSON(), /* replacer */ null, /* space */ 2); }); } initMap();
JavaScript
async function initMap() { // Request needed libraries. //@ts-ignore const [{ Map }] = await Promise.all([google.maps.importLibrary("places")]); // Create the input HTML element, and append it. //@ts-ignore const placeAutocomplete = new google.maps.places.PlaceAutocompleteElement(); //@ts-ignore document.body.appendChild(placeAutocomplete); // Inject HTML UI. const selectedPlaceTitle = document.createElement("p"); selectedPlaceTitle.textContent = ""; document.body.appendChild(selectedPlaceTitle); const selectedPlaceInfo = document.createElement("pre"); selectedPlaceInfo.textContent = ""; document.body.appendChild(selectedPlaceInfo); // Add the gmp-placeselect listener, and display the results. //@ts-ignore placeAutocomplete.addEventListener("gmp-placeselect", async ({ place }) => { await place.fetchFields({ fields: ["displayName", "formattedAddress", "location"], }); selectedPlaceTitle.textContent = "Selected Place:"; selectedPlaceInfo.textContent = JSON.stringify( place.toJSON(), /* replacer */ null, /* space */ 2, ); }); } initMap();
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; } p { font-family: Roboto, sans-serif; font-weight: bold; }
HTML
<html> <head> <title>Place Autocomplete element</title> <script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script> <link rel="stylesheet" type="text/css" href="./style.css" /> <script type="module" src="./index.js"></script> </head> <body> <p style="font-family: roboto, sans-serif">Search for a place here:</p> <!-- 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: "alpha"});</script> </body> </html>
Prueba la muestra
Mapa con Autocomplete
En este ejemplo, se muestra cómo agregar un widget de Autocomplete a un mapa de Google Maps.
TypeScript
let map: google.maps.Map; let marker: google.maps.marker.AdvancedMarkerElement; let infoWindow: google.maps.InfoWindow; async function initMap(): Promise<void> { // Request needed libraries. //@ts-ignore const [{ Map }, { AdvancedMarkerElement }] = await Promise.all([ google.maps.importLibrary("marker"), google.maps.importLibrary("places") ]); // Initialize the map. map = new google.maps.Map(document.getElementById('map') as HTMLElement, { center: { lat: 40.749933, lng: -73.98633 }, zoom: 13, mapId: '4504f8b37365c3d0', mapTypeControl: false, }); //@ts-ignore const placeAutocomplete = new google.maps.places.PlaceAutocompleteElement(); //@ts-ignore placeAutocomplete.id = 'place-autocomplete-input'; const card = document.getElementById('place-autocomplete-card') as HTMLElement; //@ts-ignore card.appendChild(placeAutocomplete); map.controls[google.maps.ControlPosition.TOP_LEFT].push(card); // Create the marker and infowindow marker = new google.maps.marker.AdvancedMarkerElement({ map, }); infoWindow = new google.maps.InfoWindow({}); // Add the gmp-placeselect listener, and display the results on the map. //@ts-ignore placeAutocomplete.addEventListener('gmp-placeselect', async ({ place }) => { await place.fetchFields({ fields: ['displayName', 'formattedAddress', 'location'] }); // If the place has a geometry, then present it on a map. if (place.viewport) { map.fitBounds(place.viewport); } else { map.setCenter(place.location); map.setZoom(17); } let content = '<div id="infowindow-content">' + '<span id="place-displayname" class="title">' + place.displayName + '</span><br />' + '<span id="place-address">' + place.formattedAddress + '</span>' + '</div>'; updateInfoWindow(content, place.location); marker.position = place.location; }); } // Helper function to create an info window. function updateInfoWindow(content, center) { infoWindow.setContent(content); infoWindow.setPosition(center); infoWindow.open({ map, anchor: marker, shouldFocus: false, }); } initMap();
JavaScript
let map; let marker; let infoWindow; async function initMap() { // Request needed libraries. //@ts-ignore const [{ Map }, { AdvancedMarkerElement }] = await Promise.all([ google.maps.importLibrary("marker"), google.maps.importLibrary("places"), ]); // Initialize the map. map = new google.maps.Map(document.getElementById("map"), { center: { lat: 40.749933, lng: -73.98633 }, zoom: 13, mapId: "4504f8b37365c3d0", mapTypeControl: false, }); //@ts-ignore const placeAutocomplete = new google.maps.places.PlaceAutocompleteElement(); //@ts-ignore placeAutocomplete.id = "place-autocomplete-input"; const card = document.getElementById("place-autocomplete-card"); //@ts-ignore card.appendChild(placeAutocomplete); map.controls[google.maps.ControlPosition.TOP_LEFT].push(card); // Create the marker and infowindow marker = new google.maps.marker.AdvancedMarkerElement({ map, }); infoWindow = new google.maps.InfoWindow({}); // Add the gmp-placeselect listener, and display the results on the map. //@ts-ignore placeAutocomplete.addEventListener("gmp-placeselect", async ({ place }) => { await place.fetchFields({ fields: ["displayName", "formattedAddress", "location"], }); // If the place has a geometry, then present it on a map. if (place.viewport) { map.fitBounds(place.viewport); } else { map.setCenter(place.location); map.setZoom(17); } let content = '<div id="infowindow-content">' + '<span id="place-displayname" class="title">' + place.displayName + "</span><br />" + '<span id="place-address">' + place.formattedAddress + "</span>" + "</div>"; updateInfoWindow(content, place.location); marker.position = place.location; }); } // Helper function to create an info window. function updateInfoWindow(content, center) { infoWindow.setContent(content); infoWindow.setPosition(center); infoWindow.open({ map, anchor: marker, shouldFocus: false, }); } initMap();
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; } #place-autocomplete-card { background-color: #fff; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px; margin: 10px; padding: 5px; font-family: Roboto, sans-serif; font-size: large; font-weight: bold; } #place-autocomplete { width: 250px; } #infowindow-content .title { font-weight: bold; } #map #infowindow-content { display: inline; }
HTML
<html> <head> <title>Place Autocomplete map</title> <script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script> <link rel="stylesheet" type="text/css" href="./style.css" /> <script type="module" src="./index.js"></script> </head> <body> <div class="place-autocomplete-card" id="place-autocomplete-card"> <p>Search for a place here:</p> </div> <div id="map"></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: "AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg", v: "alpha"});</script> </body> </html>