Di chuyển sang Nearby Search mới

Trang này giải thích sự khác biệt giữa tính năng tìm kiếm địa điểm lân cận được sử dụng 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ó một phương thức nearbySearch(), cho phép bạn tìm kiếm các địa điểm trong một khu vực cụ thể theo từ khoá hoặc loại.
  • Lớp Place có phương thức searchNearby() cho phép bạn tìm kiếm các địa điểm trong một khu vực cụ thể theo loại địa điểm, sử dụng lựa chọn mở rộng về các trường dữ liệu địa điểm và loại địa điểm để linh hoạt hơ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 lân cận giữa lớp PlacePlacesService:

PlacesService (Cũ) Place (Mới)
nearbySearch()
searchNearby()
PlaceSearchRequest SearchNearbyRequest
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ả 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 về địa điểm đã yêu cầu; lớp Place cung cấp một lựa chọn mở rộng và thường xuyên được cập nhật về các trường.
Chỉ giới hạn ở một nhóm loại địa điểm cố định. Truy cập vào danh sách loại địa điểm mở rộng và được cập nhật thường xuyên.
Hỗ trợ tìm kiếm dựa trên văn bản bằng từ khoá. Tính năng tìm kiếm dựa trên văn bản không được hỗ trợ, hãy sử dụng tính năng Tìm kiếm bằng văn bản (Mới).

So sánh mã

Phần này so sánh mã cho các phương thức tìm kiếm lân cậ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.

Tìm kiếm lân cận (Cũ)

Tính năng Tìm kiếm lân cận cũ cho phép bạn tìm kiếm các địa điểm trong một khu vực cụ thể theo cụm từ tìm kiếm hoặc loại. Không có cách nào để hạn chế nội dung tìm kiếm bằng cách sử dụng các trường dữ liệu về địa điểm, vì vậy, tất cả các trường có sẵn sẽ được trả về cùng với mỗi yêu cầu. Đoạn mã sau đây cho thấy cách gọi nearbySearch() để trả về thông tin về các nhà hàng ở Sydney, Úc. Yêu cầu này là đồng bộ, sử dụng lệnh gọi lại và bao gồm một bước kiểm tra có điều kiện bắt buộc trên PlacesServiceStatus.

let map;
let service;

function initMap() {
  const sydney = new google.maps.LatLng(-33.867, 151.195);

  map = new google.maps.Map(document.getElementById("map"), {
    center: sydney,
    zoom: 15,
  });

  const request = {
    location: sydney,
    radius: '500',
    type: ['restaurant']
  };

  service = new google.maps.places.PlacesService(map);
  service.nearbySearch(request, callback);
}

function callback(results, status) {
  if (status == google.maps.places.PlacesServiceStatus.OK) {
    for (var i = 0; i < results.length; i++) {
      createMarker(results[i]);
    }
  }
}

// Helper function to create markers.
function createMarker(place) {
  if (!place.geometry || !place.geometry.location) return;

  const marker = new google.maps.Marker({
    map,
    position: place.geometry.location,
    title: place.name,
  });
}

Tìm hiểu thêm

Tìm kiếm lân cận (Mới)

Phiên bản mới của tính năng Tìm kiếm lân cận cải tiến so với phiên bản cũ theo các cách sau:

  • Khả năng chỉ định các trường dữ liệu địa điểm cần trả về.
  • Việc sử dụng Lời hứa cho phép hoạt động không đồng bộ.
  • Không cần kiểm tra trạng thái của PlacesService; bạn có thể sử dụng tính năng xử lý lỗi tiêu chuẩn.

Đoạn mã sau đây cho thấy một hàm tạo yêu cầu Tìm kiếm lân cận cho nhà hàng. Ví dụ này cho thấy cách sử dụng tuỳ chọn rankPreference để xếp hạng kết quả tìm kiếm theo mức độ phổ biến (trong phiên bản trước, thứ hạng được chỉ định bằng tuỳ chọn rankBy). Vì phương thức searchNearby() 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 nearbySearch() {
  // Restrict within the map viewport.
  let center = new google.maps.LatLng(52.369358, 4.889258);
  const request = {
    // Required parameters.
    fields: ["displayName", "location", "businessStatus"],
    locationRestriction: {
      center: center,
      radius: 500,
    },
    // Optional parameters.
    includedPrimaryTypes: ["restaurant"],
    maxResultCount: 5,
    rankPreference: google.maps.places.SearchNearbyRankPreference.POPULARITY,
    language: "en-US",
    region: "us",
  };

  const { places } = await google.maps.places.Place.searchNearby(request);

  if (places.length) {
    console.log(places);

    // Create a new bounds, which will be extended with each result.
    const bounds = new google.maps.LatLngBounds();

    // Loop through and get all the results.
    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");
  }
}

Tìm hiểu thêm