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