BasicPlaceAutocompleteElement создает текстовое поле, предоставляет подсказки мест в списке интерфейса и возвращает идентификатор выбранного места.
Элемент Basic Place Autocomplete проще в реализации, чем
PlaceAutocompleteElement, и отличается от него следующим:
- Элемент Basic Place Autocomplete возвращает объект Place, содержащий только идентификатор места, а не объект
PlacePrediction. Полученный идентификатор места можно напрямую использовать с элементом Places UI Kit Details, чтобы получить дополнительную информацию о месте. В случае с объектомPlacePredictionсначала потребуется преобразовать его в идентификатор места. - Для элемента "Базовый сервис автозаполнения мест" не требуется включать Places API в консоли Google Cloud.
- Элемент Basic Place Autocomplete очищает поле ввода, когда пользователь выбирает подсказку автозаполнения мест.
Требования
Чтобы использовать элемент Basic Place Autocomplete, включите Places UI Kit в проекте Google Cloud. Подробности – в статье Начало работы.
Как добавить элемент автозаполнения мест
В этом разделе рассказывается, как добавить элемент Basic Autocomplete на веб-страницу или карту.
Как добавить на веб-страницу базовый элемент Autocomplete
Чтобы добавить элемент BasicAutocomplete на веб-страницу, создайте новый элемент google.maps.places.BasicPlaceAutocompleteElement и добавьте его на страницу, как показано в примере ниже:
// Request needed libraries. const {BasicPlaceAutocompleteElement} = await google.maps.importLibrary('places'); // Create the input HTML element and append it. const placeAutocomplete = new BasicPlaceAutocompleteElement(); document.body.appendChild(placeAutocomplete);
Как добавить на карту элемент "Базовое автозаполнение"
Чтобы добавить на карту элемент "Базовая автозаполняемость", добавьте BasicPlaceAutocompleteElement в элемент gmp-map и задайте его положение с помощью атрибута slot, как показано в следующем примере:
<gmp-map
zoom="12"
center="37.4220656,-122.0840897"
map-id="DEMO_MAP_ID">
<gmp-basic-place-autocomplete
slot="control-inline-start-block-start"></gmp-basic-place-autocomplete>
</gmp-map>Как ограничить подсказки функции Autocomplete
По умолчанию функция "Базовое автозаполнение мест" может предлагать любые типы мест, отдавая предпочтение тем, что находятся ближе к пользователю. Задайте параметр
BasicPlaceAutocompleteElementOptions, чтобы показывать более подходящие подсказки, ограничив или сместив результаты.
В таком случае элемент "Базовое автозаполнение" будет игнорировать те результаты, которые не входят в определенную область. Довольно распространенная практика – ограничивать результаты границами карты. Если вы зададите предпочтения таким образом, элемент BasicAutocomplete будет показывать результаты только в заданной области, даже когда совпадения есть и за ее пределами.
Если границы или область просмотра не указаны, API будет определять местоположение пользователя по IP-адресу и предлагать места, расположенные поблизости. По возможности задавайте границы. В противном случае подсказки для разных пользователей могут быть неодинаковы. Также, чтобы улучшить подсказки в целом, следует выбрать подходящую область просмотра, например такую, которая устанавливается при панорамировании или масштабировании карты или задается разработчиком с учетом местоположения устройства и радиуса. Если радиус неизвестен, подходящим значением по умолчанию для элемента "Базовое автозаполнение мест" считается 5 км. Не используйте следующие области просмотра: с нулевым радиусом (точку); маленького размера (менее 100 м); охватывающую весь мир.
Как ограничить поиск мест определенными странами
Чтобы ограничить поиск мест одной или несколькими странами, с помощью свойства includedRegionCodes укажите коды стран, как показано в следующем примере кода:
const pac = new google.maps.places.BasicPlaceAutocompleteElement({ includedRegionCodes: ['us', 'au'], });
Как ограничить поиск мест границами карты
Чтобы ограничить поиск мест границами карты, с помощью свойства locationRestrictions добавьте границы, как показано в следующем примере кода:
const pac = new google.maps.places.BasicPlaceAutocompleteElement({ locationRestriction: map.getBounds(), });
При ограничении по границам карты обязательно добавьте прослушиватель, чтобы обновлять границы при их изменении:
map.addListener('bounds_changed', () => { autocomplete.locationRestriction = map.getBounds(); });
Чтобы свойство locationRestriction не применялось, присвойте ему значение null.
Как использовать предпочтения для результатов поиска
Чтобы отдавать предпочтения результатам в ограниченной окружностью области, используйте свойство locationBias и передайте радиус, как показано в следующем примере:
const autocomplete = new google.maps.places.BasicPlaceAutocompleteElement({ locationBias: {radius: 100, center: {lat: 50.064192, lng: -130.605469}}, });
Чтобы свойство locationBias не применялось, присвойте ему значение null.
Как ограничить результаты поиска мест определенными типами
Вы можете ограничить результаты поиска мест определенными типами мест. Для этого в свойстве includedPrimaryTypes нужно указать один или несколько типов, как показано в следующем примере:
const autocomplete = new google.maps.places.BasicPlaceAutocompleteElement({ includedPrimaryTypes: ['establishment'], });
Полный список поддерживаемых типов можно найти в таблицах А и Б.
Как настроить элемент запроса места
Добавьте прослушиватель, чтобы обновлять элемент Place Request, когда пользователь выбирает подсказку:
// Event listener for when a place is selected from the autocomplete list. placeAutocompleteElement.addEventListener('gmp-select', (event) => { // Reset marker and InfoWindow, and prepare the details element. placeDetailsParent.appendChild(placeDetailsElement); placeDetailsElement.style.display = 'block'; advancedMarkerElement.position = null; infoWindow.close(); // Request details for the selected place. const placeDetailsRequest = placeDetailsElement.querySelector( 'gmp-place-details-place-request' ); placeDetailsRequest.place = event.place.id; });
В этом примере показано, как добавить элемент Basic Autocomplete на карту Google.
JavaScript
const placeAutocompleteElement = document.querySelector( 'gmp-basic-place-autocomplete' ); const placeDetailsElement = document.querySelector('gmp-place-details-compact'); const placeDetailsParent = placeDetailsElement.parentElement; const gmpMapElement = document.querySelector('gmp-map'); async function init() { // Asynchronously load required libraries from the Google Maps JS API. const [{ AdvancedMarkerElement }, { InfoWindow, Circle }, { Size }] = await Promise.all([ google.maps.importLibrary('marker'), google.maps.importLibrary('maps'), google.maps.importLibrary('core'), google.maps.importLibrary('places'), ]); // Get the initial center directly from the gmp-map element's property. const center = gmpMapElement.center; // Set the initial location bias for the autocomplete element. placeAutocompleteElement.locationBias = center; // Update the map object with specified options. const map = gmpMapElement.innerMap; map.setOptions({ clickableIcons: false, mapTypeControl: false, streetViewControl: false, }); // Create an advanced marker to show the location of a selected place. const advancedMarkerElement = new AdvancedMarkerElement({ map, collisionBehavior: 'REQUIRED_AND_HIDES_OPTIONAL', }); // Create an InfoWindow to hold the place details component. const infoWindow = new InfoWindow({ minWidth: 360, disableAutoPan: true, headerDisabled: true, pixelOffset: new Size(0, -10), }); // Event listener for when a place is selected from the autocomplete list. placeAutocompleteElement.addEventListener('gmp-select', (event) => { // Reset marker and InfoWindow, and prepare the details element. placeDetailsParent.appendChild(placeDetailsElement); placeDetailsElement.style.display = 'block'; advancedMarkerElement.position = null; infoWindow.close(); // Request details for the selected place. const placeDetailsRequest = placeDetailsElement.querySelector( 'gmp-place-details-place-request' ); placeDetailsRequest.place = event.place.id; }); // Event listener for when the place details have finished loading. placeDetailsElement.addEventListener('gmp-load', () => { const location = placeDetailsElement.place?.location; if (!location) { advancedMarkerElement.position = null; return; } // Position the marker and open the InfoWindow at the place's location. advancedMarkerElement.position = location; infoWindow.setContent(placeDetailsElement); infoWindow.open({ map, anchor: advancedMarkerElement, }); map.setCenter(location); }); // Event listener to close the InfoWindow when the map is clicked. map.addListener('click', () => { infoWindow.close(); advancedMarkerElement.position = null; }); // Event listener for when the map finishes moving (panning or zooming). map.addListener('idle', () => { const newCenter = map.getCenter(); // Update the autocomplete's location bias to a 10km radius around the new map center. placeAutocompleteElement.locationBias = new Circle({ center: newCenter, radius: 10000, // 10km in meters. }); }); } void init();
CSS
html, body { height: 100%; margin: 0; padding: 0; } gmp-map { height: 100%; } gmp-basic-place-autocomplete { position: absolute; height: 30px; width: 500px; top: 10px; left: 10px; box-shadow: 4px 4px 5px 0px rgba(0, 0, 0, 0.2); color-scheme: light; border-radius: 10px; }
HTML
<html>
<head>
<title>Basic Place Autocomplete map</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>
<gmp-map
zoom="12"
center="37.4220656,-122.0840897"
map-id="DEMO_MAP_ID">
<gmp-basic-place-autocomplete
slot="control-inline-start-block-start"></gmp-basic-place-autocomplete>
</gmp-map>
<!-- Use inline styles to configure the Place Details Compact element because
it will be placed within the info window, and info window content is inside
the shadow DOM when using <gmp-map> -->
<gmp-place-details-compact
orientation="horizontal"
style="
width: 400px;
display: none;
border: none;
padding: 0;
margin: 0;
background-color: transparent;
color-scheme: light;
">
<gmp-place-details-place-request></gmp-place-details-place-request>
<gmp-place-standard-content></gmp-place-standard-content>
</gmp-place-details-compact>
</body>
</html>