Узнайте, как перенести существующую реализацию Places API или Place Class в компоненты Places UI Kit.
Для кого предназначен этот путеводитель?
Это руководство предназначено для разработчиков, у которых уже есть реализация, использующая Places API, и которые заинтересованы в обновлении своего кода для использования Places UI Kit. Оно будет наиболее полезно, если вы уже:
- Выполнение HTTP-запросов к конечным точкам Places API (новым или устаревшим).
- Использование класса Place в рамках JavaScript API карт.
- Обработка ответа API для отображения информации о месте в пользовательском интерфейсе вашего веб-приложения.
Предварительные требования
Включите Places UI Kit в своем проекте Google Cloud. Вы можете продолжать использовать существующий ключ API или сгенерировать новый для Places UI Kit. Дополнительную информацию, включая ограничение доступа к ключу, см. в разделе «Использование ключей API» .
Обновление карт. Загрузка JavaScript API.
Для работы Places UI Kit требуется метод динамического импорта библиотек для загрузки JavaScript API карт. Если вы используете тег прямой загрузки скрипта , его необходимо обновить.
После обновления скрипта загрузки для JavaScript API карт, импортируйте необходимые библиотеки для использования Places UI Kit.
Реализуйте элемент "Подробная информация о месте".
Элементы «Подробная информация о месте» и «Компактный элемент подробной информации о месте» — это HTML-элементы, отображающие подробную информацию о месте.
Текущая реализация
- Запрос сведений о месте можно выполнить с помощью HTTP-запроса или используя класс Place API на JavaScript.
- Вы анализируете ответ API и отображаете подробную информацию о месте с помощью HTML и CSS.
Элемент "Миграция к месту назначения"
Изменение структуры HTML
Определите HTML-контейнер, в котором отображаются сведения о месте. Замените ваши пользовательские HTML-элементы (div, span для имени, адреса, фотографий и т. д.) HTML-кодом элемента «Сведения о месте».
На выбор предлагаются два элемента:
- Детали места Компактный элемент
- Элемент с подробными сведениями о месте
Для получения более подробной информации о том, какой из них использовать, см. элемент «Подробная информация о месте» .
Ваш существующий HTML-код может выглядеть примерно так.
<div id="my-place-details-container">
<h2 id="place-name"></h2>
<p id="place-address"></p>
<img id="place-photo" src="" alt="Place photo">
<!-- ... more custom elements -->
</div>
Пример нового HTML-кода, явно указывающего, какой контент следует отображать:
<gmp-place-details-compact orientation="horizontal" truncation-preferred style="display: none;">
<gmp-place-details-place-request></gmp-place-details-place-request>
<gmp-place-content-config>
<gmp-place-media lightbox-preferred></gmp-place-media>
<gmp-place-address></gmp-place-address>
<gmp-place-rating></gmp-place-rating>
<gmp-place-type></gmp-place-type>
<gmp-place-price></gmp-place-price>
<gmp-place-accessible-entrance-icon></gmp-place-accessible-entrance-icon>
<gmp-place-open-now-status></gmp-place-open-now-status>
</gmp-place-content-config>
</gmp-place-details-compact>
Адаптируйте логику JavaScript.
Существующая логика
Ваша существующая логика, вероятно, включает в себя:
- Получение идентификатора места.
- Использование
PlacesService().getDetails()или вызов веб-сервиса. - Указание массива полей (для JS API) или FieldMask (для веб-сервиса) для запроса конкретных данных.
- При разрешении обратного вызова вручную выбирайте элементы HTML и заполняйте их полученными данными.
Ниже приведён пример того, как может быть реализована функция отображения сведений о месте:
async function getPlaceDetails(placeId) {
const { Place } = await google.maps.importLibrary('places');
// Use place ID to create a new Place instance.
const place = new Place({
id: placeId
});
await place.fetchFields({
fields: ['displayName', 'formattedAddress', 'location'],
});
// Log the result
console.log(place.displayName);
console.log(place.formattedAddress);
}
Новая логика
Ваша новая логика будет включать в себя:
- Получите идентификатор места или объект места.
- Получите ссылку на элемент
<gmp-place-details-place-request>. - Передайте идентификатор места (Place ID) или объект места (Place Object) в свойство place элемента
<gmp-place-details-place-request>.
Ниже приведён пример того, как можно реализовать UI-комплект «Подробности о месте» в вашей JavaScript-логике. Получите ссылку на элемент «Подробности о месте». Если он существует, получите ссылку на элемент «Запрос на место» в разделе «Подробности о месте» и установите свойство «Место», используя идентификатор места. В приведённом выше примере HTML-кода стиль элемента «Подробности о месте» установлен на display: none . Теперь он изменён на display: block .
function displayPlaceDetailsWithUIKit(placeId) {
const placeDetailsElement = document.querySelector('gmp-place-details-compact');
if (placeDetailsElement) {
const placeDetailsRequest = document.querySelector('gmp-place-details-place-request');
// Configure the element with the Place ID
placeDetailsRequest.place = placeId
placeDetailsElement.style.display = 'block';
console.log("PlaceDetailsElement configured for place:", placeId);
} else {
console.error("PlaceDetailsElement not found in the DOM.");
}
}
// Example usage:
const placeId = 'ChIJC8HakaIRkFQRiOgkgdHmqkk';
displayPlaceDetailsWithUIKit(placeId);
Реализовать элемент поиска места
Элемент «Поиск места» — это HTML-элемент, который отображает результаты поиска места в виде списка.
Текущая реализация
- Вы можете выполнить текстовый поиск или поиск поблизости с помощью HTTP-запроса, либо использовать класс Place из JavaScript API.
- С помощью FieldMask вы указываете параметры запроса, ограничения или смещения по местоположению, типы и запрашиваемые поля.
- Вы анализируете ответ API, перебираете массив мест и вручную создаете элементы HTML-списка.
Элемент поиска «Миграция на место»
Изменение структуры HTML
Определите HTML-контейнер, в котором отображается список мест. Замените ваши пользовательские HTML-элементы (div, span для имени, адреса и т. д.) HTML-элементом элемента поиска мест.
Ваш существующий HTML-код может выглядеть примерно так:
<div id="search-results-area">
<h3>Nearby Places:</h3>
<ul id="manual-places-list">
<!-- JavaScript would dynamically insert list items here -->
<!-- Example of what JS might generate:
<li class="place-entry" data-place-id="SOME_PLACE_ID_1">
<img class="place-icon" src="icon_url_1.png" alt="Icon">
<span class="place-name">Place Name One</span> -
<span class="place-vicinity">123 Main St</span>
</li>
<li class="place-entry" data-place-id="SOME_PLACE_ID_2">
<img class="place-icon" src="icon_url_2.png" alt="Icon">
<span class="place-name">Place Name Two</span> -
<span class="place-vicinity">456 Oak Ave</span>
</li>
-->
<li class="loading-message">Loading places...</li>
</ul>
</div>
Элемент поиска мест реализован с использованием компонента <gmp-place-search> . Для настройки типа поиска необходимо включить один из следующих компонентов конфигурации с соответствующими слотами:
-
<gmp-place-text-search-request>для текстового поиска. -
<gmp-place-nearby-search-request>для поиска поблизости.
Чтобы определить способ отображения результатов, можно использовать сочетание клавиш <gmp-place-all-content> или предоставить собственный набор отдельных компонентов представления. Ключевые атрибуты, такие как selectable (разрешение щелчков по элементам списка) и orientation (для горизонтального или вертикального расположения), можно задать непосредственно в родительском компоненте.
Пример поиска поблизости
<gmp-place-search orientation="horizontal" selectable>
<gmp-place-all-content> </gmp-place-all-content>
<gmp-place-nearby-search-request></gmp-place-nearby-search-request>
</gmp-place-search>
Пример поиска текста
<gmp-place-search orientation="horizontal" selectable>
<gmp-place-all-content> </gmp-place-all-content>
<gmp-place-text-search-request></gmp-place-text-search-request>
</gmp-place-search>
Адаптируйте логику JavaScript.
В вашем JavaScript-коде получите ссылку на компонент контроллера поиска, используя document.querySelector() . В зависимости от вашей конфигурации, это будет либо элемент <gmp-place-text-search-request> , либо <gmp-place-nearby-search-request> .
Далее задайте свойства этого контроллера, чтобы определить тип выполняемого поиска. Необходимые свойства зависят от типа выполняемого поиска.
Для текстового поиска ( <gmp-place-text-search-request> ) основным свойством является textQuery :
const textSearchController = document.querySelector('gmp-place-text-search-request');
textSearchController.textQuery = 'museums in London';
Для поиска поблизости ( <gmp-place-nearby-search-request> ) необходимо определить область поиска с помощью параметра locationRestriction . Затем можно использовать includedTypes для фильтрации по определенным типам мест в этой области:
const nearbySearchController = document.querySelector('gmp-place-nearby-search-request');
nearbySearchController.locationRestriction = new google.maps.Circle({
center: { lat: 51.5190, lng: -0.1347 },
radius: 1000
});
nearbySearchController.includedTypes = ['restaurant'];
Родительский компонент <gmp-place-search> автоматически инициирует новый поиск, как только будут заданы необходимые свойства его контроллера.
- При текстовом поиске поиск запускается в момент присвоения значения
textQuery. - При поиске поблизости поиск выполняется после указания действительного параметра
locationRestriction.
Реализация базового элемента автозаполнения для размещения объектов.
Для разработчиков, которым требуется функция поиска без использования встроенного элемента поиска мест, доступен базовый элемент автозаполнения мест .
Этот элемент идеально подходит для создания поля ввода для поиска, сохраняя при этом полный контроль над отображением результатов в вашем пользовательском интерфейсе. Единственная задача элемента автозаполнения — предоставлять подсказки о местах по мере ввода пользователем текста и программно отображать идентификатор места (Place ID) для выбранного места.
Оно само по себе не отображает никаких подробностей и не предоставляет никакой другой информации, доступной программным способом.
Текущая реализация
Ваша существующая логика, вероятно, включает в себя:
- Отображение на странице текстового поля ввода, которое вызывает функцию автозаполнения Place Autocomplete по мере ввода пользователем текста и отображает результаты.
- Используя идентификатор места, выбранного пользователем, можно получить более подробную информацию, например, с помощью API для получения сведений о месте.
- Отображение подробной информации о выбранном месте.
Перенос элемента автозаполнения для размещения
Изменение структуры HTML
Найдите и удалите HTML-элемент, к которому вы прикрепляете виджет автозаполнения. Скорее всего, он использует стандартное HTML-поле ввода.
<input id="pac-input" type="text" placeholder="Search for a location" />
Пример нового HTML-кода, использующего подход веб-компонентов для инициализации элемента «Базовое автозаполнение» на вашей странице.
<gmp-basic-place-autocomplete></gmp-basic-place-autocomplete>
Адаптируйте логику JavaScript.
Ваша логика на JavaScript, вероятно, включает создание виджета автозаполнения, прикрепленного к HTML-элементу input . Затем этот виджет отслеживает событие place_changed , запуская действие с возвращенными данными.
Пример существующего JavaScript-кода для удаления:
// Get the input element
const input = document.getElementById("pac-input");
// Create the Autocomplete widget instance
const autocomplete = new google.maps.places.Autocomplete(input, {
fields: ["place_id", "geometry", "name"]
});
// Add a listener for the 'place_changed' event
autocomplete.addListener("place_changed", () => {
// Your logic to get and display place information
console.log(place.place_id);
});
Ваша новая логика на JavaScript получит ссылку на элемент автозаполнения Basic Place и будет отслеживать события gmp-select :
const placeAutocomplete = document.querySelector('gmp-basic-place-autocomplete');
placeAutocomplete.addEventListener('gmp-select', (event) => {
console.log(event.place);
});
При выборе места в раскрывающемся списке автозаполнения срабатывает событие gmp-select . Идентификатор выбранного места можно получить из объекта event . Затем этот идентификатор можно использовать для инициализации экземпляра элемента «Подробная информация о месте» , чтобы отобразить подробную информацию о выбранном месте.
Обработка настройки
Настройка элемента "Подробная информация о месте"
Ориентация
Элемент «Подробная информация о месте» может отображаться как в горизонтальной, так и в вертикальной ориентации. Используйте атрибут orientation элемента gmp-place-details-compact чтобы выбрать между вертикальной и горизонтальной ориентацией. Например:
<gmp-place-details-compact orientation="vertical">
Выберите поля для отображения.
Используйте элементы содержимого для указания контента, который будет отображаться в элементе «Подробная информация о месте». Например, исключение элемента содержимого <gmp-place-type> приведет к тому, что элемент «Подробная информация о месте» не будет отображать тип выбранного места. Полный список элементов содержимого см. в справочной документации по PlaceContentConfigElement .
Добавление или удаление полей из элемента «Подробная информация о месте» не изменяет стоимость отображения элемента на странице.
Задать стили CSS
Для настройки цвета и шрифта элемента доступны пользовательские свойства CSS. Например, чтобы установить зеленый фон элемента, задайте следующее свойство CSS:
gmp-place-details-compact {
--gmp-mat-color-surface: green;
}
Для получения более подробной информации см. справочную документацию по PlaceDetailsCompactElement .
Настройка элемента поиска места
Ориентация
Элемент поиска мест может отображаться как в горизонтальной, так и в вертикальной ориентации. Используйте атрибут orientation для элемента <gmp-place-search> , чтобы выбрать между вертикальной и горизонтальной ориентацией. Например:
<gmp-place-search orientation="horizontal" selectable>
Выберите поля для отображения.
Используйте элементы содержимого, чтобы указать контент, который будет отображаться внутри элемента поиска мест. Элемент <gmp-place-all-content> можно использовать для отображения всего контента, или же можно использовать набор HTML-тегов для настройки отображаемого контента.
Включение <gmp-place-address> в <gmp-place-content-config> приведет к отображению только адреса каждого места, например:
<gmp-place-search orientation="horizontal" selectable>
<gmp-place-content-config>
<gmp-place-address></gmp-place-address>
</gmp-place-content-config>
<gmp-place-text-search-request></gmp-place-text-search-request>
</gmp-place-search>
Базовая настройка элемента автозаполнения места
Задать стили CSS
Для настройки внешнего вида элемента автозаполнения доступны пользовательские свойства CSS. Например, чтобы установить светло-фиолетовый цвет фона, необходимо задать свойство background-color для элемента.
gmp-basic-place-autocomplete {
background-color: #d993e6;
}
Для получения более подробной информации см. справочную документацию по методу BasicPlaceAutocompleteElement .
Обработка событий и данных
Элементы Places UI Kit — это интерактивные компоненты, позволяющие отслеживать события и программно получать данные.
Слушайте новости о событиях
Вы можете добавлять обработчики событий к элементам, чтобы запускать действия в зависимости от взаимодействия пользователя или состояния элемента.
Отборочное мероприятие
-
gmp-select: Это событие срабатывает, когда пользователь делает выбор.- В элементе поиска мест это срабатывает, когда пользователь щелкает по месту в списке результатов.
- В элементе автозаполнения Basic Place Autocomplete это срабатывает, когда пользователь выбирает вариант ответа из выпадающего списка.
Общие события
Элементы «Поиск места», «Подробная информация о месте» и «Базовое автозаполнение места» поддерживают следующие события:
-
gmp-load: Срабатывает, когда элемент и его содержимое завершают загрузку и отрисовку. -
gmp-requesterror: Срабатывает, когда запрос к серверу завершается неудачей, например, из-за недействительного ключа API.
Доступ к данным элементов программным способом
Вы можете программно извлекать определенные данные из элементов после того, как с ними было установлено взаимодействие или они были загружены.
- Для элементов «Поиск мест» и «Подробная информация о месте» можно получить следующую информацию:
- Идентификатор места
- Местоположение (широта и долгота)
- Видовое окно
- Для элемента автозаполнения "Основное место" можно получить следующую информацию:
- Идентификатор места
Все остальные данные, содержащиеся в элементах, недоступны для программного доступа.
Более подробные примеры см. в документации к элементам «Поиск места» , «Подробная информация о месте» и «Базовое автозаполнение места» .
Тестирование и доработка
После интеграции элементов Places UI Kit тестирование имеет решающее значение для плавного перехода и положительного пользовательского опыта. Ваше тестирование должно охватывать несколько ключевых областей, проверяя все реализованные элементы: сведения о месте, поиск места и базовое автозаполнение места.
Элемент с подробными сведениями о месте
Для элемента «Подробная информация о месте» начните с проверки корректности отображения сведений для различных мест. Протестируйте, передав различные идентификаторы мест (Place ID) свойству .place элемента ` <gmp-place-details-place-request> `. Используйте идентификаторы, представляющие различные типы предприятий (компании с подробными данными, достопримечательности, простые адреса) и места в разных регионах или на разных языках. Обратите особое внимание на форматирование, макет и наличие контента.
Место для элемента поиска
Если вы внедрили элемент поиска мест, проверьте его отображение и поведение в различных сценариях поиска.
- Для проверки текстового поиска установите свойство
textQueryэлемента<gmp-place-text-search-request>с различными входными данными: общими запросами, конкретными адресами и запросами с учетом местоположения. - Для поиска поблизости протестируйте, установив свойства
locationRestrictionиincludedTypesдля элемента<gmp-place-nearby-search-request>. Используйте фильтры по размерам местоположений и типам.
Убедитесь, что список заполняется соответствующими результатами и что событие gmp-select корректно срабатывает при выборе.
Элемент автозаполнения Basic Place
Для элемента автозаполнения «Базовое место» сосредоточьте тестирование на взаимодействии с пользователем и данных, передаваемых событием выбора. Убедитесь, что событие gmp-select срабатывает надежно, когда пользователь щелкает по предложенному варианту. Проверьте, что объект event.place в обработчике событий содержит действительный идентификатор места (Place ID).
Самое важное — протестируйте весь процесс от начала до конца: выберите место из выпадающего списка автозаполнения и убедитесь, что его идентификатор места (Place ID) может быть успешно использован для заполнения другого элемента, например, элемента «Подробная информация о месте».
Обработка ошибок
Тщательное тестирование обработки ошибок крайне важно для всех компонентов. Имитируйте передачу недействительных или несуществующих идентификаторов мест в элемент сведений о месте или использование недействительных параметров поиска для элемента поиска мест. Запустите событие gmp-requesterror , имитируя проблемы с сетью или используя недействительный ключ API, чтобы убедиться, что ваше приложение обрабатывает его корректно. Внедрите удобные для пользователя сообщения об ошибках и ведение журналов, чтобы предотвратить неработающий или запутанный пользовательский интерфейс.