BasicPlaceAutocompleteElement
은 텍스트 입력란을 만들고 UI 선택 목록에 장소 예상 검색어를 제공하며 선택한 장소의 장소 ID를 반환합니다.
PlaceAutocompleteElement
와 달리 간소화된 기본 Place Autocomplete 요소는 사용자가 장소 예상 검색어를 선택하면 입력란을 지우고
PlacePrediction
객체가 아닌 장소 ID만 포함하는 Place 객체를 반환합니다. 장소 UI 키트 세부정보 요소와 함께 이 장소 ID를 사용하여 추가 장소 세부정보를 가져옵니다.
기본 요건
기본 장소 자동 완성 요소를 사용하려면 Google Cloud 프로젝트에서 'Places UI Kit'를 사용 설정해야 합니다. 자세한 내용은 시작하기를 참고하세요.
기본 장소 자동 완성 요소 추가
기본 장소 자동 완성 요소는 텍스트 입력란을 만들고 UI 선택 목록에 장소 예상 검색어를 제공하며 gmp-select
이벤트를 사용하여 사용자 선택에 대한 응답으로 장소 ID를 반환합니다. 이 섹션에서는 웹페이지 또는 지도에 기본 자동 완성 요소를 추가하는 방법을 보여줍니다.
웹페이지에 기본 자동 완성 요소 추가
웹페이지에 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
인스턴스를 만들고 div
에 추가한 다음 다음 예와 같이 맞춤 컨트롤로 지도에 푸시합니다.
const placeAutocomplete = new google.maps.places.BasicPlaceAutocompleteElement(); placeAutocomplete.id = 'place-autocomplete-input'; placeAutocomplete.locationBias = center; const card = document.getElementById('place-autocomplete-card'); card.appendChild(placeAutocomplete); map.controls[google.maps.ControlPosition.TOP_LEFT].push(card);
자동 완성 예상 검색어 제한
기본적으로 Basic Place Autocomplete는 사용자 위치 근처의 예상 검색어에 편중된 모든 장소 유형을 표시합니다. 결과를 제한하거나 상세 검색하여 더 관련성 높은 예상 검색어를 표시하려면
BasicPlaceAutocompleteElementOptions
을 설정하세요.
결과를 제한하면 기본 자동 완성 요소가 제한 지역 밖의 모든 결과를 무시합니다. 일반적인 방법은 결과를 지도 경계로 제한하는 것입니다. 결과를 상세 검색하면 BasicAutocomplete 요소가 지정된 지역 내 결과를 표시하지만 일부 일치 항목이 해당 지역을 벗어날 수 있습니다.
경계나 지도 표시 영역을 제공하지 않으면 API가 IP 주소에서 사용자의 위치를 감지하려고 시도하고 해당 위치에 편중된 결과를 반환합니다. 가능하면 항상 경계를 설정하세요. 그렇지 않으면 각 사용자가 받는 예측이 서로 다를 수 있습니다. 또한 일반적으로 예측을 개선하려면 지도를 화면 이동하거나 확대/축소하여 설정한 적절한 표시 영역이나 개발자가 기기 위치 및 반경을 기반으로 설정한 표시 영역을 제공해야 합니다. 반경을 사용할 수 없는 경우에는 5km가 기본 Place Autocomplete 요소에 적절한 기본값으로 간주됩니다. 반경이 0인 표시 영역(단일 점), 가로가 100m 미만에 불과한 표시 영역 또는 지구 전체 둘레에 해당하는 표시 영역은 설정하지 마세요.
국가별 장소 검색 제한
장소 검색을 하나 이상의 특정 국가로 제한하려면 다음 스니펫에 표시된 대로 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'], });
지원되는 유형의 전체 목록은 장소 유형 표 A 및 B를 참고하세요.
장소 세부정보 가져오기
선택한 장소의 장소 ID를 가져오려면 다음 예와 같이 PlaceAutocompleteElement
에 gmp-select
리스너를 추가합니다.
// Add the gmp-select listener, and display the results. placeAutocomplete.addEventListener('gmp-select', async ({ place }) => { await place.fetchFields({ fields: ['displayName', 'formattedAddress', 'location'] }); selectedPlaceTitle.textContent = 'Selected Place:'; selectedPlaceInfo.textContent = JSON.stringify(place.toJSON(), /* replacer */ null, /* space */ 2); });
이전 예에서는 이벤트 리스너가 장소 클래스 객체를 반환합니다.
place.fetchFields()
를 호출하여 애플리케이션에 필요한 장소 세부정보 데이터 필드를 가져옵니다.
다음 예의 리스너는 장소 정보를 요청하고 이를 지도에 표시합니다.
// Add the gmp-placeselect listener, and display the results on the map. //@ts-ignore placeAutocomplete.addEventListener('gmp-select', 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; });
이 예에서는 Google 지도에 기본 자동 완성 요소를 추가하는 방법을 보여줍니다.
자바스크립트
const mapContainer = document.getElementById("map-container"); const autocompleteElement = document.querySelector('gmp-basic-place-autocomplete'); const detailsElement = document.querySelector('gmp-place-details-compact'); const mapElement = document.querySelector('gmp-map'); const advancedMarkerElement = document.querySelector('gmp-advanced-marker'); let center = { lat: 40.749933, lng: -73.98633 }; // New York City async function initMap() { //@ts-ignore const { BasicPlaceAutocompleteElement, PlaceDetailsElement } = await google.maps.importLibrary('places'); //@ts-ignore const { AdvancedMarkerElement } = await google.maps.importLibrary('marker'); //@ts-ignore const { LatLngBounds } = await google.maps.importLibrary('core'); // Set the initial map location and autocomplete location bias mapElement.center = center; autocompleteElement.locationBias = center; // Get the underlying google.maps.Map object to add listeners const map = mapElement.innerMap; // Add the listener tochange locationBias to locationRestriction when the map moves map.addListener('bounds_changed', () => { autocompleteElement.locationBias = null; autocompleteElement.locationRestriction = map.getBounds(); console.log("bias changed to restriction"); }); // Add the listener to update the Place Request element when the user selects a prediction autocompleteElement.addEventListener('gmp-select', async (event) => { const placeDetailsRequest = document.querySelector('gmp-place-details-place-request'); placeDetailsRequest.place = event.place.id; }); // Add the listener to update the marker when the Details element loads detailsElement.addEventListener('gmp-load', async () => { const location = detailsElement.place.location; detailsElement.style.display = "block"; advancedMarkerElement.position = location; advancedMarkerElement.content = detailsElement; if (detailsElement.place.viewport) { map.fitBounds(detailsElement.place.viewport); } else { map.setCenter(location); map.setZoom(17); } }); } initMap();
CSS
html, body { height: 100%; margin: 0; padding: 0; } #map-container { display: flex; flex-direction: row; height: 100%; } #gmp-map { height: 100%; } gmp-basic-place-autocomplete { position: absolute; height: 50px; top: 10px; left: 10px; z-index: 1; box-shadow: 2px 2px 5px 0px rgba(0,0,0,0.2); color-scheme: light; border-radius: 10px; } gmp-place-details-compact { width: 360px; max-height: 300px; border: none; padding: 0; margin: 0; position: absolute; transform: translate(calc(-180px), calc(-215px)); box-shadow: 2px 2px 5px 0px rgba(0,0,0,0.2); color-scheme: light; } /* This creates the pointer attached to the bottom of the element. */ gmp-place-details-compact::after { content: ""; position: absolute; top: 100%; left: 50%; transform: translateX(-50%); width: 0; height: 0; border-left: 16px solid transparent; border-right: 16px solid transparent; border-top: 20px solid var(--gmp-mat-color-surface, light-dark(white, black)); }
HTML
<html> <head> <title>Place Autocomplete map</title> <link rel="stylesheet" type="text/css" href="./style.css" /> <script type="module" src="./index.js"></script> </head> <body> <div id="map-container"> <gmp-basic-place-autocomplete></gmp-basic-place-autocomplete> <gmp-place-details-compact orientation="horizontal"> <gmp-place-details-place-request></gmp-place-details-place-request> <gmp-place-all-content></gmp-place-all-content> </gmp-place-details-compact> <gmp-map zoom="14" map-id="DEMO_MAP_ID"> <gmp-advanced-marker></gmp-advanced-marker> </gmp-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: "AIzaSyA6myHzS10YXdcazAFalmXvDkrYCp5cLc8", v: "weekly"});</script> </body> </html>