ย้ายข้อมูลไปยังการค้นหาสถานที่แบบใหม่

หน้านี้จะอธิบายความแตกต่างระหว่างฟีเจอร์การค้นหาสถานที่แบบข้อความในคลาส 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 ด้วย)

ดูข้อมูลเพิ่มเติม