Di chuyển sang tính năng Tìm kiếm địa điểm mới

Nhà phát triển ở Khu vực kinh tế Châu Âu (EEA)

Trang này giải thích sự khác biệt giữa các tính năng tìm kiếm địa điểm dựa trên văn bản trong lớp Place (mới) và PlacesService (cũ), đồng thời cung cấp một số đoạn mã để so sánh.

PlacesService cũ có các phương thức tìm kiếm dựa trên văn bản sau:

  • Phương thức findPlaceFromQuery() lấy một truy vấn văn bản và trả về một kết quả duy nhất về địa điểm, đồng thời hỗ trợ việc sử dụng các trường dữ liệu về địa điểm.
  • Phương thức findPlaceFromPhoneNumber() cho phép bạn tìm kiếm một địa điểm bằng số điện thoại và hỗ trợ việc sử dụng các trường dữ liệu về địa điểm.
  • Phương thức textSearch() lấy một truy vấn văn bản và trả về danh sách kết quả về địa điểm. textSearch() là phiên bản cũ và không hỗ trợ việc sử dụng các trường dữ liệu về địa điểm.

Lớp Place mới cung cấp phương thức Place.searchByText(), cho phép bạn tìm kiếm địa điểm bằng cụm từ tìm kiếm dạng văn bản hoặc số điện thoại, đồng thời cho phép bạn tuỳ chỉnh nội dung tìm kiếm bằng cách sử dụng nhiều trường dữ liệu địa điểm và loại địa điểm được cập nhật thường xuyên.

Bảng sau đây liệt kê một số điểm khác biệt chính trong các phương thức tìm kiếm địa điểm giữa lớp PlacePlacesService:

PlacesService (Cũ) Place (Mới)
findPlaceFromQuery()
findPlaceFromPhoneNumber()
searchByText()
FindPlaceFromQueryRequest
FindPlaceFromPhoneNumberRequest
SearchByTextRequest
Bị hạn chế về các lựa chọn truy vấn. Nhiều lựa chọn tìm kiếm mở rộng hơn.
Yêu cầu sử dụng một lệnh gọi lại để xử lý đối tượng kết quả và phản hồi google.maps.places.PlacesServiceStatus. Sử dụng Promise và hoạt động không đồng bộ.
Cần có chế độ kiểm tra PlacesServiceStatus. Không cần kiểm tra trạng thái bắt buộc, có thể sử dụng quy trình xử lý lỗi tiêu chuẩn. Tìm hiểu thêm.
Chỉ hỗ trợ thiên vị về vị trí. Hỗ trợ thiên kiến về vị trí và hạn chế về vị trí.
Các trường dữ liệu về địa điểm được định dạng bằng snake case. Các trường dữ liệu địa điểm được định dạng bằng quy tắc viết hoa chữ cái đầu của từ (camel case).
Trả về một kết quả duy nhất về địa điểm. Trả về tối đa 20 kết quả về địa điểm.
Chỉ giới hạn ở một nhóm cố định gồm các loại địa điểmcác trường dữ liệu địa điểm. Cung cấp nhiều lựa chọn hơn về các loại địa điểmcác trường dữ liệu về địa điểm được cập nhật thường xuyên.
textSearch()
searchByText()
Trả về tất cả các trường dữ liệu có sẵn (một nhóm nhỏ các trường được hỗ trợ); không thể bị giới hạn ở các trường cụ thể. Chỉ trả về các trường dữ liệu địa điểm được yêu cầu.

So sánh mã

Phần này so sánh mã cho các phương thức tìm kiếm văn bản để minh hoạ sự khác biệt giữa Places Service và lớp Place. Các đoạn mã cho thấy mã cần thiết trên mỗi API tương ứng để thực hiện một yêu cầu tìm kiếm dựa trên văn bản.

Places Service (Cũ)

Đoạn mã sau đây cho thấy cách sử dụng phương thức findPlaceFromQuery() để tìm kiếm một địa điểm. Yêu cầu này là đồng bộ và bao gồm một quy trình kiểm tra có điều kiện trên PlacesServiceStatus. Các trường dữ liệu cần thiết về địa điểm được chỉ định trong phần nội dung yêu cầu. Phần nội dung này được xác định trước khi đưa ra yêu cầu thực tế.

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);
    }
  });
}

Tìm hiểu thêm

Tìm kiếm bằng văn bản (Mới)

Đoạn mã sau đây cho thấy cách sử dụng phương thức searchByText() để tìm kiếm địa điểm. Yêu cầu này là không đồng bộ và không yêu cầu kiểm tra trạng thái (bạn có thể sử dụng quy trình xử lý lỗi tiêu chuẩn). Trong ví dụ này, yêu cầu bao gồm maxResultCount là 8 (giá trị phải nằm trong khoảng từ 1 đến 20). Hàm này lặp lại các kết quả và thêm một điểm đánh dấu cho từng kết quả, điều chỉnh ranh giới bản đồ dựa trên vị trí của các điểm đánh dấu. Vì phương thức searchByText() sử dụng toán tử await nên bạn chỉ có thể dùng phương thức này bên trong hàm 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");
  }
}

Phương thức searchByText() hỗ trợ nhiều lựa chọn yêu cầu hơn so với phiên bản trước, bao gồm:

  • includedType cho phép bạn giới hạn phạm vi tìm kiếm ở một loại địa điểm cụ thể.
  • isOpenNow cho phép bạn hạn chế tìm kiếm để chỉ trả về những địa điểm đang mở cửa.
  • minRating cho phép bạn lọc ra những kết quả dưới hạn mức đã chỉ định (ví dụ: chỉ trả về những địa điểm có từ 3 sao trở lên).
  • locationRestriction để bỏ qua kết quả bên ngoài vị trí đã chỉ định (locationBias cũng được hỗ trợ).

Tìm hiểu thêm