„Nearby Search (New)“ gibt für einen oder mehrere Ortstypen eine Liste mit passenden Orten aus. Im folgenden Beispiel können Sie einen Ortstyp auswählen und die Ergebnisse auf einer Karte sehen. Klicken Sie auf die Markierungen, um weitere Details zu den Orten zu sehen.
„Nearby Search (New)“ gibt auf Grundlage der von Ihnen angegebenen Ortstypen Informationen zu einer Reihe von Orten zurück, z. B. restaurant, book_store oder bowling_alley. Der Dienst gibt eine Liste der Orte zurück, die den angegebenen Ortstypen innerhalb des Radius der festgelegten locationRestriction entsprechen.
Wenn Sie „Nearby Search (New)“ verwenden möchten, müssen Sie „Places API (New)“ in Ihrem Google Cloud-Projekt aktivieren. Weitere Informationen
Orte in der Nähe finden
Rufen Sie searchNearby() auf, um auf Grundlage der angegebenen Ortstypen, des Ortes und des Radius eine Liste von Orten zu erhalten. Geben Sie die Suchparameter in einer Anfrage an und rufen Sie dann searchNearby() auf. Die Ergebnisse werden in Form einer Liste von Place-Objekten zurückgegeben, aus der Sie Ortsdetails abrufen können.
Das folgende Snippet zeigt ein Beispiel für eine Anfrage und einen Aufruf von searchNearby():
TypeScript
// Get bounds and radius to constrain search. center = mapElement.center!; const ne = innerMap.getBounds()!.getNorthEast(); const sw = innerMap.getBounds()!.getSouthWest(); const diameter = spherical.computeDistanceBetween(ne, sw); const radius = Math.min(diameter / 2, 50000); // Radius cannot be more than 50000. const request = { // required parameters fields: [ 'displayName', 'location', 'formattedAddress', 'googleMapsURI', ], locationRestriction: { center, radius, }, // optional parameters includedPrimaryTypes: [typeSelect.value], maxResultCount: 5, rankPreference: SearchNearbyRankPreference.POPULARITY, }; const { places } = await Place.searchNearby(request);
JavaScript
// Get bounds and radius to constrain search. center = mapElement.center; const ne = innerMap.getBounds().getNorthEast(); const sw = innerMap.getBounds().getSouthWest(); const diameter = spherical.computeDistanceBetween(ne, sw); const radius = Math.min(diameter / 2, 50000); // Radius cannot be more than 50000. const request = { // required parameters fields: [ 'displayName', 'location', 'formattedAddress', 'googleMapsURI', ], locationRestriction: { center, radius, }, // optional parameters includedPrimaryTypes: [typeSelect.value], maxResultCount: 5, rankPreference: SearchNearbyRankPreference.POPULARITY, }; const { places } = await Place.searchNearby(request);
- Verwenden Sie den Parameter
fields(erforderlich), um eine durch Kommas getrennte Liste eines oder mehrerer Datenfelder anzugeben. Die von Ihnen angeforderten Felder bestimmen den Preis der Anfrage. Weitere Informationen finden Sie unter Datenfelder auswählen. - Verwenden Sie den Parameter
locationRestriction(erforderlich), um einen Radius von bis zu 50.000 Metern anzugeben. - Verwenden Sie den Parameter
includedPrimaryTypes, um einen oder mehrere Ortstypen anzugeben, nach denen gesucht werden soll. - Verwenden Sie den Parameter
rankPreference, um entwederPOPULARITYoderDISTANCEalsSearchNearbyRankPreferenceanzugeben. - Vollständige Liste der Parameter
Beispiel
Im folgenden Beispiel wird searchNearby() verwendet, um nach Orten des ausgewählten Typs innerhalb der Kartengrenzen zu suchen. Die Ergebnisse werden auf einer Karte in Form von Markierungen dargestellt.
TypeScript
const mapElement = document.querySelector('gmp-map')!; let innerMap: google.maps.Map; let center: google.maps.LatLngLiteral | google.maps.LatLng; let typeSelect: HTMLSelectElement; let infoWindow: google.maps.InfoWindow; async function init() { const [{ InfoWindow }, { event }] = await Promise.all([ google.maps.importLibrary('maps'), google.maps.importLibrary('core'), ]); innerMap = mapElement.innerMap; innerMap.setOptions({ mapTypeControl: false, }); typeSelect = document.querySelector('.type-select')!; typeSelect.addEventListener('change', () => { void nearbySearch(); }); infoWindow = new InfoWindow(); // Kick off an initial search once map has loaded. event.addListenerOnce(innerMap, 'idle', () => { void nearbySearch(); }); } async function nearbySearch() { const [ { Place, SearchNearbyRankPreference }, { AdvancedMarkerElement }, { spherical }, ] = await Promise.all([ google.maps.importLibrary('places'), google.maps.importLibrary('marker'), google.maps.importLibrary('geometry'), ]); // Get bounds and radius to constrain search. center = mapElement.center!; const ne = innerMap.getBounds()!.getNorthEast(); const sw = innerMap.getBounds()!.getSouthWest(); const diameter = spherical.computeDistanceBetween(ne, sw); const radius = Math.min(diameter / 2, 50000); // Radius cannot be more than 50000. const request = { // required parameters fields: [ 'displayName', 'location', 'formattedAddress', 'googleMapsURI', ], locationRestriction: { center, radius, }, // optional parameters includedPrimaryTypes: [typeSelect.value], maxResultCount: 5, rankPreference: SearchNearbyRankPreference.POPULARITY, }; const { places } = await Place.searchNearby(request); if (places.length) { const { LatLngBounds } = await google.maps.importLibrary('core'); const bounds = new LatLngBounds(); // First remove all existing markers. for (const marker of mapElement.querySelectorAll('gmp-advanced-marker')) marker.remove(); // Loop through and get all the results. places.forEach((place) => { if (!place.location) return; bounds.extend(place.location); const marker = new AdvancedMarkerElement({ map: innerMap, position: place.location, title: place.displayName, gmpClickable: true, }); // Build the content of the InfoWindow safely using DOM elements. const content = document.createElement('div'); const address = document.createElement('div'); address.textContent = place.formattedAddress || ''; const placeId = document.createElement('div'); placeId.textContent = place.id; content.append(address, placeId); if (place.googleMapsURI) { const link = document.createElement('a'); link.href = place.googleMapsURI; link.target = '_blank'; link.textContent = 'View Details on Google Maps'; content.appendChild(link); } marker.addEventListener('gmp-click', () => { innerMap.panTo(place.location!); updateInfoWindow(place.displayName!, content, marker); }); }); innerMap.fitBounds(bounds, 100); } else { console.log('No results'); } } function updateInfoWindow( title: string | Element | null, content: string | Element | null, anchor: google.maps.marker.AdvancedMarkerElement ) { infoWindow.setContent(content); infoWindow.setHeaderContent(title); infoWindow.open({ anchor, }); } void init();
JavaScript
const mapElement = document.querySelector('gmp-map'); let innerMap; let center; let typeSelect; let infoWindow; async function init() { const [{ InfoWindow }, { event }] = await Promise.all([ google.maps.importLibrary('maps'), google.maps.importLibrary('core'), ]); innerMap = mapElement.innerMap; innerMap.setOptions({ mapTypeControl: false, }); typeSelect = document.querySelector('.type-select'); typeSelect.addEventListener('change', () => { void nearbySearch(); }); infoWindow = new InfoWindow(); // Kick off an initial search once map has loaded. event.addListenerOnce(innerMap, 'idle', () => { void nearbySearch(); }); } async function nearbySearch() { const [ { Place, SearchNearbyRankPreference }, { AdvancedMarkerElement }, { spherical }, ] = await Promise.all([ google.maps.importLibrary('places'), google.maps.importLibrary('marker'), google.maps.importLibrary('geometry'), ]); // Get bounds and radius to constrain search. center = mapElement.center; const ne = innerMap.getBounds().getNorthEast(); const sw = innerMap.getBounds().getSouthWest(); const diameter = spherical.computeDistanceBetween(ne, sw); const radius = Math.min(diameter / 2, 50000); // Radius cannot be more than 50000. const request = { // required parameters fields: [ 'displayName', 'location', 'formattedAddress', 'googleMapsURI', ], locationRestriction: { center, radius, }, // optional parameters includedPrimaryTypes: [typeSelect.value], maxResultCount: 5, rankPreference: SearchNearbyRankPreference.POPULARITY, }; const { places } = await Place.searchNearby(request); if (places.length) { const { LatLngBounds } = await google.maps.importLibrary('core'); const bounds = new LatLngBounds(); // First remove all existing markers. for (const marker of mapElement.querySelectorAll('gmp-advanced-marker')) marker.remove(); // Loop through and get all the results. places.forEach((place) => { if (!place.location) return; bounds.extend(place.location); const marker = new AdvancedMarkerElement({ map: innerMap, position: place.location, title: place.displayName, gmpClickable: true, }); // Build the content of the InfoWindow safely using DOM elements. const content = document.createElement('div'); const address = document.createElement('div'); address.textContent = place.formattedAddress || ''; const placeId = document.createElement('div'); placeId.textContent = place.id; content.append(address, placeId); if (place.googleMapsURI) { const link = document.createElement('a'); link.href = place.googleMapsURI; link.target = '_blank'; link.textContent = 'View Details on Google Maps'; content.appendChild(link); } marker.addEventListener('gmp-click', () => { innerMap.panTo(place.location); updateInfoWindow(place.displayName, content, marker); }); }); innerMap.fitBounds(bounds, 100); } else { console.log('No results'); } } function updateInfoWindow(title, content, anchor) { infoWindow.setContent(content); infoWindow.setHeaderContent(title); infoWindow.open({ anchor, }); } void init();
CSS
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */ gmp-map { height: 100%; } #map-container { display: flex; flex-direction: row; height: 100%; } /* * Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; } .type-select { width: 400px; height: 32px; border: 1px solid #000; border-radius: 10px; flex-grow: 1; padding: 0 10px; margin-left: 10px; margin-top: 10px; }
HTML
<html>
<head>
<title>Nearby Search</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 center="45.438646,12.327573" zoom="14" map-id="DEMO_MAP_ID"
><!-- Map id is required for Advanced Markers. -->
<gmp-advanced-marker></gmp-advanced-marker>
<div id="controls" slot="control-inline-start-block-start">
<select name="types" class="type-select">
<option value="cafe" selected>Cafe</option>
<option value="restaurant">Restaurant</option>
<option value="museum">Museum</option>
<option value="monument">Monument</option>
<option value="park">Park</option>
</select>
</div>
</gmp-map>
</body>
</html>Datenfelder auswählen
Die von Ihnen angeforderten Felder bestimmen den Preis jeder Suchanfrage. Die Anfrage wird einmal in Rechnung gestellt, und zwar mit der höchsten SKU unter den angeforderten Feldern. Wenn Sie beispielsweise reviews zu fields hinzufügen, wird die gesamte Anfrage als „Nearby Search Enterprise + Atmosphere“ abgerechnet.
Wenn Sie Suchanfragen auf Nearby Search Pro beschränken möchten, fordern Sie nur die Felder an, die in Ihren Suchergebnissen angezeigt werden, z. B. id, displayName, formattedAddress und location.
Wenn ein Nutzer einen Ort auswählt, rufen Sie fetchFields() für diesen Ort auf, um Felder wie reviews, nationalPhoneNumber oder websiteURI abzurufen.
Jeder fetchFields()-Aufruf ist eine separate „Place Details“-Anfrage, die mit der höchsten SKU unter den angeforderten Feldern abgerechnet wird. Ob Sie mit diesem Ansatz Geld sparen, hängt davon ab, wie viele Orte Ihre Nutzer öffnen.
Felder, die die einzelnen SKUs auslösen
Die folgenden Felder lösen die SKU „Nearby Search Pro“ aus:
accessibilityOptions
addressComponents
adrFormatAddress
businessStatus
displayName
formattedAddress
googleMapsUri
iconBackgroundColor
id
location
photos
plusCode
svgIconMaskURI
types
utcOffsetMinutes
viewport
Die folgenden Felder lösen die Nearby Search Enterprise-SKU aus:
internationalPhoneNumber
nationalPhoneNumber
priceLevel
rating
regularOpeningHours
userRatingCount
websiteURIDie folgenden Felder lösen die SKU „Nearby Search Enterprise + Atmosphere“ aus:
allowsDogs
editorialSummary
evChargeOptions
fuelOptions
hasCurbsidePickup
hasDelivery
hasDineIn
hasLiveMusic
hasMenuForChildren
hasOutdoorSeating
hasRestroom
hasTakeout
hasWifi
isGoodForChildren
isGoodForGroups
isGoodForWatchingSports
isReservable
parkingOptions
paymentOptions
reviews
servesBeer
servesBreakfast
servesBrunch
servesCocktails
servesCoffee
servesDessert
servesDinner
servesLunch
servesVegetarianFood
servesWine
Die SKU für jedes Feld finden Sie unter Datenfelder der Klasse „Place“.