Карты Google - одно из самых популярных и популярных приложений с более чем миллиардом пользователей в месяц. Начиная с Angular версии 9, он также доступен как компонент Angular.
На момент написания этой статьи документация официального репозитория @angular/google-maps
была очень минималистичной. Причина в том, что @angular/google-maps
- это просто Angular-оболочка официальных GoogleMaps. Чтобы реализовать функции, вам часто приходится обращаться к официальной документации Google Maps API.
Некоторых разработчиков, с которыми я разговаривал, это сбивало с толку. Некоторые из них чувствовали себя потерянными при реализации функции, использующей Google Maps в Angular.
В последнее время мне самому приходилось реализовывать функцию с помощью Google Maps. После успешной реализации своей функции я решил написать этот пост, чтобы облегчить вам жизнь.
О чем это?
В этом сообщении блога мы узнаем, как реализовать карту Google с полем поиска и автозаполнением адреса.
Итак, давайте на секунду поиграем в Product owner и сформулируем нашу функцию в виде истории:
Как пользователь я хочу иметь возможность искать город или адрес. Как только я выберу адрес, центр карты должен быть изменен на этот адрес.
Звучит отлично. Итак, мы собираемся создать поле ввода с некоторым автозаполнением адресов и картой Google под ним. Что ж, это может удовлетворить пользовательскую историю. Но держись! Есть еще один критерий приемлемости, исходящий от дизайнера в виде мокапа.
Поле поиска и соответствующее автозаполнение адреса должны быть размещены внутри карты.
Хорошо. Как мы это реализуем? Давайте посмотрим!
Карты и библиотеки Google
Чтобы использовать Google Maps API, первое, что нам нужно сделать, это создать новый ключ API.
После создания мы можем использовать этот ключ API в теге скрипта в нашем index.html
для загрузки Google Maps.
<script src="https://maps.googleapis.com/maps/api/js?key={API_KEY}></script>
Потрясающие. Этот скрипт загружает Google Maps API, но, к сожалению, для нашего случая использования одной карты недостаточно. Помните, нам также нужен адресный поиск.
Здесь в игру вступают библиотеки. Библиотеки содержат дополнительные API-интерфейсы, которые не загружаются вместе с картами. Разделение этих API-интерфейсов на библиотеки позволяет основному API-интерфейсу загружаться быстро.
Доступны следующие библиотеки:
- рисунок - предоставляет интерфейс, который позволяет пользователю рисовать на карте.
- геометрия - служебные функции для расчета расстояния или площади
- localContext - показывает ближайшие достопримечательности.
- места - позволяет вашему приложению искать места.
- визуализация - предоставляет тепловые карты для визуализации данных.
Большой. Для реализации адресного поиска нам понадобится библиотека мест. Чтобы загрузить API мест, нам нужно расширить тег скрипта в HTML с помощью параметра запроса libraries
.
<script src="https://maps.googleapis.com/maps/api/js?key={API_KEY}&libraries=places"></script>
☝️ Убедитесь, что ваш ключ API также включает библиотеку мест.
Большой! Мы загрузили карту и API-интерфейс Places - пора сосредоточиться на части Angular.
🐦 Подписывайтесь на меня в Twitter и будьте в курсе новых интересных вещей по разработке фронтенда!
Начало работы с @ angular / google-maps
Неудивительно, что сначала, конечно, мы должны установить библиотеку @angular/google-maps
.
npm install @angular/google-maps
После установки мы можем импортировать GoogleMapsModule
.
☝️ Обычно вы добавляете это в свой функциональный модуль с отложенной загрузкой. Ради этого поста вполне нормально добавить его в
AppModule
.
Теперь мы готовы использовать директиву google-map
в нашем HTML.
Если мы сейчас запустим наш сервер разработки, мы увидим, что на нашей странице отображается базовая карта.
Эта карта в настоящее время использует некоторые настройки по умолчанию для отображения элементов управления. Конечно, карту можно настраивать. Давайте воспользуемся некоторыми параметрами настройки, чтобы настроить карту.
С опцией center
мы сначала центрируем карту в прекрасном месте в Швейцарии, месте, где я вырос 😉
Если у вас когда-нибудь будет возможность посетить Швейцарию, я настоятельно рекомендую вам посетить этот регион. Он великолепен для пеших прогулок и катания на беговых лыжах. Хватит маркетинга, давайте сосредоточимся на кодировании.
options
дает нам точный контроль над картой и ее элементами управления. В нашем случае мы хотим показать только полноэкранный режим и элемент управления масштабированием. Поэтому мы отключаем пользовательский интерфейс по умолчанию. Кроме того, мы используем свойство width
, чтобы наша карта занимала всю ширину родительского контейнера.
Прохладный. Мы отобразили и настроили базовую карту. Теперь сконцентрируемся на адресном поиске.
Добавление окна поиска
По своей сути, поле поиска адреса представляет собой классический элемент ввода HTML с некоторым CSS. Функция поиска добавляется после того, как мы соединяем элемент ввода с окном поиска мест Google.
Для начала мы создаем собственный элемент Input поверх компонента google-map
. Кроме того, мы добавляем в него ссылку на шаблон (#mapSearchField
) и класс CSS.
Очевидно, что класс CSS используется для стилизации ввода в соответствии с нашими пожеланиями. Ссылка на шаблон, тем не менее, позволяет нам получить элемент ввода внутри TypeScript.
Мы используем Angulars @ViewChild
для запроса входного элемента и карты.
☝️ Поскольку карта является угловым компонентом, мы можем запросить ее по имени класса компонента вместо использования ссылки на шаблон.
Отлично, мы получили поле поиска и карту. Пришло время подключить их. Что может быть лучше, чем сделать это с помощью крючка жизненного цикла ngAfterViewInit
?
Мы создаем новый экземпляр поля поиска и передаем собственный элемент нашего поля поиска в качестве параметра конструктора. Этот вызов автоматически связывает наше поле ввода с SearchBox.
Далее мы размещаем наше поле поиска на карте. Карта Google предоставляет ControlPosition
перечисление для выделенных точек на карте. Мы хотим отображать наше поле поиска в TOP_CENTER
.
Вот это да. У нас есть карта с окном поиска и предложениями адресов. Но мы еще не закончили.
Если на этом этапе мы выберем адрес, карта не изменит местоположение. Ну да, в этом есть смысл. Это еще не реализовано. 😉
Реагировать на внесение изменений
Поле поиска выдает places_changed
событие, которое срабатывает, как только мы выбираем новое место.
В нашем обратном вызове мы получаем доступ к местам, возвращаемым searchBox
. Мы выполняем некоторые проверки, а затем используем геометрию места для создания новых границ и обновления центра карты.
Вот и все. Мы успешно создали простую карту с адресным поиском.
Если описанные выше действия запутались, вот полный код компонента:
Если вам понравилась моя работа и эта запись в блоге, мы будем очень признательны, если вы поддержите мою работу в виде аплодисментов или звездочек. Кроме того, не стесняйтесь поделиться этим сообщением, чтобы больше людей могли извлечь из него пользу.