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

นักพัฒนาซอฟต์แวร์ในเขตเศรษฐกิจยุโรป (EEA)

หน้านี้จะอธิบายความแตกต่างระหว่างฟีเจอร์การค้นหาสถานที่ตามข้อความในคลาส Place (ใหม่) และ PlacesService (เดิม) รวมถึงแสดงข้อมูลโค้ดบางส่วนเพื่อเปรียบเทียบ

PlacesService รุ่นเดิมมีวิธีการค้นหาแบบข้อความต่อไปนี้

  • findPlaceFromQuery() วิธีการที่รับการค้นหาที่เป็นข้อความและแสดงผลลัพธ์สถานที่เดียว และรองรับการใช้ช่องข้อมูลสถานที่
  • findPlaceFromPhoneNumber() วิธีการที่ช่วยให้คุณค้นหาสถานที่ โดยใช้หมายเลขโทรศัพท์ และรองรับการใช้ช่องข้อมูลสถานที่
  • textSearch() เมธอดที่รับการค้นหาข้อความและแสดงรายการผลลัพธ์ของสถานที่ textSearch() เป็นเวอร์ชันเก่ากว่าและไม่รองรับการใช้ฟิลด์ข้อมูลสถานที่

คลาส Place ใหม่มีเมธอด Place.searchByText() ซึ่งช่วยให้คุณ ค้นหาสถานที่โดยใช้ข้อความค้นหาหรือหมายเลขโทรศัพท์ และช่วยให้คุณ ปรับแต่งการค้นหาโดยใช้ตัวเลือกที่ขยายของช่องข้อมูลสถานที่และประเภทสถานที่ที่อัปเดตเป็นประจำ

ตารางต่อไปนี้แสดงความแตกต่างหลักบางประการในวิธีการค้นหาสถานที่ ระหว่างคลาส Place กับ PlacesService

PlacesService (เดิม) Place (ใหม่)
findPlaceFromQuery()
findPlaceFromPhoneNumber()
searchByText()
FindPlaceFromQueryRequest
FindPlaceFromPhoneNumberRequest
SearchByTextRequest
ตัวเลือกการค้นหาที่จำกัด ตัวเลือกการค้นหาที่ครอบคลุมมากขึ้น
ต้องใช้ Callback เพื่อจัดการออบเจ็กต์ผลลัพธ์และgoogle.maps.places.PlacesServiceStatusการตอบกลับ ใช้ Promise และทำงานแบบไม่พร้อมกัน
ต้องมีการตรวจสอบ 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 ก็รองรับด้วย)

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