Автор: Stasyuk Eugene 69 Метки: , 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>

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

Position sticky не работает position: sticky

Position sticky не работает

Position sticky не работает

Position sticky не работает — к моему удивлению это довольно частый запрос, с которым я сам в свое время столкнулся. Sticky — это довольно простое и универсальное решение для размещения липких блоков на странице. Как минимум, оно не требует от тебя приличного количества javascript кода, который и работал местами коряво. Сейчас же данную процедуру можно […]

ACF поля в текстовом редакторе Gutenberg

ACF поля в текстовом редакторе Gutenberg

ACF поля в текстовом редакторе Gutenberg

Gutenberg — уже довольно долго используется в WordPress в качестве основного текстового редактора. Я, наверное, как и большинство разработчиков не особо горел желанием его использовать. Тем более, что в качестве альтернативы можно было загрузить плагин Classic Editor и дальше пользоваться старым редактором. Но, по мере использования Gutenberg, я увидел большое количество его преимуществ и таким […]