Как перейти на новый инструмент "Поиск поблизости"

Разработчики из Европейской экономической зоны (ЕЭЗ)

На этой странице объясняются различия между поиском поблизости, реализованным в классе Place (новый) и PlacesService (устаревший), а также приведены фрагменты кода для сравнения.

  • У устаревшего объекта PlacesService есть метод nearbySearch(), который позволяет искать места в указанной области по ключевому слову или типу.
  • Класс Place содержит метод searchNearby(), который позволяет искать места в указанной области по типу места, используя расширенный выбор полей данных и типов мест для большей гибкости.

В таблице ниже перечислены основные различия в методах поиска поблизости между классами Place и PlacesService:

PlacesService (устаревшая версия) Place (новый)
nearbySearch()
searchNearby()
PlaceSearchRequest SearchNearbyRequest
Требуется использовать обратный вызов для обработки объекта результатов и ответа google.maps.places.PlacesServiceStatus. Использует объекты Promise и работает асинхронно.
Требуется проверка PlacesServiceStatus. Проверять статус не нужно, можно использовать стандартную обработку ошибок. Подробнее…
Поддерживается только учет местоположения. Поддерживает смещение и ограничение по местоположению.
Возвращает все доступные поля данных (подмножество поддерживаемых полей). Ограничить запрос определенными полями нельзя. Возвращает только запрошенные поля данных о месте. Класс Place предлагает расширенный и регулярно обновляемый набор полей.
Ограничено фиксированным набором типов мест. Получите доступ к расширенному и регулярно обновляемому списку типов мест.
Поддерживается текстовый поиск по ключевому слову. Текстовый поиск не поддерживается. Используйте Text Search (New).

Сравнение кода

В этом разделе сравниваются методы поиска поблизости, чтобы показать различия между сервисом Places и классом Place. В фрагментах кода показано, какой код требуется для каждого API, чтобы выполнить текстовый поисковый запрос.

Поиск поблизости (устаревшая версия)

С помощью устаревшего поиска поблизости можно находить места в указанной области по ключевому слову или по типу. Ограничить результаты поиска с помощью полей данных о местах нельзя, поэтому при каждом запросе возвращаются все доступные поля. В приведенном ниже фрагменте кода показан вызов функции nearbySearch() для получения информации о ресторанах в Сиднее (Австралия). Запрос синхронный, использует обратный вызов и включает обязательную условную проверку 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,
  });
}

Подробнее…

Поиск поблизости (новая версия)

Новая версия поиска поблизости имеет следующие преимущества:

  • Возможность указать, какие поля данных нужно вернуть.
  • Использование объектов Promise, которые позволяют выполнять асинхронные операции.
  • Проверять статус PlacesService не нужно. Вместо этого можно использовать стандартную обработку ошибок.

В приведенном ниже фрагменте кода показана функция, которая отправляет запрос на поиск ресторанов поблизости. В этом примере показано, как использовать параметр rankPreference для ранжирования результатов поиска по популярности (в предыдущей версии ранжирование задается с помощью параметра rankBy). Поскольку метод searchNearby() использует оператор await, его можно использовать только в функции 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");
  }
}

Подробнее…