หน้านี้จะอธิบายความแตกต่างระหว่างฟีเจอร์การค้นหาสถานที่แบบข้อความในคลาส Place
(ใหม่) กับคลาส PlacesService
(เดิม) รวมถึงแสดงข้อมูลโค้ดบางส่วนเพื่อเปรียบเทียบ
PlacesService
รุ่นเดิมมีวิธีการค้นหาแบบข้อความดังต่อไปนี้
- เมธอด
findPlaceFromQuery()
ซึ่งรับการค้นหาแบบข้อความและแสดงผลการค้นหาสถานที่แห่งเดียว และรองรับการใช้ช่องข้อมูลสถานที่ - เมธอด
findPlaceFromPhoneNumber()
ที่ช่วยให้คุณค้นหาสถานที่โดยใช้หมายเลขโทรศัพท์ และรองรับการใช้ช่องข้อมูลสถานที่ - เมธอด
textSearch()
ซึ่งใช้การค้นหาข้อความและแสดงผลลัพธ์สถานที่textSearch()
เป็นเวอร์ชันเก่าและไม่รองรับการใช้ฟิลด์ข้อมูลสถานที่
คลาส Place
ใหม่มีเมธอด Place.searchByText()
ซึ่งให้คุณค้นหาสถานที่โดยใช้ข้อความค้นหาหรือหมายเลขโทรศัพท์ และให้คุณปรับแต่งการค้นหาโดยใช้ช่องข้อมูลสถานที่และประเภทสถานที่ที่อัปเดตเป็นประจำซึ่งมีตัวเลือกมากขึ้น
ตารางต่อไปนี้แสดงความแตกต่างหลักๆ บางประการของวิธีการค้นหาสถานที่ระหว่างคลาส Place
กับ PlacesService
PlacesService (เดิม) |
Place (ใหม่) |
---|---|
findPlaceFromQuery() findPlaceFromPhoneNumber()
|
searchByText() |
FindPlaceFromQueryRequest FindPlaceFromPhoneNumberRequest |
SearchByTextRequest |
ตัวเลือกการค้นหาที่จํากัด | ตัวเลือกการค้นหาที่ครอบคลุมมากขึ้น |
ต้องใช้การเรียกกลับเพื่อจัดการออบเจ็กต์ผลลัพธ์และgoogle.maps.places.PlacesServiceStatus การตอบกลับ |
ใช้ Promises และทํางานแบบไม่พร้อมกัน |
ต้องเลือกช่อง PlacesServiceStatus |
ไม่ต้องมีการตรวจสอบสถานะ สามารถใช้การจัดการข้อผิดพลาดมาตรฐานได้ |
รองรับเฉพาะอคติด้านสถานที่ตั้ง | รองรับอคติด้านสถานที่และการจํากัดสถานที่ |
ฟิลด์ข้อมูลสถานที่มีการจัดรูปแบบโดยใช้รูปแบบ Snake Case | ฟิลด์ข้อมูลสถานที่มีการจัดรูปแบบโดยใช้รูปแบบ Camel Case |
แสดงผลลัพธ์สถานที่เดียว | แสดงผลลัพธ์สถานที่ได้สูงสุด 20 รายการ |
จำกัดไว้ที่ชุดประเภทสถานที่และช่องข้อมูลสถานที่ที่กำหนดไว้ | มีตัวเลือกประเภทสถานที่และฟิลด์ข้อมูลสถานที่ที่อัปเดตเป็นประจำเพิ่มเติม |
textSearch() |
searchByText() |
แสดงฟิลด์ข้อมูลที่มีอยู่ทั้งหมด (ชุดย่อยของฟิลด์ที่รองรับ) ไม่สามารถจํากัดเฉพาะฟิลด์ใดฟิลด์หนึ่ง | แสดงเฉพาะช่องข้อมูลสถานที่ที่ขอ |
การเปรียบเทียบโค้ด
ส่วนนี้จะเปรียบเทียบโค้ดสำหรับเมธอดการค้นหาข้อความเพื่อแสดงให้เห็นความแตกต่างระหว่างบริการ Places กับคลาส Place ตัวอย่างโค้ดแสดงโค้ดที่จําเป็นในแต่ละ API ที่เกี่ยวข้องเพื่อสร้างคําขอการค้นหาแบบข้อความ
บริการ Places (เดิม)
ข้อมูลโค้ดต่อไปนี้แสดงการใช้เมธอด 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
ด้วย)