Автор: Stasyuk Eugene 90 Метки: , 26.02.2024

Сегодня разберем как сделать google map со списком адресов. Важная особенность заключается в том, что при клике на какой-либо из адресов, в центре карты должен отобразиться маркер с этим адресом.

Полностью готовый и рабочий вариант можно увидеть здесь: https://codepen.io/jecosjmecos/pen/rNRgrgg

А в самой статье уже разберем работу поэтапно.

1) Стили

Задаем размеры карты на странице

<style>
  #map {
    height: 400px;
    width: 100%;
  }
</style>

2) Разметка списка с адресами

Обертка со списком должна иметь id=’address’

<ul id="address">
  <li>
    <a href="#"
       data-lat="51.52997244138653"
       data-lng="-0.1721165694782623">
      <span class="address">
        St John's Wood Rd, London NW8 8QN, Great Britain
      </span>
      <span class="link">Directions</span>
    </a>
 </li>

  <li>
    <a href="#"
       data-lat="13.731994255241341"
       data-lng="100.54166799585914">
      <span class="address">
        Lumphini, Pathum Wan, Bangkok 10330, Thailand
      </span>
      <span class="link">Directions</span>
    </a>
  </li>

  <li>
    <a href="#"
       data-lat="35.72016405570121"
       data-lng="139.76076052276977">
      <span class="address">
        1 Chome-28-9 Nezu, Bunkyo City, Tokyo 113-0031, Japan
      </span>
      <span class="link">Directions</span>
    </a>
  </li>
</ul>

Важный момент! Ссылка (тег <a>) имеет два атрибута: data-lat и data-lng . В этих атрибутах мы используем координаты, которые потом будут отображаться на карте.

Чтобы их получить, достаточно на открытой google карте кликнуть правой кнопкой мыши на точку, после чего будет доступно окно с опциям, первым пунктом которого являются координаты.

3) Область с картой

Добавляем элемент с id=’map’. Содержимое блока будет заполнено картой

<div id="map"></div>

4) Основной скрипт

Данный скрипт:

  • Считывает координаты адресов в нашем списке
  • Добавляет маркеры этих адресов на карту
  • При клике на один из адресов отображает его в центре карты

Чтобы скрипт работал, нужно в консоли google создать api key и вставить его в ссылке вместо YOUR_API_KEY в script.src в функции initMap(). Как создать ключ можно посмотреть здесь: https://developers.google.com/maps/documentation/embed/get-api-key

<script>
  document.addEventListener('DOMContentLoaded', async function(){

      const mapList = document.querySelectorAll('#address li a');

      if(mapList.length){
          await initMap(mapList);

          mapList.forEach((item) => {

              item.addEventListener('click', function(e){
                  e.preventDefault();

                  addMarker(+this.dataset.lat, +this.dataset.lng);
              });

          });
      }
  });

  async function initMap(coordinates) {
      return new Promise((resolve, reject) => {
          const script = document.createElement('script');
          script.src = `https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMapCallback`;
          script.defer = true;
          script.async = true;
          window.initMapCallback = function() {
              const map = new google.maps.Map(document.getElementById("map"), {
                  center: { lat: -10.397, lng: 155.644 },
                  zoom: 16,
                  mapTypeControl: false,
                  streetViewControl: false,
              });

              window.map = map;

              coordinates.forEach((coordinate) => {
                  addMarker(+coordinate.dataset.lat, +coordinate.dataset.lng, map);
              });

              resolve();
          };

          document.head.appendChild(script);
      });
  }

  function addMarker(lat, lng, map = false) {
      map = map ? map : window.map;

      const marker = new google.maps.Marker({
          position: { lat: lat, lng: lng },
          map: map,
      });

      map.setCenter({ lat: lat, lng: lng });
  }
</script>

Другие статьи

Якорные ссылки и фиксированный header

Якорные ссылки и фиксированный header

Якорные ссылки и фиксированный header

В последнее время я уже давно не встречал сайты, которые не имеют фиксированный header. Такой подход уже стал обычной практикой. Как минимум очень удобно когда навигация по сайту всегда находится под рукой. Но есть один момент, который может доставить дискомфорт при таком подходе — это якорные ссылки. Обычно при клике на такую ссылку, секция с […]

Всплывающее окно на сайте (попап, модальное окно) pop-up window

Всплывающее окно на сайте (попап, модальное окно)

Всплывающее окно на сайте (попап, модальное окно)

Когда я только осваивал азы разработки, всплывающее окно я делал вручную. Да, да — вместо того, чтобы найти какое-то готовое решение, я занимался этим неблагодарным делом 🤪. Мне казалось, что особо ничего сложного в этом нет. Но, только спустя какое-то время работы над данным вопросом, я начал осознавать, что сделать это не так уж и […]