Библиотека Places

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

Обзор

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

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

Начиная

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

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

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

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

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

Добавить API Places в список ограничений API ключа API

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

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

Квоты

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

Политики

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

Поиск места

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

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

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

Запрос Find Place позволяет вам искать место либо по текстовому запросу, либо по номеру телефона. Существует два типа запроса Find Place:

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

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

  • 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, вызовите метод PlacesService findPlaceFromPhoneNumber() , который принимает следующие параметры:

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

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

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

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

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

Базовый

Базовая категория включает в себя следующие поля:
business_status , formatted_address , geometry , icon , icon_mask_base_uri , icon_background_color , name , permanently_closed ( устарело ), photos , place_id , plus_code , types

Контакт

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

Атмосфера

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

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

Установить смещение местоположения (методы поиска места)

Используйте параметр locationBias , чтобы Find Place отдавал предпочтение результатам в определенной области. Вы можете задать 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}}

Запросы на поиск поблизости

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

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

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

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 — это веб-служба, которая возвращает информацию о наборе мест на основе строки, например, «пицца в Нью-Йорке» или «обувные магазины около Оттавы». Служба отвечает списком мест, соответствующих текстовой строке и любым заданным смещениям местоположения. Ответ на поиск будет включать список мест. Вы можете отправить запрос Place Details для получения дополнительной информации о любом месте в ответе.

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

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

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

  • query ( обязательно ) Текстовая строка, по которой выполняется поиск, например: "ресторан" или "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 ( deprecated ) — это логический флаг, указывающий, закрыто ли место навсегда или временно (значение true ). Не используйте permanently_closed . Вместо этого используйте business_status для получения рабочего статуса предприятий.
  • plus_code (см. Открытый код местоположения и plus-коды ) — это закодированная ссылка на местоположение, полученная из координат широты и долготы, которая представляет собой область: 1/8000 градуса на 1/8000 градуса (примерно 14 м x 14 м на экваторе) или меньше. Plus-коды могут использоваться в качестве замены уличных адресов в местах, где их нет (где здания не пронумерованы или улицы не имеют названий).

    Плюс-код форматируется как глобальный код и составной код:

    • global_code — это 4-значный код города и 6-значный или более длинный местный код (849VCWC8+R9).
    • compound_code — это локальный код длиной 6 символов или длиннее с явным местоположением (CWC8+R9, Mountain View, CA, USA). Не анализируйте это содержимое программно.
    Обычно возвращаются как глобальный код, так и составной код. Однако, если результат находится в удаленном месте (например, океан или пустыня), может быть возвращен только глобальный код.
  • html_attributions : Массив атрибутов, которые следует отображать при отображении результатов поиска. Каждая запись в массиве содержит HTML-текст для одного атрибута. Примечание: это агрегация всех атрибутов для всего ответа поиска. Поэтому все объекты PlaceResult в ответе содержат идентичные списки атрибутов.
  • icon возвращает URL-адрес цветного значка PNG размером 71 x 71 пиксель.
  • icon_mask_base_uri возвращает базовый URL для бесцветного значка без расширения .svg или .png.
  • icon_background_color возвращает шестнадцатеричный код цвета по умолчанию для категории места.
  • 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 места и поля, указывающие, какие типы данных Places возвращать. Узнайте больше о том, как ссылаться на место с помощью place ID .

Он также принимает метод обратного вызова, который должен обрабатывать код состояния, переданный в ответе 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 .

Поля соответствуют результатам Place Details и делятся на три категории выставления счетов: Basic, Contact и Atmosphere. Базовые поля оплачиваются по базовой ставке и не влекут за собой дополнительных расходов. Поля Contact и Atmosphere оплачиваются по более высокой ставке. Для получения дополнительной информации см. прейскурант . Атрибуции ( 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 содержит статус запроса и может содержать отладочную информацию, которая поможет вам отследить, почему запрос Place Details не удался. Возможные значения статуса:

  • INVALID_REQUEST : Этот запрос недействителен.
  • OK : Ответ содержит допустимый результат.
  • OVER_QUERY_LIMIT : веб-страница превысила квоту запросов.
  • NOT_FOUND Указанное местоположение не найдено в базе данных мест.
  • 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 ( deprecated ) — это логический флаг, указывающий, закрыто ли место навсегда или временно (значение true ). Не используйте permanently_closed . Вместо этого используйте business_status для получения рабочего статуса предприятий.
  • plus_code (см. Открытый код местоположения и plus-коды ) — это закодированная ссылка на местоположение, полученная из координат широты и долготы, которая представляет собой область: 1/8000 градуса на 1/8000 градуса (примерно 14 м x 14 м на экваторе) или меньше. Plus-коды могут использоваться в качестве замены уличных адресов в местах, где их нет (где здания не пронумерованы или улицы не имеют названий).

    Плюс-код форматируется как глобальный код и составной код:

    • global_code — это 4-значный код города и 6-значный или более длинный местный код (849VCWC8+R9).
    • compound_code — это локальный код длиной 6 символов или длиннее с явным местоположением (CWC8+R9, Mountain View, CA, USA). Не анализируйте это содержимое программно.
    Обычно возвращаются как глобальный код, так и составной код. Однако, если результат находится в удаленном месте (например, океан или пустыня), может быть возвращен только глобальный код.
  • 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, API JavaScript Карт; вместо этого используйте opening_hours.isOpen() . О том, как использовать isOpen с подробностями о месте, см . видео «Как получить часы работы в API Places» .) `open_now` — это логическое значение, указывающее, открыто ли место в текущий момент.
    • periods[] — это массив периодов открытия, охватывающих семь дней, начиная с воскресенья, в хронологическом порядке. Каждый период содержит:
      • open содержит пару объектов «день и время», описывающих, когда открывается место:
        • day число от 0 до 6, соответствующее дням недели, начиная с воскресенья. Например, 2 означает вторник.
        • time может содержать время суток в 24-часовом формате hhmm (значения находятся в диапазоне 0000–2359). time будет указано в часовом поясе места.
      • close может содержать пару объектов день и время, описывающих, когда место закрывается. Примечание: если место всегда открыто , раздел close будет отсутствовать в ответе. Приложения могут полагаться на always-open, представленный как open период, содержащий day со значением 0 и time со значением 0000, и без close .
    • weekday_text — это массив из семи строк, представляющих отформатированные часы работы для каждого дня недели. Если в запросе Place Details был указан параметр language , служба Places отформатирует и локализует часы работы соответствующим образом для этого языка. Порядок элементов в этом массиве зависит от параметра language . В некоторых языках неделя начинается с понедельника, а в других — с воскресенья.
  • permanently_closed ( устаревший ) является логическим флагом, указывающим, закрылось ли место либо навсегда, либо временно (значение true ). Не используйте permanently_closed . Вместо этого используйте business_status , чтобы получить операционный статус предприятий.
  • photos[] : массив объектов PlacePhoto . PlacePhoto можно использовать для получения фотографии с помощью метода getUrl() , или вы можете проверить объект на предмет следующих значений:
    • height : максимальная высота изображения, в пикселях.
    • width : максимальная ширина изображения, в пикселях.
    • html_attributions : текст атрибуции, который будет отображаться с помощью этого места.
  • place_id : текстовый идентификатор, который уникально идентифицирует место и может использоваться для извлечения информации о месте, используя запрос с подробностями места . Узнайте больше о том, как ссылаться на место с идентификатором места .
  • 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 ИЭТ -языковой код, указывающий язык, используемый в обзоре пользователя. Это поле содержит только основной тег языка, а не вторичный тег, указывающий на страну или регион. Например, все английские обзоры помечены как «en», а не «en-au» или «en-uk».
    • rating общего рейтинга пользователя для этого места. Это целое число, в диапазоне от 1 до 5.
    • text обзор пользователя. При просмотре местоположения с Google Place обзоры считаются необязательными; Следовательно, это поле может пусто.
  • types множества типов для этого места (например, ["political", "locality"] или ["restaurant", "lodging"] ). Этот массив может содержать несколько значений или может быть пустым. Новые значения могут быть введены без предварительного уведомления. Смотрите список поддерживаемых типов .
  • url : URL официальной страницы Google для этого места. Это страница, принадлежащая Google, которая содержит лучшую доступную информацию о месте. Приложения должны ссылаться на эту страницу или встроить эту страницу на любой экране, на котором показаны подробные результаты о месте для пользователя.
  • vicinity : упрощенный адрес для этого места, включая название улицы, номер улицы и местность, но не провинция/штат, почтовый кодекс или страна. Например, Google в Сиднее, Австралийский офис имеет vicinity ценность 5/48 Pirrama Road, Pyrmont . Собственность vicinity возвращается только для близлежащего поиска .
  • website перечисляет авторитетный веб -сайт для этого места, например, на домашней странице бизнеса.

Примечание. Многомерные оценки могут быть недоступны для всех мест. Если слишком мало обзоров, то ответ деталей либо будет включать в себя Legacy Rating по шкале от 0,0 до 5,0 (если таковой имеется), либо вообще не вообще.

Ссылка на место с идентификатором места

Идентификатор места - это уникальная ссылка на место на карте Google. Идентификаторы места доступны для большинства мест, включая предприятия, достопримечательности, парки и перекрестки.

Чтобы использовать идентификатор места в вашем приложении, вы должны сначала найти идентификатор, который доступен в PlaceResult of the Place Search или запроса деталей. Затем вы можете использовать это идентификатор места, чтобы посмотреть детали места .

Идентификаторы размещения освобождаются от ограничений кэширования, указанных в разделе 3.2.3 (b) Условий обслуживания платформы Google Maps. Поэтому вы можете хранить значения идентификатора для последующего использования. Для получения лучших практик при хранении идентификаторов места см. Обзор идентификации места .

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);

Разместить фотографии

Используйте функцию Place Photo, чтобы добавить высококачественный фотографический контент на ваш сайт. Фото -служба дает вам доступ к миллионам фотографий, хранящихся в местах и локальной базе данных Google+. Когда вы получите информацию о размещении, используя запрос на информацию о местах, ссылки на фотографии будут возвращены для соответствующего фотографического контента. Бесзамянутые запросы на поиск и текстовый поиск также возвращают одну ссылку на фотографию на место, когда это уместно. Используя фото службу, вы можете получить доступ к указанным фотографиям и изменить размер изображения до оптимального размера для вашего приложения.

Массив объектов PlacePhoto будет возвращен как часть объекта PlaceResult для любых getDetails() , textSearch() или nearbySearch() сделанным против PlacesService .

Примечание. Количество возвращенных фотографий варьируется в зависимости от запроса.

  • Ближайший поиск или текстовый поиск вернется не более одного объекта PlacePhoto .
  • Запрос деталей вернется до десяти объектов PlacePhoto .

Вы можете запросить URL для связанного изображения, вызывая метод PlacePhoto.getUrl() и передавая действительный объект PhotoOptions . Используйте объект PhotoOptions , чтобы указать максимальную высоту и ширину изображения. Если вы указали значение как для maxHeight , так и для maxWidth , фото служба будет изменять размер изображения до меньшего размера из двух размеров, сохраняя при этом исходное соотношение сторон.

Следующий фрагмент кода принимает объект Place и добавляет маркер к карте, если фотография существует. Изображение маркера по умолчанию заменяется небольшой версией фотографии.

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})
  });
}

Фотографии, возвращаемые фото -сервисом, получены из различных мест, включая владельцев бизнеса и пользовательские фотографии. В большинстве случаев эти фотографии могут использоваться без атрибуции или будут иметь необходимую атрибуцию, включенную как часть изображения. Однако, если возвращаемый photo включает значение в поле html_attributions , вы должны включить дополнительную атрибуцию в ваше приложение, где бы вы ни отображали изображение.