หน้านี้อธิบายความแตกต่างระหว่างฟีเจอร์การค้นหาสถานที่ตามข้อความในคลาส Place (ใหม่) กับ PlacesService (เดิม) และแสดงข้อมูลโค้ดบางส่วนเพื่อเปรียบเทียบ
PlacesService เดิมมีวิธีการค้นหาตามข้อความต่อไปนี้
- เมธอด
findPlaceFromQuery()ซึ่งรับคำค้นหาข้อความและแสดงผลลัพธ์สถานที่เดียว รวมถึงรองรับการใช้ฟิลด์ข้อมูลสถานที่ - เมธอด
findPlaceFromPhoneNumber()ซึ่งช่วยให้คุณค้นหาสถานที่โดยใช้หมายเลขโทรศัพท์ และรองรับการใช้ฟิลด์ข้อมูลสถานที่ - เมธอด
textSearch()ซึ่งรับคำค้นหาข้อความและแสดงรายการผลลัพธ์ของสถานที่textSearch()เป็นเวอร์ชันเก่าและไม่รองรับการใช้ฟิลด์ข้อมูลสถานที่
คลาส Place ใหม่มีเมธอด Place.searchByText() ซึ่งช่วยให้คุณค้นหาสถานที่โดยใช้การค้นหาข้อความหรือหมายเลขโทรศัพท์ และช่วยให้คุณปรับแต่งการค้นหาโดยใช้ฟิลด์ข้อมูลสถานที่และประเภทสถานที่ที่อัปเดตเป็นประจำซึ่งมีให้เลือกมากขึ้น
ตารางต่อไปนี้แสดงความแตกต่างหลักบางประการในวิธีการค้นหาสถานที่ระหว่างคลาส Place และ PlacesService
PlacesService (เดิม) |
Place (ใหม่) |
|---|---|
findPlaceFromQuery()findPlaceFromPhoneNumber()
|
searchByText() |
FindPlaceFromQueryRequestFindPlaceFromPhoneNumberRequest |
SearchByTextRequest |
| ตัวเลือกการค้นหาที่จำกัด | ตัวเลือกการค้นหาที่ครอบคลุมมากขึ้น |
ต้องใช้ Callback เพื่อจัดการออบเจ็กต์ผลลัพธ์และการตอบกลับ google.maps.places.PlacesServiceStatus |
ใช้ Promises และทำงานแบบอะซิงโครนัส |
ต้องมีการตรวจสอบ PlacesServiceStatus |
ไม่จำเป็นต้องตรวจสอบสถานะ สามารถใช้การจัดการข้อผิดพลาดมาตรฐานได้ ดูข้อมูลเพิ่มเติม |
| รองรับเฉพาะการให้น้ำหนักตามสถานที่ตั้ง | รองรับการให้น้ำหนักสถานที่และการจำกัดสถานที่ |
| ฟิลด์ข้อมูลสถานที่จะจัดรูปแบบโดยใช้ Snake Case | ฟิลด์ข้อมูลสถานที่จะจัดรูปแบบโดยใช้การเขียนแบบ Camel Case |
| แสดงผลการค้นหาสถานที่เดียว | แสดงผลการค้นหาสถานที่สูงสุด 20 รายการ |
| จำกัดเฉพาะประเภทสถานที่และฟิลด์ข้อมูลสถานที่ที่กำหนดไว้ | มีประเภทสถานที่และฟิลด์ข้อมูลสถานที่ที่อัปเดตเป็นประจำให้เลือกมากขึ้น |
textSearch() |
searchByText() |
| แสดงผลฟิลด์ข้อมูลทั้งหมดที่ใช้ได้ (ชุดย่อยของฟิลด์ที่รองรับ) โดยไม่สามารถจำกัดให้แสดงเฉพาะฟิลด์ที่ต้องการได้ | แสดงเฉพาะฟิลด์ข้อมูลสถานที่ที่ขอ |
การเปรียบเทียบโค้ด
ส่วนนี้จะเปรียบเทียบโค้ดสำหรับวิธีการค้นหาข้อความเพื่อแสดงความแตกต่างระหว่างบริการ Places และคลาส Place ข้อมูลโค้ดแสดงโค้ดที่จำเป็นใน API ที่เกี่ยวข้องแต่ละรายการเพื่อส่งคำขอการค้นหาตามข้อความ
Places Service (เดิม)
ข้อมูลโค้ดต่อไปนี้แสดงการใช้เมธอด findPlaceFromQuery() เพื่อค้นหาสถานที่ คำขอเป็นแบบซิงโครนัสและมีการตรวจสอบแบบมีเงื่อนไขใน PlacesServiceStatus ฟิลด์ข้อมูลสถานที่ที่จำเป็นจะระบุไว้ในเนื้อหาคำขอ ซึ่งกำหนดไว้ก่อนที่จะส่งคำขอจริง
function findPlaces() {
const request = {
query: "Museum of Contemporary Art Australia",
fields: ["name", "geometry"],
};
// Create an instance of PlacesService.
service = new google.maps.places.PlacesService(map);
// Make a findPlaceFromQuery request.
service.findPlaceFromQuery(request, (results, status) => {
let place = results[0];
if (status === google.maps.places.PlacesServiceStatus.OK && results) {
if (!place.geometry || !place.geometry.location) return;
const marker = new google.maps.Marker({
map,
position: place.geometry.location,
});
map.setCenter(place.geometry.location);
}
});
}
ดูข้อมูลเพิ่มเติม
การค้นหาข้อความ (ใหม่)
ข้อมูลโค้ดต่อไปนี้แสดงการใช้เมธอด searchByText() เพื่อค้นหาสถานที่ คำขอเป็นแบบอะซิงโครนัสและไม่จำเป็นต้องตรวจสอบสถานะ (ใช้การจัดการข้อผิดพลาดมาตรฐานได้) ในตัวอย่างนี้ คำขอมี maxResultCount เป็น 8 (ค่าต้องอยู่ระหว่าง 1 ถึง 20) ฟังก์ชันนี้จะวนซ้ำผลลัพธ์และเพิ่มเครื่องหมายสำหรับแต่ละรายการ โดยปรับขอบเขตของแผนที่ตามตำแหน่งของเครื่องหมาย เนื่องจากเมธอด searchByText() ใช้โอเปอเรเตอร์ await จึงใช้ได้เฉพาะภายในฟังก์ชัน async เท่านั้น
async function findPlaces() {
// Define a request.
// The `fields` property is required; all others are optional.
const request = {
fields: ["displayName", "location", "businessStatus"],
textQuery: "Tacos in Mountain View",
includedType: "restaurant",
locationBias: { lat: 37.4161493, lng: -122.0812166 },
isOpenNow: true,
language: "en-US",
maxResultCount: 8,
minRating: 3.2,
region: "us",
useStrictTypeFiltering: false,
};
// Call searchByText passing the request.
const { places } = await google.maps.places.Place.searchByText(request);
// Add a marker for each result.
if (places.length) {
const bounds = new google.maps.LatLngBounds();
places.forEach((place) => {
const markerView = new google.maps.marker.AdvancedMarkerElement({
map,
position: place.location,
title: place.displayName,
});
bounds.extend(place.location);
console.log(place);
});
map.fitBounds(bounds);
} else {
console.log("No results");
}
}
เมธอด searchByText() รองรับตัวเลือกคำขอมากกว่าเวอร์ชันก่อนหน้าหลายรายการ ซึ่งรวมถึงตัวเลือกต่อไปนี้
includedTypeซึ่งช่วยให้คุณจำกัดการค้นหาเฉพาะสถานที่บางประเภทได้isOpenNowซึ่งช่วยให้คุณจำกัดการค้นหาให้แสดงเฉพาะสถานที่ที่เปิดอยู่ได้minRatingซึ่งช่วยให้คุณกรองผลลัพธ์ที่ต่ำกว่าขีดจำกัดที่ระบุออกได้ (เช่น แสดงเฉพาะสถานที่ที่มีคะแนนตั้งแต่ 3 ดาวขึ้นไป)locationRestrictionซึ่งจะละเว้นผลลัพธ์ที่อยู่นอกสถานที่ตั้งที่ระบุ (รองรับlocationBiasด้วย)
ดูข้อมูลเพิ่มเติม
- ดูโค้ดตัวอย่างที่เสร็จสมบูรณ์
- ดูเอกสารประกอบสำหรับการค้นหาข้อความ (ใหม่)
- ดูข้อมูลอ้างอิง
searchByText()