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

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() nhận một truy vấn văn bản và trả về một kết quả địa điểm duy nhất, đồng thời hỗ trợ việc sử dụng các trường dữ liệu đị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 đị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() cũ hơn và không hỗ trợ việc sử dụng các trường dữ liệu vị trí.

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 lựa chọn mở rộng về các 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
Các lựa chọn truy vấn bị hạn chế. Nhiều tuỳ chọn truy vấn hơn.
Yêu cầu sử dụng 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 Lời hứa và hoạt động không đồng bộ.
Yêu cầu kiểm tra PlacesServiceStatus. Không cần kiểm tra trạng thái, có thể sử dụng tính năng xử lý lỗi chuẩn.
Chỉ hỗ trợ độ lệch vị trí. Hỗ trợ thiên vị vị trí và hạn chế vị trí.
Trường dữ liệu vị trí được định dạng bằng cách sử dụng kiểu viết thường. Trường dữ liệu vị trí được định dạng bằng cách sử dụng kiểu viết hoa camel.
Trả về một kết quả 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 các loại địa điểmtrườ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 đị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 hiện có (một tập hợp con của các trường được hỗ trợ); không thể bị ràng buộc vào 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 dịch vụ Địa điểm và lớp Địa điểm. Các đoạn mã cho thấy mã cần thiết trên từng API tương ứng để tạo yêu cầu tìm kiếm dựa trên văn bản.

Dịch vụ Địa điểm (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 bước kiểm tra có điều kiện trên PlacesServiceStatus. Các trường dữ liệu địa điểm cần thiết được chỉ định trong phần nội dung yêu cầu, được xác định trước khi thực hiện 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 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 không đồng bộ và không yêu cầu kiểm tra trạng thái (có thể sử dụng tính năng xử lý lỗi chuẩn). Trong ví dụ này, yêu cầu bao gồm một 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 mỗi kết quả, điều chỉnh giới hạn 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ể sử 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 tuỳ 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 hạn chế tìm kiếm ở một loại địa điểm cụ thể.
  • isOpenNow cho phép bạn hạn chế các lượt tìm kiếm chỉ trả về những địa điểm đang mở.
  • minRating cho phép bạn lọc ra những kết quả dưới giới hạn đã 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ả nằm ngoài vị trí được chỉ định (locationBias cũng được hỗ trợ).

Tìm hiểu thêm