A Pesquisa de texto (nova) usa uma consulta de texto e retorna uma lista de lugares correspondentes.
O Text Search (novo) retorna informações sobre um conjunto de lugares com base em uma string, por exemplo, "pizza em São Paulo", "loja de sapatos perto do Rio de Janeiro" ou "Avenida Brasil, 123". O serviço responde com uma lista de locais correspondentes à string de texto e a todos os direcionamentos de localização definidos. Com o Text Search (novo), você pode pesquisar lugares por tipo, filtrar usando critérios como horário de funcionamento e classificação, além de restringir ou direcionar os resultados para um local específico.
Para usar a Pesquisa de texto (nova), ative a "API Places (nova)" no projeto do Google Cloud. Consulte o artigo Começar para mais detalhes.
Encontrar lugares por consulta de texto
Chame searchByText
para retornar uma lista de lugares de uma consulta de texto ou número de telefone.
Especifique os parâmetros de pesquisa usando uma solicitação e, em seguida, chame searchByText()
. Os resultados são retornados como uma lista de objetos Place
, e nela você consegue os detalhes dos lugares. O snippet a seguir mostra um exemplo de solicitação e chamada para searchByText
:
TypeScript
const request = { textQuery: query, fields: ['displayName', 'location', 'businessStatus'], includedType: '', // Restrict query to a specific type (leave blank for any). useStrictTypeFiltering: true, locationBias: map.center, isOpenNow: true, language: 'en-US', maxResultCount: 8, minRating: 1, // Specify a minimum rating. region: 'us', }; const { places } = await Place.searchByText(request);
JavaScript
const request = { textQuery: query, fields: ['displayName', 'location', 'businessStatus'], includedType: '', // Restrict query to a specific type (leave blank for any). useStrictTypeFiltering: true, locationBias: map.center, isOpenNow: true, language: 'en-US', maxResultCount: 8, minRating: 1, // Specify a minimum rating. region: 'us', }; const { places } = await Place.searchByText(request);
- Especifique uma consulta de texto ou um número de telefone para pesquisar com o parâmetro
textQuery
. - Use o parâmetro
fields
(obrigatório) para especificar uma lista separada por vírgulas de um ou mais campos de dados com letras concatenadas. - Use o parâmetro
includedType
para retornar apenas resultados do tipo especificado. - Use
locationBias
oulocationRestriction
para direcionar ou restringir os resultados da pesquisa de texto a uma região específica.
Se a consulta contiver um número de telefone, o parâmetro "region" precisará ser definido. Por exemplo, se você usar um número de telefone para pesquisar um lugar no Japão e o domínio solicitante for jp
, defina o parâmetro region
como "jp". Se region
for omitido da solicitação, a API vai adotar como padrão a região dos Estados Unidos ("us").
Place
, e nela você consegue os detalhes dos lugares.
Exemplo
O exemplo a seguir chama searchByText
com o texto de consulta fornecido e preenche um mapa com marcadores clicáveis para mostrar os resultados.
TypeScript
let map; let markers = {}; let infoWindow; async function initMap() { const { Map, InfoWindow } = await google.maps.importLibrary("maps") as google.maps.MapsLibrary; const center = { lat: 37.4161493, lng: -122.0812166 }; map = new Map(document.getElementById('map') as HTMLElement, { center: center, zoom: 11, mapTypeControl: false, mapId: 'DEMO_MAP_ID', }); const textInput = document.getElementById('text-input') as HTMLInputElement; const textInputButton = document.getElementById('text-input-button') as HTMLButtonElement; const card = document.getElementById('text-input-card') as HTMLElement; map.controls[google.maps.ControlPosition.TOP_LEFT].push(card); textInputButton.addEventListener('click', () => { findPlaces(textInput.value); }); textInput.addEventListener('keydown', (event) => { if (event.key === 'Enter') { findPlaces(textInput.value); } }); infoWindow = new google.maps.InfoWindow(); } async function findPlaces(query) { const { Place } = await google.maps.importLibrary("places") as google.maps.PlacesLibrary; const { AdvancedMarkerElement } = await google.maps.importLibrary("marker") as google.maps.MarkerLibrary; const request = { textQuery: query, fields: ['displayName', 'location', 'businessStatus'], includedType: '', // Restrict query to a specific type (leave blank for any). useStrictTypeFiltering: true, locationBias: map.center, isOpenNow: true, language: 'en-US', maxResultCount: 8, minRating: 1, // Specify a minimum rating. region: 'us', }; const { places } = await Place.searchByText(request); if (places.length) { const { LatLngBounds } = await google.maps.importLibrary("core") as google.maps.CoreLibrary; const bounds = new LatLngBounds(); // First remove all existing markers. for (const id in markers) { markers[id].map = null; }; markers = {}; // Loop through and get all the results. places.forEach(place => { const marker = new AdvancedMarkerElement({ map, position: place.location, title: place.displayName, }); markers[place.id] = marker; marker.addListener('gmp-click', () => { map.panTo(place.location); updateInfoWindow(place.displayName, place.id, marker); }); if (place.location != null) { bounds.extend(place.location); } }); map.fitBounds(bounds); } else { console.log('No results'); } } // Helper function to create an info window. async function updateInfoWindow(title, content, anchor) { infoWindow.setContent(content); infoWindow.setHeaderContent(title); infoWindow.open({ map, anchor, shouldFocus: false, }); } initMap();
JavaScript
let map; let markers = {}; let infoWindow; async function initMap() { const { Map, InfoWindow } = await google.maps.importLibrary("maps"); const center = { lat: 37.4161493, lng: -122.0812166 }; map = new Map(document.getElementById('map'), { center: center, zoom: 11, mapTypeControl: false, mapId: 'DEMO_MAP_ID', }); const textInput = document.getElementById('text-input'); const textInputButton = document.getElementById('text-input-button'); const card = document.getElementById('text-input-card'); map.controls[google.maps.ControlPosition.TOP_LEFT].push(card); textInputButton.addEventListener('click', () => { findPlaces(textInput.value); }); textInput.addEventListener('keydown', (event) => { if (event.key === 'Enter') { findPlaces(textInput.value); } }); infoWindow = new google.maps.InfoWindow(); } async function findPlaces(query) { const { Place } = await google.maps.importLibrary("places"); const { AdvancedMarkerElement } = await google.maps.importLibrary("marker"); const request = { textQuery: query, fields: ['displayName', 'location', 'businessStatus'], includedType: '', // Restrict query to a specific type (leave blank for any). useStrictTypeFiltering: true, locationBias: map.center, isOpenNow: true, language: 'en-US', maxResultCount: 8, minRating: 1, // Specify a minimum rating. region: 'us', }; const { places } = await Place.searchByText(request); if (places.length) { const { LatLngBounds } = await google.maps.importLibrary("core"); const bounds = new LatLngBounds(); // First remove all existing markers. for (const id in markers) { markers[id].map = null; } ; markers = {}; // Loop through and get all the results. places.forEach(place => { const marker = new AdvancedMarkerElement({ map, position: place.location, title: place.displayName, }); markers[place.id] = marker; marker.addListener('gmp-click', () => { map.panTo(place.location); updateInfoWindow(place.displayName, place.id, marker); }); if (place.location != null) { bounds.extend(place.location); } }); map.fitBounds(bounds); } else { console.log('No results'); } } // Helper function to create an info window. async function updateInfoWindow(title, content, anchor) { infoWindow.setContent(content); infoWindow.setHeaderContent(title); infoWindow.open({ map, anchor, 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; } #text-input-card { width: 25%; 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; } #text-input { width: 100%; padding: 10px; margin: 0; box-sizing: border-box; } #text-input-button { display: inline-block; margin-top: .5rem; width: auto; padding: .6rem .75rem; font-size: .875rem; font-weight: 500; color: #fff; background-color: #2563eb; border: none; border-radius: .375rem; cursor: pointer; transition: background-color .15s ease-in-out; text-align: center }
HTML
<html> <head> <title>Text Search</title> <link rel="stylesheet" type="text/css" href="./style.css" /> <script type="module" src="./index.js"></script> </head> <body> <div id="text-input-card"> <input type="text" id="text-input" placeholder="Search for a place"></input> <input type="button" id="text-input-button" value="Search"></input> </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: "AIzaSyA6myHzS10YXdcazAFalmXvDkrYCp5cLc8", v: "weekly"});</script> </body> </html>