Библиотека Places

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

Обзор

Функции библиотеки Places Library и API Maps JavaScript позволяют вашему приложению искать места (определяемые в этом API как заведения, географические местоположения или известные достопримечательности), расположенные в пределах определенной области, например, границ карты, или вокруг фиксированной точки.

API Places предлагает функцию автозаполнения, которую можно использовать для придания вашим приложениям поведения поиска с автозаполнением, как в поле поиска Google Maps. Когда пользователь начинает вводить адрес, автозаполнение автоматически заполнит оставшуюся часть текста. Для получения дополнительной информации см. документацию по автозаполнению .

Начиная

Если вы не знакомы с API карт для JavaScript или с самим JavaScript, мы рекомендуем перед началом работы ознакомиться с материалами по JavaScript и получению ключа API .

Загрузите библиотеку

Сервис Places представляет собой автономную библиотеку, отдельную от основного кода JavaScript API Maps. Для использования функциональности этой библиотеки необходимо сначала загрузить её, используя параметр libraries в URL-адресе начальной загрузки API Maps:

<script async
    src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&loading=async&libraries=places&callback=initMap">
</script>

Дополнительную информацию см. в разделе «Обзор библиотек» .

Добавьте Places API в список ограничений API, указанных в ключе API.

Применение ограничений API к вашим ключам ограничивает использование ключа API одним или несколькими API или SDK. Запросы к API или SDK, связанным с ключом API, будут обрабатываться. Запросы к API или SDK, не связанным с ключом API, будут завершаться ошибкой. Чтобы ограничить использование ключа API для работы с библиотекой Places Library и Maps JavaScript API:
  1. Перейдите в консоль Google Cloud .
  2. Щелкните раскрывающийся список проектов и выберите проект, содержащий ключ API, который вы хотите защитить.
  3. Нажмите кнопку меню и выберите Google Maps Platform > Credentials .
  4. На странице «Учетные данные» щелкните имя ключа API, который вы хотите защитить.
  5. На странице «Ограничение и переименование ключа API» установите ограничения:
    • ограничения API
      • Выберите «Ограничить ключ» .
      • Нажмите «Выбрать API» и выберите как Maps JavaScript API , так и Places API .
        (Если какой-либо из API не указан в списке, его необходимо включить .)
  6. Нажмите СОХРАНИТЬ .

Ограничения и правила использования

Квоты

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

Политики

Использование библиотеки Places Library и JavaScript API карт должно осуществляться в соответствии с правилами, описанными для Places API .

Поиск мест

С помощью сервиса «Места» вы можете выполнять следующие виды поиска:

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

Запросы на поиск места

Запрос «Найти место» позволяет искать место по текстовому запросу или по номеру телефона. Существует два типа запросов «Найти место»:

Найти место по запросу

Функция Find Place from Query принимает текстовый ввод и возвращает местоположение. В качестве ввода могут использоваться любые данные о местах, например, название компании или адрес. Для выполнения запроса Find Place from Query вызовите метод findPlaceFromQuery() класса PlacesService , который принимает следующие параметры:

  • query (обязательно) Текстовая строка, по которой будет производиться поиск, например: "ресторан" или "123 Main Street". Это должно быть название места, адрес или категория заведений. Любые другие типы ввода могут привести к ошибкам и не гарантируют возврата корректных результатов. API Places вернет подходящие варианты на основе этой строки и упорядочит результаты в зависимости от их предполагаемой релевантности.
  • fields (обязательно) Одно или несколько полей, указывающих типы данных о местах, которые необходимо вернуть.
  • locationBias (необязательно) Координаты, определяющие область поиска. Это может быть одно из следующих значений:
    • Набор координат широты и долготы, заданных в виде объекта LatLngLiteral или объекта LatLng.
    • Прямоугольные границы (две пары широта/долгота или объект LatLngBounds )
    • Радиус (в метрах) с центром в координатах широты и долготы.

Также необходимо передать метод обратного вызова в findPlaceFromQuery() для обработки объекта результатов и ответа google.maps.places.PlacesServiceStatus .

В следующем примере показан вызов функции findPlaceFromQuery() , выполняющий поиск по запросу "Музей современного искусства Австралии" и включающий поля name и geometry .

var map;
var service;
var infowindow;

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

  infowindow = new google.maps.InfoWindow();

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

  var request = {
    query: 'Museum of Contemporary Art Australia',
    fields: ['name', 'geometry'],
  };

  var service = new google.maps.places.PlacesService(map);

  service.findPlaceFromQuery(request, function(results, status) {
    if (status === google.maps.places.PlacesServiceStatus.OK) {
      for (var i = 0; i < results.length; i++) {
        createMarker(results[i]);
      }
      map.setCenter(results[0].geometry.location);
    }
  });
}
Посмотреть пример

Найти место по номеру телефона

Функция Find Place from Phone Number принимает номер телефона и возвращает местоположение. Для выполнения запроса Find Place from Phone Number вызовите метод findPlaceFromPhoneNumber() класса PlacesService , который принимает следующие параметры:

  • phoneNumber (обязательно) Номер телефона в формате E.164 .
  • fields (обязательно) Одно или несколько полей, указывающих типы данных о местах, которые необходимо вернуть.
  • locationBias (необязательно) Координаты, определяющие область поиска. Это может быть одно из следующих значений:
    • Набор координат широты и долготы, заданных в виде объекта LatLngLiteral или объекта LatLng.
    • Прямоугольные границы (четыре точки широты/долготы или объект LatLngBounds )
    • Радиус (в метрах) с центром в координатах широты и долготы.

Также необходимо передать метод обратного вызова в функцию findPlaceFromPhoneNumber() для обработки объекта результатов и ответа google.maps.places.PlacesServiceStatus .

Поля (методы поиска мест)

Используйте параметр fields для указания массива типов данных о местах, которые необходимо вернуть. Например: fields: ['formatted_address', 'opening_hours', 'geometry'] . Используйте точку при указании составных значений. Например: opening_hours.weekday_text .

Поля соответствуют результатам поиска мест и разделены на три категории оплаты: Базовые, Контактные и Атмосфера. Базовые поля оплачиваются по базовой ставке и не влекут за собой дополнительных расходов. Поля Контактные и Атмосфера оплачиваются по более высокой ставке. Дополнительную информацию см. в прайс-листе . Атрибуции ( html_attributions ) всегда возвращаются при каждом вызове, независимо от того, запрашивалось ли поле ранее.

Базовый

В категорию «Основные» входят следующие поля:
business_status , formatted_address , geometry , icon , icon_mask_base_uri , icon_background_color , name , permanently_closed ( deprecated ), photos , place_id , plus_code , types

Контакт

Категория «Контакты» включает следующее поле: opening_hours
( Устарело в библиотеке Places, API JavaScript для карт. Используйте запрос Place Details, чтобы получить результаты opening_hours ).

Атмосфера

Категория «Атмосфера» включает следующие поля: price_level , rating , user_ratings_total

Методы findPlaceFromQuery() и findPlaceFromPhoneNumber() принимают один и тот же набор полей и могут возвращать одни и те же поля в своих соответствующих ответах.

Задайте смещение в сторону местоположения (методы Find Place)

Используйте параметр locationBias , чтобы функция поиска мест отдавала предпочтение результатам в определенной области. locationBias можно задать следующими способами:

Результаты, полученные с предвзятостью в отношении конкретной области:

locationBias: {lat: 37.402105, lng: -122.081974}

Определите прямоугольную область для поиска:

locationBias: {north: 37.41, south: 37.40, east: -122.08, west: -122.09}

Также можно использовать LatLngBounds .

Укажите радиус поиска (в метрах) с центром в определенной области:

locationBias: {radius: 100, center: {lat: 37.402105, lng: -122.081974}}

Поиск запросов поблизости

Функция «Поиск поблизости» позволяет искать места в указанной области по ключевому слову или типу. Поиск поблизости всегда должен включать местоположение, которое можно указать одним из двух способов:

  • a LatLngBounds .
  • Круглая область, определяемая как комбинация свойства location (указывающего центр круга в виде объекта LatLng ) и радиуса, измеряемого в метрах.

Поиск ближайших мест инициируется вызовом метода nearbySearch() класса PlacesService , который возвращает массив объектов PlaceResult . Обратите внимание, что начиная с версии 3.9 метод nearbySearch() заменяет метод search() .

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

Этот метод принимает запрос со следующими полями:

  • Один из следующих вариантов:
    • bounds области поиска должны представлять собой объект google.maps.LatLngBounds , определяющий прямоугольную область поиска. Максимально допустимое диагональное расстояние для этой области составляет приблизительно 100 000 метров.
    • location и radius ; первое принимает объект google.maps.LatLng , а второе — простое целое число, представляющее радиус круга в метрах. Максимально допустимый радиус — 50 000 метров. Обратите внимание, что если rankBy установлен на DISTANCE, необходимо указать location но нельзя указать radius или bounds .
  • keyword ( необязательно ) — термин, который будет сопоставляться со всеми доступными полями, включая, помимо прочего, имя, тип и адрес, а также отзывы клиентов и другой контент третьих лиц.
  • minPriceLevel и maxPriceLevel ( необязательно ) — ограничивают результаты только теми местами, которые находятся в указанном диапазоне. Допустимые значения находятся в диапазоне от 0 (самый доступный) до 4 (самый дорогой) включительно.
  • Устаревшее name . Эквивалентно keyword . Значения в этом поле объединяются со значениями в поле keyword и передаются как часть одной и той же поисковой строки.
  • openNow ( необязательно ) — логическое значение, указывающее, что служба Places должна возвращать только те места, которые открыты на момент отправки запроса. Места, не указавшие часы работы в базе данных Google Places, не будут возвращены, если вы включите этот параметр в свой запрос. Установка openNow в false не даст никакого эффекта.
  • rankBy ( необязательно ) — Задает порядок отображения результатов. Возможные значения:
    • google.maps.places.RankBy.PROMINENCE (по умолчанию). Этот параметр сортирует результаты по их важности. При ранжировании предпочтение будет отдаваться известным местам в пределах заданного радиуса по сравнению с близлежащими местами, которые соответствуют заданному радиусу, но менее известны. На известность могут влиять рейтинг места в индексе Google, его глобальная популярность и другие факторы. При указании параметра google.maps.places.RankBy.PROMINENCE параметр radius является обязательным.
    • google.maps.places.RankBy.DISTANCE . Эта опция сортирует результаты в порядке возрастания по расстоянию от указанного location (обязательно). Обратите внимание, что вы не можете указать пользовательские bounds и/или radius если указываете RankBy.DISTANCE . При указании RankBy.DISTANCE требуется один или несколько параметров: keyword , name или type .
  • type — Ограничивает результаты местами, соответствующими указанному типу. Можно указать только один тип (если указано более одного типа, все типы, следующие за первым, игнорируются). См. список поддерживаемых типов .

Также необходимо передать метод обратного вызова в nearbySearch() для обработки объекта результатов и ответа google.maps.places.PlacesServiceStatus .

var map;
var service;
var infowindow;

function initialize() {
  var pyrmont = new google.maps.LatLng(-33.8665433, 151.1956316);

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

  var request = {
    location: pyrmont,
    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]);
    }
  }
}

Посмотреть пример

Запросы на поиск текста

Сервис текстового поиска Google Places — это веб-сервис, который возвращает информацию о наборе мест на основе строки — например, «пицца в Нью-Йорке» или «обувные магазины рядом с Оттавой». Сервис отвечает списком мест, соответствующих текстовой строке, с учетом любых заданных параметров местоположения. В ответ на поиск будет включен список мест. Вы можете отправить запрос на получение подробной информации о любом из мест в ответе.

Поиск текста инициируется вызовом метода textSearch() класса PlacesService .

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

Этот метод принимает запрос со следующими полями:

  • query ( обязательно ) Текстовая строка, по которой будет производиться поиск, например: "restaurant" или "123 Main Street". Это должно быть название места, адрес или категория заведений. Любые другие типы ввода могут привести к ошибкам и не гарантируют возврата корректных результатов. Сервис Places вернет подходящие варианты на основе этой строки и упорядочит результаты в зависимости от их предполагаемой релевантности. Этот параметр становится необязательным, если в поисковом запросе также используется параметр type .
  • При желании:
    • openNow — логическое значение, указывающее, что служба Places должна возвращать только те места, которые открыты на момент отправки запроса. Места, не указавшие часы работы в базе данных Google Places, не будут возвращены, если вы включите этот параметр в свой запрос. Установка openNow в false не даст никакого эффекта.
    • minPriceLevel и maxPriceLevel — ограничивают результаты только теми местами, которые находятся в пределах указанного ценового уровня. Допустимые значения находятся в диапазоне от 0 (самый доступный) до 4 (самый дорогой) включительно.
    • Один из следующих вариантов:
      • bounds области поиска должны представлять собой объект google.maps.LatLngBounds , определяющий прямоугольную область поиска. Максимально допустимое диагональное расстояние для этой области составляет приблизительно 100 000 метров.
      • location и radius — Вы можете сместить результаты в сторону указанного круга, передав параметры location и radius . Это укажет службе Places отдавать предпочтение отображению результатов внутри этого круга. Результаты за пределами определенной области также могут отображаться. В качестве параметра местоположения принимается объект google.maps.LatLng , а в качестве параметра радиуса — простое целое число, представляющее радиус круга в метрах. Максимально допустимый радиус составляет 50 000 метров.
    • type — Ограничивает результаты местами, соответствующими указанному типу. Можно указать только один тип (если указано более одного типа, все типы, следующие за первым, игнорируются). См. список поддерживаемых типов .

Также необходимо передать метод обратного вызова в textSearch() для обработки объекта результатов и ответа google.maps.places.PlacesServiceStatus .

var map;
var service;
var infowindow;

function initialize() {
  var pyrmont = new google.maps.LatLng(-33.8665433,151.1956316);

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

  var request = {
    location: pyrmont,
    radius: 500,
    query: 'restaurant'
  };

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

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

Результаты поиска

Коды состояния

Объект ответа PlacesServiceStatus содержит статус запроса и может содержать отладочную информацию, которая поможет вам выяснить причину сбоя запроса на определение места. Возможные значения статуса:

  • INVALID_REQUEST : Этот запрос недействителен.
  • OK : Ответ содержит корректный результат.
  • OVER_QUERY_LIMIT : Веб-страница превысила свою квоту запросов.
  • REQUEST_DENIED : Веб-странице запрещено использовать PlacesService.
  • UNKNOWN_ERROR : Запрос к PlacesService не удалось обработать из-за ошибки сервера. Возможно, запрос будет выполнен успешно, если вы повторите попытку.
  • ZERO_RESULTS : Результат по данному запросу не найден.

Результаты поиска мест

Функции findPlace() , nearbySearch() и textSearch() возвращают массив объектов PlaceResult .

Каждый объект PlaceResult может содержать следующие свойства:

  • business_status указывает на операционный статус места, если это коммерческое предприятие. Он может содержать одно из следующих значений:
    • OPERATIONAL
    • CLOSED_TEMPORARILY
    • CLOSED_PERMANENTLY
    Если данные отсутствуют, business_status не возвращается.
  • formatted_address — это строка, содержащая удобочитаемый адрес данного места. Свойство formatted_address возвращается только при текстовом поиске .

    Часто этот адрес совпадает с почтовым адресом. Следует отметить, что в некоторых странах, например, в Великобритании, распространение настоящих почтовых адресов запрещено из-за ограничений, связанных с лицензированием.

    Отформатированный адрес логически состоит из одного или нескольких компонентов . Например, адрес «111 8th Avenue, New York, NY» состоит из следующих компонентов: «111» (номер дома), «8th Avenue» (маршрут), «New York» (город) и «NY» (штат США).

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

  • geometry : Информация о геометрических параметрах места. Сюда входят:
    • location определяет широту и долготу данного места.
    • viewport определяет предпочтительную область просмотра на карте при отображении этого места.
  • permanently_closed ( устарело ) — это логический флаг, указывающий, закрыто ли заведение навсегда или временно (значение true ). Не используйте permanently_closed . Вместо этого используйте business_status для получения информации о рабочем статусе предприятий.
  • plus_code (см. Open Location Code и plus codes ) — это закодированный идентификатор местоположения, полученный из координат широты и долготы, который представляет собой область размером 1/8000 градуса на 1/8000 градуса (примерно 14 м x 14 м на экваторе) или меньше. Plus-коды могут использоваться в качестве замены адресов улиц в местах, где они отсутствуют (где здания не нумеруются или улицы не имеют названий).

    Код «плюс» имеет формат глобального кода и составного кода:

    • global_code — это 4-символьный код города и 6-символьный или более длинный местный код (849VCWC8+R9).
    • compound_code — это локальный код длиной не менее 6 символов с указанием местоположения (CWC8+R9, Маунтин-Вью, Калифорния, США). Не следует программно обрабатывать это содержимое.
    Как правило, возвращаются как глобальный, так и составной код. Однако, если результат находится в удаленном месте (например, в океане или пустыне), может быть возвращен только глобальный код.
  • html_attributions : Массив атрибутов, которые следует отображать при показе результатов поиска. Каждая запись в массиве содержит HTML-текст для одного атрибута. Примечание: Это агрегированный массив всех атрибутов для всего ответа поиска. Поэтому все объекты PlaceResult в ответе содержат идентичные списки атрибутов.
  • icon возвращает URL-адрес цветного PNG-иконки размером 71x71 пиксель.
  • icon_mask_base_uri возвращает базовый URL-адрес для нецветного значка за вычетом расширения .svg или .png.
  • icon_background_color возвращает стандартный HEX-код цвета для категории места.
  • name : Название места.
  • opening_hours может содержать следующую информацию:
    • open_now — это логическое значение, указывающее, открыто ли место в текущее время ( устарело в библиотеке Places, Maps JavaScript API, используйте вместо него utc_offset_minutes ).
  • place_id — это текстовый идентификатор, который однозначно определяет место. Чтобы получить информацию о месте, передайте этот идентификатор в запросе Place Details . Узнайте больше о том, как ссылаться на место с помощью идентификатора места .
  • rating содержит оценку места от 0,0 до 5,0, основанную на обобщенных отзывах пользователей.
  • types Массив типов для этого места (например, ["political", "locality"] или ["restaurant", "lodging"] ). Этот массив может содержать несколько значений или быть пустым. Новые значения могут быть введены без предварительного уведомления. См. список поддерживаемых типов .
  • vicinity : Упрощенный адрес места, включающий название улицы, номер дома и населенный пункт, но без указания провинции/штата, почтового индекса или страны. Например, офис Google в Сиднее, Австралия, имеет значение « vicinity » 5/48 Pirrama Road, Pyrmont .

Доступ к дополнительным результатам

По умолчанию каждый поиск по местоположению возвращает до 20 результатов за запрос. Однако каждый поиск может возвращать до 60 результатов, распределенных по трем страницам. Дополнительные страницы доступны с помощью объекта PlaceSearchPagination . Для доступа к дополнительным страницам необходимо получить объект PlaceSearchPagination с помощью функции обратного вызова. Объект PlaceSearchPagination определяется следующим образом:

  • hasNextPage логическое свойство, указывающее, доступны ли дополнительные результаты. true если доступна дополнительная страница с результатами.
  • Функция nextPage() возвращает следующий набор результатов. После выполнения поиска необходимо подождать две секунды, прежде чем станет доступна следующая страница результатов.

Чтобы увидеть следующий набор результатов, вызовите функцию nextPage . Каждая страница результатов должна быть отображена до отображения следующей страницы результатов. Обратите внимание, что каждый поиск считается отдельным запросом в рамках ваших лимитов использования.

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

Машинопись

// This example requires the Places library. Include the libraries=places
// parameter when you first load the API. For example:
// <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places">

function initMap(): void {
  // Create the map.
  const pyrmont = { lat: -33.866, lng: 151.196 };
  const map = new google.maps.Map(
    document.getElementById("map") as HTMLElement,
    {
      center: pyrmont,
      zoom: 17,
      mapId: "8d193001f940fde3",
    } as google.maps.MapOptions
  );

  // Create the places service.
  const service = new google.maps.places.PlacesService(map);
  let getNextPage: () => void | false;
  const moreButton = document.getElementById("more") as HTMLButtonElement;

  moreButton.onclick = function () {
    moreButton.disabled = true;

    if (getNextPage) {
      getNextPage();
    }
  };

  // Perform a nearby search.
  service.nearbySearch(
    { location: pyrmont, radius: 500, type: "store" },
    (
      results: google.maps.places.PlaceResult[] | null,
      status: google.maps.places.PlacesServiceStatus,
      pagination: google.maps.places.PlaceSearchPagination | null
    ) => {
      if (status !== "OK" || !results) return;

      addPlaces(results, map);
      moreButton.disabled = !pagination || !pagination.hasNextPage;

      if (pagination && pagination.hasNextPage) {
        getNextPage = () => {
          // Note: nextPage will call the same handler function as the initial call
          pagination.nextPage();
        };
      }
    }
  );
}

function addPlaces(
  places: google.maps.places.PlaceResult[],
  map: google.maps.Map
) {
  const placesList = document.getElementById("places") as HTMLElement;

  for (const place of places) {
    if (place.geometry && place.geometry.location) {
      const image = {
        url: place.icon!,
        size: new google.maps.Size(71, 71),
        origin: new google.maps.Point(0, 0),
        anchor: new google.maps.Point(17, 34),
        scaledSize: new google.maps.Size(25, 25),
      };

      new google.maps.Marker({
        map,
        icon: image,
        title: place.name!,
        position: place.geometry.location,
      });

      const li = document.createElement("li");

      li.textContent = place.name!;
      placesList.appendChild(li);

      li.addEventListener("click", () => {
        map.setCenter(place.geometry!.location!);
      });
    }
  }
}

declare global {
  interface Window {
    initMap: () => void;
  }
}
window.initMap = initMap;

JavaScript

// This example requires the Places library. Include the libraries=places
// parameter when you first load the API. For example:
// <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places">
function initMap() {
  // Create the map.
  const pyrmont = { lat: -33.866, lng: 151.196 };
  const map = new google.maps.Map(document.getElementById("map"), {
    center: pyrmont,
    zoom: 17,
    mapId: "8d193001f940fde3",
  });
  // Create the places service.
  const service = new google.maps.places.PlacesService(map);
  let getNextPage;
  const moreButton = document.getElementById("more");

  moreButton.onclick = function () {
    moreButton.disabled = true;
    if (getNextPage) {
      getNextPage();
    }
  };

  // Perform a nearby search.
  service.nearbySearch(
    { location: pyrmont, radius: 500, type: "store" },
    (results, status, pagination) => {
      if (status !== "OK" || !results) return;

      addPlaces(results, map);
      moreButton.disabled = !pagination || !pagination.hasNextPage;
      if (pagination && pagination.hasNextPage) {
        getNextPage = () => {
          // Note: nextPage will call the same handler function as the initial call
          pagination.nextPage();
        };
      }
    },
  );
}

function addPlaces(places, map) {
  const placesList = document.getElementById("places");

  for (const place of places) {
    if (place.geometry && place.geometry.location) {
      const image = {
        url: place.icon,
        size: new google.maps.Size(71, 71),
        origin: new google.maps.Point(0, 0),
        anchor: new google.maps.Point(17, 34),
        scaledSize: new google.maps.Size(25, 25),
      };

      new google.maps.Marker({
        map,
        icon: image,
        title: place.name,
        position: place.geometry.location,
      });

      const li = document.createElement("li");

      li.textContent = place.name;
      placesList.appendChild(li);
      li.addEventListener("click", () => {
        map.setCenter(place.geometry.location);
      });
    }
  }
}

window.initMap = initMap;
Посмотреть пример

Попробуйте образец

Подробная информация о месте

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

Запросы на предоставление подробной информации о месте

Запрос сведений о месте размещения осуществляется путем вызова метода getDetails() сервиса.

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

Этот метод принимает запрос, содержащий placeId места, и поля, указывающие, какие типы данных о местах следует вернуть. Узнайте больше о том, как ссылаться на место по placeId .

Также требуется метод обратного вызова, который должен обрабатывать код состояния, переданный в ответе google.maps.places.PlacesServiceStatus , а также объект google.maps.places.PlaceResult .

var request = {
  placeId: 'ChIJN1t_tDeuEmsRUsoyG83frY4',
  fields: ['name', 'rating', 'formatted_phone_number', 'geometry']
};

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

function callback(place, status) {
  if (status == google.maps.places.PlacesServiceStatus.OK) {
    createMarker(place);
  }
}

Посмотреть пример

Поля (подробная информация о месте)

Параметр fields принимает массив строк (названий полей).

Используйте параметр fields для указания массива типов данных о местах, которые необходимо вернуть. Например: fields: ['address_components', 'opening_hours', 'geometry'] . Используйте точку при указании составных значений. Например: opening_hours.weekday_text .

Поля соответствуют результатам поиска информации о месте и разделены на три категории оплаты: Базовые, Контактные и Атмосфера. Базовые поля оплачиваются по базовой ставке и не влекут за собой дополнительных расходов. Поля Контактные и Атмосфера оплачиваются по более высокой ставке. Дополнительную информацию см. в прайс-листе . Атрибуции ( html_attributions ) всегда возвращаются при каждом вызове, независимо от того, был ли он запрошен.

Базовый

В категорию «Основные» входят следующие поля:
address_components , adr_address , business_status , formatted_address , geometry , icon , icon_mask_base_uri , icon_background_color , name , permanently_closed ( устарело ), photo , place_id , plus_code , type , url , utc_offset ( устарело в библиотеке Places, Maps JavaScript API), utc_offset_minutes , vicinity

Контакт

Категория «Контакты» включает следующие поля:
formatted_phone_number , international_phone_number , opening_hours , website

Атмосфера

Категория «Атмосфера» включает следующие поля: price_level , rating , reviews , user_ratings_total

Узнайте больше о полях мест . Для получения дополнительной информации о порядке выставления счетов за запросы данных мест см. раздел «Использование и выставление счетов» .

Подробные сведения об объекте Ответы

Коды состояния

Объект ответа PlacesServiceStatus содержит статус запроса и может содержать отладочную информацию, которая поможет вам выяснить причину сбоя запроса на получение сведений о месте. Возможные значения статуса:

  • INVALID_REQUEST : Этот запрос недействителен.
  • OK : Ответ содержит корректный результат.
  • OVER_QUERY_LIMIT : Веб-страница превысила свою квоту запросов.
  • NOT_FOUND Указанное местоположение не найдено в базе данных Places.
  • REQUEST_DENIED : Веб-странице запрещено использовать PlacesService.
  • UNKNOWN_ERROR : Запрос к PlacesService не удалось обработать из-за ошибки сервера. Возможно, запрос будет выполнен успешно, если вы повторите попытку.
  • ZERO_RESULTS : Результат по данному запросу не найден.

Результаты поиска по ключевым словам и деталям местоположения

Успешный вызов метода getDetails() возвращает объект PlaceResult со следующими свойствами:

  • address_components : Массив, содержащий отдельные компоненты, применимые к данному адресу.

    Каждый компонент адреса обычно содержит следующие поля:

    • массив types[] указывает тип компонента адреса. См. список поддерживаемых типов .
    • long_name — это полное текстовое описание или название компонента адреса, возвращаемое геокодером.
    • short_name — это сокращенное текстовое название компонента адреса, если таковое имеется. Например, компонент адреса для штата Аляска может иметь long_name как "Alaska" и short_name как "AK", используя двухбуквенное почтовое сокращение.

    Обратите внимание на следующие факты о массиве address_components[] :

    • Массив компонентов адреса может содержать больше компонентов, чем formatted_address .
    • Массив не обязательно включает все политические образования, содержащие адрес, за исключением тех, которые указаны в formatted_address . Чтобы получить все политические образования, содержащие конкретный адрес, следует использовать обратное геокодирование, передав широту/долготу адреса в качестве параметра запроса.
    • Формат ответа не гарантирует сохранения неизменности между запросами. В частности, количество address_components варьируется в зависимости от запрошенного адреса и может меняться со временем для одного и того же адреса. Компонент может изменить свою позицию в массиве. Тип компонента может измениться. Конкретный компонент может отсутствовать в последующем ответе.
  • business_status указывает на операционный статус места, если это коммерческое предприятие. Он может содержать одно из следующих значений:
    • OPERATIONAL
    • CLOSED_TEMPORARILY
    • CLOSED_PERMANENTLY
    Если данные отсутствуют, business_status не возвращается.
  • formatted_address : Удобочитаемый адрес этого места.

    Часто этот адрес совпадает с почтовым адресом. Следует отметить, что в некоторых странах, например, в Великобритании, распространение настоящих почтовых адресов запрещено из-за ограничений, связанных с лицензированием.

    Отформатированный адрес логически состоит из одного или нескольких компонентов . Например, адрес «111 8th Avenue, New York, NY» состоит из следующих компонентов: «111» (номер дома), «8th Avenue» (маршрут), «New York» (город) и «NY» (штат США).

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

  • formatted_phone_number : Номер телефона населенного пункта, отформатированный в соответствии с региональными правилами форматирования номеров .
  • geometry : Информация о геометрических параметрах места. Сюда входят:
    • location определяет широту и долготу данного места.
    • viewport определяет предпочтительную область просмотра на карте при отображении этого места.
  • permanently_closed ( устарело ) — это логический флаг, указывающий, закрыто ли заведение навсегда или временно (значение true ). Не используйте permanently_closed . Вместо этого используйте business_status для получения информации о рабочем статусе предприятий.
  • plus_code (см. Open Location Code и plus codes ) — это закодированный идентификатор местоположения, полученный из координат широты и долготы, который представляет собой область размером 1/8000 градуса на 1/8000 градуса (примерно 14 м x 14 м на экваторе) или меньше. Plus-коды могут использоваться в качестве замены адресов улиц в местах, где они отсутствуют (где здания не нумеруются или улицы не имеют названий).

    Код «плюс» имеет формат глобального кода и составного кода:

    • global_code — это 4-символьный код города и 6-символьный или более длинный местный код (849VCWC8+R9).
    • compound_code — это локальный код длиной не менее 6 символов с указанием местоположения (CWC8+R9, Маунтин-Вью, Калифорния, США). Не следует программно обрабатывать это содержимое.
    Как правило, возвращаются как глобальный, так и составной код. Однако, если результат находится в удаленном месте (например, в океане или пустыне), может быть возвращен только глобальный код.
  • html_attributions : Текст, указывающий на авторство, который будет отображаться для этого результата поиска.
  • icon : URL-адрес графического ресурса, который можно использовать для обозначения типа данного места.
  • international_phone_number содержит номер телефона офиса в международном формате. Международный формат включает код страны и предваряется знаком плюс (+). Например, international_phone_number офиса Google в Сиднее, Австралия, — +61 2 9374 4000 .
  • name : Название места.
  • utc_offset Устарело в библиотеке Places, Maps JavaScript API; используйте вместо него utc_offset_minutes .
  • utc_offset_minutes содержит количество минут, на которое текущий часовой пояс данного места смещен относительно UTC. Например, для Сиднея, Австралия, во время действия летнего времени это будет 660 (+11 часов от UTC), а для Калифорнии вне летнего времени — -480 (-8 часов от UTC).
  • opening_hours содержит следующую информацию:
    • open_now ( Устарело в библиотеке Places, Maps JavaScript API; используйте opening_hours.isOpen() вместо этого. Инструкции по использованию isOpen с данными о местах см. в видеоролике «Как получить часы работы в Places API» .) `open_now` — это логическое значение, указывающее, открыто ли место в текущее время.
    • массив periods[] содержит начальные периоды, охватывающие семь дней, начиная с воскресенья, в хронологическом порядке. Каждый период включает в себя:
      • open содержит пару объектов day и time, описывающих время открытия заведения:
        • day — число от 0 до 6, соответствующее дням недели, начиная с воскресенья. Например, 2 означает вторник.
        • time может указываться в 24-часовом формате hhmm (значения находятся в диапазоне 0000–2359). time будет отображаться в часовом поясе данного места.
      • close может содержать пару объектов `day` и `time`, описывающих время закрытия заведения. Примечание: если заведение всегда открыто , раздел close будет отсутствовать в ответе. Приложения могут полагаться на то, что всегда открытое заведение будет представлено как период open , содержащий day со значением 0 и time со значением 0000, и не будет close .
    • weekday_text — это массив из семи строк, представляющих отформатированные часы работы для каждого дня недели. Если в запросе Place Details был указан language параметр, служба Places Service отформатирует и локализует часы работы соответствующим образом для этого языка. Порядок элементов в этом массиве зависит от language параметра. В некоторых языках неделя начинается в понедельник, а в других — в воскресенье.
  • permanently_closed ( устарело ) — это логический флаг, указывающий, закрыто ли заведение навсегда или временно (значение true ). Не используйте permanently_closed . Вместо этого используйте business_status для получения информации о рабочем статусе предприятий.
  • photos[] : массив объектов PlacePhoto . Объект PlacePhoto можно использовать для получения фотографии с помощью метода getUrl() , или же вы можете проверить объект на наличие следующих значений:
    • height : максимальная высота изображения в пикселях.
    • width : максимальная ширина изображения в пикселях.
    • html_attributions : Текст, указывающий на авторство и отображаемый рядом с фотографией этого места.
  • place_id : Текстовый идентификатор, однозначно определяющий место и используемый для получения информации о месте с помощью запроса Place Details . Подробнее о том, как ссылаться на место с помощью идентификатора места , можно узнать здесь.
  • rating : Оценка места по шкале от 0,0 до 5,0, основанная на обобщенных отзывах пользователей.
  • Программа reviews до пяти отзывов. Каждый отзыв состоит из нескольких компонентов:
    • aspects[] содержит массив объектов PlaceAspectRating , каждый из которых предоставляет оценку одного атрибута заведения. Первый объект в массиве считается основным аспектом. Каждый PlaceAspectRating определяется следующим образом:
      • type название оцениваемого аспекта. Поддерживаются следующие типы: appeal , atmosphere , decor , facilities , food , overall , quality и service .
      • rating пользователем данного аспекта по шкале от 0 до 3.
    • author_name имя пользователя, оставившего отзыв. Анонимные отзывы приписываются «пользователю Google». Если был задан языковой параметр, то фраза «Пользователь Google» вернет локализованную строку.
    • author_url URL-адрес профиля пользователя в Google+, если он доступен.
    • language это код языка IETF, указывающий на язык, использованный в отзыве пользователя. Это поле содержит только основной языковой тег, а не дополнительный тег, указывающий страну или регион. Например, все отзывы на английском языке помечены тегом 'en', а не 'en-AU' или 'en-UK'.
    • rating , выставленная пользователем в целом о данном месте. Это целое число от 1 до 5.
    • text отзыв пользователя. При написании отзыва о месте в Google Places текстовые отзывы считаются необязательными; поэтому это поле может быть пустым.
  • types Массив типов для этого места (например, ["political", "locality"] или ["restaurant", "lodging"] ). Этот массив может содержать несколько значений или быть пустым. Новые значения могут быть введены без предварительного уведомления. См. список поддерживаемых типов .
  • url : URL официальной страницы Google для этого места. Это страница, принадлежащая Google, содержащая наиболее полную доступную информацию о данном месте. Приложения должны ссылаться на эту страницу или встраивать её на любой экран, отображающий пользователю подробные результаты поиска информации о данном месте.
  • vicinity : Упрощенный адрес места, включающий название улицы, номер дома и населенный пункт, но без провинции/штата, почтового индекса или страны. Например, для офиса Google в Сиднее, Австралия, значение vicinity равно 5/48 Pirrama Road, Pyrmont . Параметр « vicinity отображается только при поиске поблизости .
  • website указан авторитетный веб-сайт этого места, например, главная страница компании.

Note: Multidimensional ratings may not be available for all locations. If there are too few reviews then the details response will either include a legacy rating on a 0.0 to 5.0 scale (if available) or no rating at all.

Reference a Place with a Place ID

A place ID is a unique reference to a place on a Google Map. Place IDs are available for most locations, including businesses, landmarks, parks, and intersections.

To use a place ID in your app you must first look up the ID, which is available in PlaceResult of a Place Search or Details request. You can then use this place ID to look up Place Details .

Place IDs are exempt from the caching restrictions stated in Section 3.2.3(b) of the Google Maps Platform Terms of Service. You can therefore store place ID values for later use. For best practises when storing place IDs, see the place ID overview .

var map;

function initialize() {
  // Create a map centered in Pyrmont, Sydney (Australia).
  map = new google.maps.Map(document.getElementById('map'), {
    center: {lat: -33.8666, lng: 151.1958},
    zoom: 15
  });

  // Search for Google's office in Australia.
  var request = {
    location: map.getCenter(),
    radius: '500',
    query: 'Google Sydney'
  };

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

// Checks that the PlacesServiceStatus is OK, and adds a marker
// using the place ID and location from the PlacesService.
function callback(results, status) {
  if (status == google.maps.places.PlacesServiceStatus.OK) {
    var marker = new google.maps.Marker({
      map: map,
      place: {
        placeId: results[0].place_id,
        location: results[0].geometry.location
      }
    });
  }
}

google.maps.event.addDomListener(window, 'load', initialize);

Фотографии мест

Use the Place Photo feature to add high quality photographic content to your site. The Photo service gives you access to the millions of photos stored in the Places and Google+ Local database. When you get place information using a Place Details request, photo references will be returned for relevant photographic content. The Nearby Search and Text Search requests also return a single photo reference per place, when relevant. Using the Photo service you can then access the referenced photos and resize the image to the optimal size for your application.

An array of PlacePhoto objects will be returned as part of the PlaceResult object for any getDetails() , textSearch() or nearbySearch() request made against a PlacesService .

Note: The number of photos returned varies by request.

  • A Nearby Search or a Text Search will return at most one PlacePhoto object.
  • A Details request will return up to ten PlacePhoto objects.

You can request the URL for the associated image by calling the PlacePhoto.getUrl() method, and passing a valid PhotoOptions object. Use the PhotoOptions object to specify the maximum height and width of the image. If you specify a value for both maxHeight and a maxWidth , the photo service will resize the image to the smaller of the two sizes, while maintaining the original aspect ratio.

The following code snippet accepts a place object, and adds a marker to the map if a photo exists. The default marker image is replaced by a small version of the photo.

function createPhotoMarker(place) {
  var photos = place.photos;
  if (!photos) {
    return;
  }

  var marker = new google.maps.Marker({
    map: map,
    position: place.geometry.location,
    title: place.name,
    icon: photos[0].getUrl({maxWidth: 35, maxHeight: 35})
  });
}

Photos returned by the Photo service are sourced from a variety of locations, including business owners and user contributed photos. In most cases, these photos can be used without attribution, or will have the required attribution included as a part of the image. However, if the returned photo element includes a value in the html_attributions field, you must include the additional attribution in your application wherever you display the image.