Поиск мест

В поиске мест появилась новая версия функции текстового поиска, которая позволяет получать набор мест в ответ на ввод текстового запроса.

Новая версия текстового поиска возвращает информацию о местах на основе введенной фразы, например "кафе в Москве", "обувные магазины в Санкт-Петербурге" или "улица Центральная, 123". Ответ содержит список мест, соответствующих текстовой строке с учетом указанного предпочтительного местоположения. Новая версия текстового поиска позволяет искать места по типу, фильтровать их на основе различных критериев, например часов работы или рейтинга, и подбирать варианты, относящиеся только к определенному местоположению. Новая версия текстового поиска разрабатывалась с нуля и отличается улучшенной производительностью и качеством данных по сравнению с Places API.

Требования

Чтобы использовать новую версию текстового поиска, включите "Places API (новинка)" в проекте Google Cloud. Подробности – в статье Начало работы.

Главные особенности текстового поиска

Новая версия текстового поиска имеет следующие улучшения:

  • дополнительные фильтры поиска со множеством новых типов мест, а также возможностью фильтрации по минимальному рейтингу;
  • теперь поддерживаются маски полей;
  • в полях места теперь указываются рейтинг и отзывы.

Поиск мест по текстовому запросу

Вызовите метод searchByText, чтобы получить список мест на основе текстового запроса или номера телефона. Если запрос содержит номер телефона, параметр региона должен совпадать с регионом домена, с которого отправляется запрос. Например, если вы используете номер телефона для поиска места в Японии, а запрашивающий домен содержит jp, задайте для параметра region значение "jp". Если в запросе не указать параметр region, API по умолчанию будет использовать "us" (США).

В параметре fields задайте поля данных (в верблюжьем регистре, через запятую).

В примере ниже показан вызов searchByText для поиска мест по текстовому запросу.

TypeScript

let map;
let center;

async function initMap() {
    const { Map } = await google.maps.importLibrary("maps") as google.maps.MapsLibrary;

    center = {lat: 37.4161493, lng: -122.0812166};
    map = new Map(document.getElementById('map') as HTMLElement, {
        center: center,
        zoom: 14,
        // ...
    });

    findPlaces();
}

async function findPlaces() {
    const { Place } = await google.maps.importLibrary("places") as google.maps.PlacesLibrary;
    //@ts-ignore
    const { AdvancedMarkerElement } = await google.maps.importLibrary("marker") as google.maps.MarkerLibrary;
    const request = {
        textQuery: 'Tacos in Mountain View',
        fields: ['displayName', 'location', 'businessStatus'],
        includedType: 'restaurant',
        isOpenNow: true,
        language: 'en-US',
        maxResultCount: 7,
        minRating: 3.2,
        region: 'us',
        useStrictTypeFiltering: false,
    };

    //@ts-ignore
    const { places } = await Place.searchByText(request);

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

        const { LatLngBounds } = await google.maps.importLibrary("core") as google.maps.CoreLibrary;
        const bounds = new LatLngBounds();

        // Loop through and get all the results.
        places.forEach((place) => {
            const markerView = new AdvancedMarkerElement({
                map,
                position: place.location,
                title: place.displayName,
            });

            bounds.extend(place.location);
            console.log(place);
        });

        map.setCenter(bounds.getCenter());

    } else {
        console.log('No results');
    }
}

initMap();

JavaScript

let map;
let center;

async function initMap() {
  const { Map } = await google.maps.importLibrary("maps");

  center = { lat: 37.4161493, lng: -122.0812166 };
  map = new Map(document.getElementById("map"), {
    center: center,
    zoom: 14,
    // ...
  });
  findPlaces();
}

async function findPlaces() {
  const { Place } = await google.maps.importLibrary("places");
  //@ts-ignore
  const { AdvancedMarkerElement } = await google.maps.importLibrary("marker");
  const request = {
    textQuery: "Tacos in Mountain View",
    fields: ["displayName", "location", "businessStatus"],
    includedType: "restaurant",
    isOpenNow: true,
    language: "en-US",
    maxResultCount: 7,
    minRating: 3.2,
    region: "us",
    useStrictTypeFiltering: false,
  };
  //@ts-ignore
  const { places } = await Place.searchByText(request);

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

    const { LatLngBounds } = await google.maps.importLibrary("core");
    const bounds = new LatLngBounds();

    // Loop through and get all the results.
    places.forEach((place) => {
      const markerView = new AdvancedMarkerElement({
        map,
        position: place.location,
        title: place.displayName,
      });

      bounds.extend(place.location);
      console.log(place);
    });
    map.setCenter(bounds.getCenter());
  } else {
    console.log("No results");
  }
}

initMap();