การค้นหาข้อความ (ใหม่) จะใช้คำค้นหาข้อความและแสดงรายการสถานที่ที่ตรงกัน
การค้นหาข้อความ (ใหม่) จะแสดงข้อมูลเกี่ยวกับชุดสถานที่ตามสตริง เช่น "พิซซ่าในนิวยอร์ก" หรือ "ร้านรองเท้าใกล้กรุงเทพ" หรือ "123 ถนนสุขุมวิท" บริการจะตอบกลับด้วยรายการสถานที่ที่ตรงกับสตริงข้อความและการให้น้ำหนักสถานที่ที่ตั้งไว้ การค้นหาข้อความ (ใหม่) ช่วยให้คุณค้นหาสถานที่ตามประเภท กรองโดยใช้เกณฑ์ต่างๆ เช่น เวลาทำการและคะแนน รวมถึงจำกัดหรือกำหนดผลลัพธ์ให้เป็นสถานที่ที่เฉพาะเจาะจงได้
หากต้องการใช้การค้นหาข้อความ (ใหม่) คุณต้องเปิดใช้ "Places API (ใหม่)" ในโปรเจ็กต์ที่อยู่ในระบบคลาวด์ของ Google ดูรายละเอียดได้ที่เริ่มต้นใช้งาน
ค้นหาสถานที่ด้วยคำค้นหาที่เป็นข้อความ
เรียกใช้ searchByText เพื่อแสดงรายการสถานที่จากคำค้นหาที่เป็นข้อความหรือหมายเลขโทรศัพท์
ระบุพารามิเตอร์การค้นหาโดยใช้คำขอ แล้วเรียกใช้ searchByText() ระบบจะแสดงผลลัพธ์เป็นรายการออบเจ็กต์ Place ซึ่งคุณสามารถดูรายละเอียดสถานที่ได้ ข้อมูลโค้ดต่อไปนี้แสดงตัวอย่างคำขอและการเรียกใช้ searchByText
TypeScript
const request = { textQuery: query, fields: ['displayName', 'location', 'businessStatus'], includedType: '', // Restrict query to a specific type (leave blank for any). useStrictTypeFiltering: true, locationRestriction: map.getBounds(), 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, locationRestriction: map.getBounds(), isOpenNow: true, language: 'en-US', maxResultCount: 8, minRating: 1, // Specify a minimum rating. region: 'us', }; const { places } = await Place.searchByText(request);
- ระบุคำค้นหาที่เป็นข้อความหรือหมายเลขโทรศัพท์เพื่อค้นหาด้วยพารามิเตอร์
textQuery - ใช้พารามิเตอร์
fields(จำเป็น) เพื่อระบุรายการฟิลด์ข้อมูลอย่างน้อย 1 รายการที่คั่นด้วยคอมมาในรูปแบบการเขียนแบบ Camel Case ช่องที่คุณขอจะเป็นตัวกำหนดราคาของคำขอ ดูหัวข้อเลือกฟิลด์ข้อมูล - ใช้พารามิเตอร์
includedTypeเพื่อแสดงผลลัพธ์เฉพาะประเภทที่ระบุ - ใช้
locationBiasหรือlocationRestrictionเพื่อให้น้ำหนักหรือจำกัดผลการค้นหาข้อความให้อยู่ในภูมิภาคที่เฉพาะเจาะจง
หากคำค้นหามีหมายเลขโทรศัพท์ ควรตั้งค่าพารามิเตอร์ภูมิภาค ตัวอย่างเช่น หากคุณใช้หมายเลขโทรศัพท์เพื่อค้นหาสถานที่ในญี่ปุ่น และโดเมนที่ขอคือ jp คุณต้องตั้งค่าพารามิเตอร์ region เป็น "jp" หากละเว้น region จากคำขอ API จะใช้ภูมิภาคสหรัฐอเมริกา ("us") เป็นค่าเริ่มต้น
Place ซึ่งคุณสามารถดูรายละเอียดสถานที่ได้
ตัวอย่าง
ตัวอย่างต่อไปนี้เรียกใช้ searchByText ด้วยข้อความคำค้นหาที่ระบุ แล้วสร้างแผนที่ที่มีเครื่องหมายที่คลิกได้เพื่อแสดงผลลัพธ์
TypeScript
let map: google.maps.Map; let markers: Record<string, google.maps.marker.AdvancedMarkerElement> = {}; let infoWindow: google.maps.InfoWindow; async function init() { const [{ Map, InfoWindow }, { ControlPosition }] = await Promise.all([ google.maps.importLibrary('maps'), google.maps.importLibrary('core'), ]); const center = { lat: 37.4161493, lng: -122.0812166 }; map = new Map(document.getElementById('map')!, { 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')!; map.controls[ControlPosition.TOP_LEFT].push(card); textInputButton.addEventListener('click', () => { void findPlaces(textInput.value); }); textInput.addEventListener('keydown', (event) => { if (event.key === 'Enter') { void findPlaces(textInput.value); } }); infoWindow = new InfoWindow(); } async function findPlaces(query: string) { const [{ Place }, { AdvancedMarkerElement }] = await Promise.all([ google.maps.importLibrary('places'), 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, locationRestriction: map.getBounds(), 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: google.maps.places.Place) => { const marker = new AdvancedMarkerElement({ map, position: place.location, title: place.displayName, gmpClickable: true, }); markers[place.id] = marker; marker.addEventListener('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. function updateInfoWindow( title: string | Element | null, content: string | Element | null, anchor: google.maps.marker.AdvancedMarkerElement ) { infoWindow.setContent(content); infoWindow.setHeaderContent(title); infoWindow.open({ map, anchor, shouldFocus: false, }); } void init();
JavaScript
let map; let markers = {}; let infoWindow; async function init() { const [{ Map, InfoWindow }, { ControlPosition }] = await Promise.all([ google.maps.importLibrary('maps'), google.maps.importLibrary('core'), ]); const center = { lat: 37.4161493, lng: -122.0812166 }; map = new Map(document.getElementById('map'), { 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[ControlPosition.TOP_LEFT].push(card); textInputButton.addEventListener('click', () => { void findPlaces(textInput.value); }); textInput.addEventListener('keydown', (event) => { if (event.key === 'Enter') { void findPlaces(textInput.value); } }); infoWindow = new InfoWindow(); } async function findPlaces(query) { const [{ Place }, { AdvancedMarkerElement }] = await Promise.all([ google.maps.importLibrary('places'), 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, locationRestriction: map.getBounds(), 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, gmpClickable: true, }); markers[place.id] = marker; marker.addEventListener('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. function updateInfoWindow(title, content, anchor) { infoWindow.setContent(content); infoWindow.setHeaderContent(title); infoWindow.open({ map, anchor, shouldFocus: false, }); } void init();
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: 0.5rem; width: auto; padding: 0.6rem 0.75rem; font-size: 0.875rem; font-weight: 500; color: #fff; background-color: #2563eb; border: none; border-radius: 0.375rem; cursor: pointer; transition: background-color 0.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>
<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>
<div id="text-input-card">
<input
type="text"
id="text-input"
placeholder="Search for a place" />
<input type="button" id="text-input-button" value="Search" />
</div>
<div id="map"></div>
</body>
</html>เลือกฟิลด์ข้อมูล
ช่องที่คุณขอจะกำหนดราคาของคำขอการค้นหาแต่ละรายการ ระบบจะเรียกเก็บเงินสำหรับคำขอเพียงครั้งเดียวที่ SKU สูงสุดในบรรดาช่องที่ขอ เช่น การเพิ่ม
reviews
ลงใน
fields
จะเรียกเก็บเงินคำขอทั้งหมดเป็น การค้นหาข้อความ Enterprise + Atmosphere
หากต้องการให้คำขอการค้นหาอยู่ใน Text Search Pro ให้ขอเฉพาะช่องที่ผลการค้นหาแสดง เช่น id, displayName, formattedAddress และ location
เมื่อผู้ใช้เลือกสถานที่ ให้เรียกใช้ fetchFields() ในสถานที่นั้นเพื่อรับฟิลด์ต่างๆ เช่น reviews, nationalPhoneNumber หรือ websiteURI
การเรียกใช้ fetchFields() แต่ละครั้งเป็นคำขอรายละเอียดสถานที่แยกต่างหาก โดยจะเรียกเก็บเงินตาม SKU สูงสุดในบรรดาฟิลด์ที่ขอ วิธีนี้จะช่วยประหยัดเงินได้หรือไม่นั้นขึ้นอยู่กับจำนวนสถานที่ที่ผู้ใช้เปิด
ช่องที่ทริกเกอร์ SKU แต่ละรายการ
ช่องต่อไปนี้จะทริกเกอร์ SKU ของ Text Search Essentials (รหัสเท่านั้น)
idฟิลด์ต่อไปนี้จะทริกเกอร์ SKU การค้นหาข้อความ Pro
accessibilityOptions
addressComponents
adrFormatAddress
businessStatus
displayName
formattedAddress
googleMapsUri
iconBackgroundColor
location
photos
plusCode
svgIconMaskURI
types
utcOffsetMinutes
viewportช่องต่อไปนี้จะทริกเกอร์ SKU ระดับองค์กรสำหรับการค้นหาข้อความ
internationalPhoneNumber
nationalPhoneNumber
priceLevel
rating
regularOpeningHours
userRatingCount
websiteURIช่องต่อไปนี้จะทริกเกอร์ SKU การค้นหาข้อความ Enterprise + บรรยากาศ
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
ดู SKU ของทุกฟิลด์ได้ที่ฟิลด์ข้อมูลคลาส Place