Places UI Kit: A ready-to-use library that provides room for customization and low-code development. Try it out, and share yourinput on your UI Kit experience.

Place Autocomplete

  • This sample demonstrates using the Place Autocomplete widget to provide a type-ahead search box for places.

  • Users can filter prediction types and restrict/bias the search to the current map viewport.

  • Upon selection, it retrieves place details usinggetPlace() and displays them in an info window.

  • The sample provides code examples in both TypeScript and JavaScript, along with CSS and HTML for styling and structure.

  • Developers can further explore using the Place Picker component from the Extended Component Library for a more integrated place selection experience.

ThePlace Autocomplete sample demonstrates how to use thePlace Autocomplete widget to provide a type-ahead search box.

  • The radio buttons allow you to filter the types of predictions that the autocomplete returns.
  • TheStrict Bounds option restricts the search to the area within the current viewport. If this option is not checked, then the APIbiases the search to the current viewport, but it does notrestrict it.

When you select an autocomplete result the sample then calls thegetPlace() method, and then it opens an info window to display place details.

For more information, see theAutocomplete class.

TypeScript

// This example requires the Places library. Include the libraries=places// parameter when you first load the API. For example:// <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places">functioninitMap():void{constmap=newgoogle.maps.Map(document.getElementById("map")asHTMLElement,{center:{lat:40.749933,lng:-73.98633},zoom:13,mapTypeControl:false,});constcard=document.getElementById("pac-card")asHTMLElement;constinput=document.getElementById("pac-input")asHTMLInputElement;constbiasInputElement=document.getElementById("use-location-bias")asHTMLInputElement;conststrictBoundsInputElement=document.getElementById("use-strict-bounds")asHTMLInputElement;constoptions={fields:["formatted_address","geometry","name"],strictBounds:false,};map.controls[google.maps.ControlPosition.TOP_LEFT].push(card);constautocomplete=newgoogle.maps.places.Autocomplete(input,options);// Bind the map's bounds (viewport) property to the autocomplete object,// so that the autocomplete requests use the current map bounds for the// bounds option in the request.autocomplete.bindTo("bounds",map);constinfowindow=newgoogle.maps.InfoWindow();constinfowindowContent=document.getElementById("infowindow-content")asHTMLElement;infowindow.setContent(infowindowContent);constmarker=newgoogle.maps.Marker({map,anchorPoint:newgoogle.maps.Point(0,-29),});autocomplete.addListener("place_changed",()=>{infowindow.close();marker.setVisible(false);constplace=autocomplete.getPlace();if(!place.geometry||!place.geometry.location){// User entered the name of a Place that was not suggested and// pressed the Enter key, or the Place Details request failed.window.alert("No details available for input: '"+place.name+"'");return;}// If the place has a geometry, then present it on a map.if(place.geometry.viewport){map.fitBounds(place.geometry.viewport);}else{map.setCenter(place.geometry.location);map.setZoom(17);}marker.setPosition(place.geometry.location);marker.setVisible(true);infowindowContent.children["place-name"].textContent=place.name;infowindowContent.children["place-address"].textContent=place.formatted_address;infowindow.open(map,marker);});// Sets a listener on a radio button to change the filter type on Places// Autocomplete.functionsetupClickListener(id,types){constradioButton=document.getElementById(id)asHTMLInputElement;radioButton.addEventListener("click",()=>{autocomplete.setTypes(types);input.value="";});}setupClickListener("changetype-all",[]);setupClickListener("changetype-address",["address"]);setupClickListener("changetype-establishment",["establishment"]);setupClickListener("changetype-geocode",["geocode"]);setupClickListener("changetype-cities",["(cities)"]);setupClickListener("changetype-regions",["(regions)"]);biasInputElement.addEventListener("change",()=>{if(biasInputElement.checked){autocomplete.bindTo("bounds",map);}else{// User wants to turn off location bias, so three things need to happen:// 1. Unbind from map// 2. Reset the bounds to whole world// 3. Uncheck the strict bounds checkbox UI (which also disables strict bounds)autocomplete.unbind("bounds");autocomplete.setBounds({east:180,west:-180,north:90,south:-90});strictBoundsInputElement.checked=biasInputElement.checked;}input.value="";});strictBoundsInputElement.addEventListener("change",()=>{autocomplete.setOptions({strictBounds:strictBoundsInputElement.checked,});if(strictBoundsInputElement.checked){biasInputElement.checked=strictBoundsInputElement.checked;autocomplete.bindTo("bounds",map);}input.value="";});}declareglobal{interfaceWindow{initMap:()=>void;}}window.initMap=initMap;
Note: Read theguide on using TypeScript and Google Maps.

JavaScript

// This example requires the Places library. Include the libraries=places// parameter when you first load the API. For example:// <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places">functioninitMap(){constmap=newgoogle.maps.Map(document.getElementById("map"),{center:{lat:40.749933,lng:-73.98633},zoom:13,mapTypeControl:false,});constcard=document.getElementById("pac-card");constinput=document.getElementById("pac-input");constbiasInputElement=document.getElementById("use-location-bias");conststrictBoundsInputElement=document.getElementById("use-strict-bounds");constoptions={fields:["formatted_address","geometry","name"],strictBounds:false,};map.controls[google.maps.ControlPosition.TOP_LEFT].push(card);constautocomplete=newgoogle.maps.places.Autocomplete(input,options);// Bind the map's bounds (viewport) property to the autocomplete object,// so that the autocomplete requests use the current map bounds for the// bounds option in the request.autocomplete.bindTo("bounds",map);constinfowindow=newgoogle.maps.InfoWindow();constinfowindowContent=document.getElementById("infowindow-content");infowindow.setContent(infowindowContent);constmarker=newgoogle.maps.Marker({map,anchorPoint:newgoogle.maps.Point(0,-29),});autocomplete.addListener("place_changed",()=>{infowindow.close();marker.setVisible(false);constplace=autocomplete.getPlace();if(!place.geometry||!place.geometry.location){// User entered the name of a Place that was not suggested and// pressed the Enter key, or the Place Details request failed.window.alert("No details available for input: '"+place.name+"'");return;}// If the place has a geometry, then present it on a map.if(place.geometry.viewport){map.fitBounds(place.geometry.viewport);}else{map.setCenter(place.geometry.location);map.setZoom(17);}marker.setPosition(place.geometry.location);marker.setVisible(true);infowindowContent.children["place-name"].textContent=place.name;infowindowContent.children["place-address"].textContent=place.formatted_address;infowindow.open(map,marker);});// Sets a listener on a radio button to change the filter type on Places// Autocomplete.functionsetupClickListener(id,types){constradioButton=document.getElementById(id);radioButton.addEventListener("click",()=>{autocomplete.setTypes(types);input.value="";});}setupClickListener("changetype-all",[]);setupClickListener("changetype-address",["address"]);setupClickListener("changetype-establishment",["establishment"]);setupClickListener("changetype-geocode",["geocode"]);setupClickListener("changetype-cities",["(cities)"]);setupClickListener("changetype-regions",["(regions)"]);biasInputElement.addEventListener("change",()=>{if(biasInputElement.checked){autocomplete.bindTo("bounds",map);}else{// User wants to turn off location bias, so three things need to happen:// 1. Unbind from map// 2. Reset the bounds to whole world// 3. Uncheck the strict bounds checkbox UI (which also disables strict bounds)autocomplete.unbind("bounds");autocomplete.setBounds({east:180,west:-180,north:90,south:-90});strictBoundsInputElement.checked=biasInputElement.checked;}input.value="";});strictBoundsInputElement.addEventListener("change",()=>{autocomplete.setOptions({strictBounds:strictBoundsInputElement.checked,});if(strictBoundsInputElement.checked){biasInputElement.checked=strictBoundsInputElement.checked;autocomplete.bindTo("bounds",map);}input.value="";});}window.initMap=initMap;
Note: The JavaScript is compiled from the TypeScript snippet.

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;}#description{font-family:Roboto;font-size:15px;font-weight:300;}#infowindow-content.title{font-weight:bold;}#infowindow-content{display:none;}#map#infowindow-content{display:inline;}.pac-card{background-color:#fff;border:0;border-radius:2px;box-shadow:01px4px-1pxrgba(0,0,0,0.3);margin:10px;padding:00.5em;font:40018pxRoboto,Arial,sans-serif;overflow:hidden;font-family:Roboto;padding:0;}#pac-container{padding-bottom:12px;margin-right:12px;}.pac-controls{display:inline-block;padding:5px11px;}.pac-controlslabel{font-family:Roboto;font-size:13px;font-weight:300;}#pac-input{background-color:#fff;font-family:Roboto;font-size:15px;font-weight:300;margin-left:12px;padding:011px013px;text-overflow:ellipsis;width:400px;}#pac-input:focus{border-color:#4d90fe;}#title{color:#fff;background-color:#4d90fe;font-size:25px;font-weight:500;padding:6px12px;}

HTML

<html>  <head>    <title>Place Autocomplete</title>    <link rel="stylesheet" type="text/css" href="./style.css" />    <script type="module" src="./index.js"></script>  </head>  <body>    <div>      <div>        <div>Autocomplete search</div>        <div>          <input            type="radio"            name="type"                       checked="checked"          />          <label for="changetype-all">All</label>          <input type="radio" name="type" />          <label for="changetype-establishment">establishment</label>          <input type="radio" name="type" />          <label for="changetype-address">address</label>          <input type="radio" name="type" />          <label for="changetype-geocode">geocode</label>          <input type="radio" name="type" />          <label for="changetype-cities">(cities)</label>          <input type="radio" name="type" />          <label for="changetype-regions">(regions)</label>        </div>        <br />        <div>          <input type="checkbox" value="" checked />          <label for="use-location-bias">Bias to map viewport</label>          <input type="checkbox" value="" />          <label for="use-strict-bounds">Strict bounds</label>        </div>      </div>      <div>        <input type="text" placeholder="Enter a location" />      </div>    </div>    <div></div>    <div>      <span></span><br />      <span></span>    </div>    <!--       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=initMap&libraries=places&v=weekly"      defer    ></script>  </body></html>

Try Sample

Clone Sample

Git and Node.js are required to run this sample locally. Follow theseinstructions to install Node.js and NPM. The following commands clone, install dependencies and start the sample application.

gitclone-bsample-places-autocompletehttps://github.com/googlemaps/js-samples.gitcdjs-samplesnpminpmstart

Other samples can be tried by switching to any branch beginning withsample-SAMPLE_NAME.

gitcheckoutsample-SAMPLE_NAMEnpminpmstart

Use the Place Picker component

The place picker component is a text input that allows end users to search for aspecific address or place using autocomplete. It is part of theExtended Component Library,a set of web components that help developers build better maps and location features faster.

Use thePlace Picker configuratorto create embeddable code for a custom Place Picker component, then exportit to be used with popular frameworks like React and Angular or no framework at all.

Except as otherwise noted, the content of this page is licensed under theCreative Commons Attribution 4.0 License, and code samples are licensed under theApache 2.0 License. For details, see theGoogle Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.

Last updated 2025-12-18 UTC.