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

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

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

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

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

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

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

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

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