• Платформа Google Maps — это мощная и самая популярная платформа картографических сервисов, которая позволяет разработчикам встраивать карты в мобильные приложения и веб-страницы.
  • В этом уроке мы изучим основы использования Google Maps.

Обязательное условие -

  • Включите Maps JavaScript API в своей библиотеке Google Cloud Platform.
  • В разделе API и службы › Учетные данные создайте ограниченный ключ с разрешением для Maps JavaScript API.

Создание простой карты

Давайте создадим карту с помощью платформы Google Maps.
В этом примере мы будем использовать JavaScript API платформы Google Maps.

<!DOCTYPE html>
<html>
  <head>
    <script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>
    <style>
      #map {
        
        height: 100%;
      }
      html,
      body {
          height: 100%;
      }
    </style>
  </head>
  <body>
    
    <div id="map"></div>

    <script
      src="https://maps.googleapis.com/maps/api/js?key=YOUR_GOOGLE_MAPS_PLATFORM_KEY_HERE&callback=initMap&v=weekly"
      defer
    ></script>
    
    <script>
        function initMap() {

          var map = new google.maps.Map(document.getElementById('map'), {
            center: { lat: 48.13641, lng: 11.57754 },
            zoom: 5,
            fullscreenControl: false,
            streetViewControl: false,
            mapId: "DEMO_MAP_ID",
          });       
        }

    </script>
  </body>
</html>

Добавление значков маркеров

Теперь, когда базовая карта настроена,
давайте добавим на нашу карту несколько маркеров с событиями щелчка.
Мы скажем «Привет» на местном языке.

В этом случае мы будем использовать классы Marker и InfoWindow платформы Google Maps.

var londonMarker = new google.maps.Marker({
    position: {lat:51.50136, lng:-0.14191},
    map: map
});

londonMarker.addListener("click", () => {
  map.setCenter(londonMarker.getPosition());

  var infowindow = new google.maps.InfoWindow({
    content: "<div><p>Hello!</p></div>"
  });

  infowindow.open(map, londonMarker);
});


var italianMarker = new google.maps.Marker({
  position: {lat:41.88989, lng:12.49337},
  map: map
});

italianMarker.addListener("click", () => {
  map.setCenter(italianMarker.getPosition());

  var infowindow = new google.maps.InfoWindow({
    content: "<div><p>Ciao!</p></div>"
  });

  infowindow.open(map, italianMarker);
});


var netherlandsMarker = new google.maps.Marker({
  position: {lat:52.2277, lng:6.89701},
  map: map
});

netherlandsMarker.addListener("click", () => {
  map.setCenter(netherlandsMarker.getPosition());

  var infowindow = new google.maps.InfoWindow({
    content: "<div><p>Hallo!</p></div>"
  });

  infowindow.open(map, netherlandsMarker);
});

Отображение маршрута между двумя маркерами

Для отображения маршрута между двумя маркерами на карте вы можете использовать API службы маршрутов.

Мы используем класс DirectionsService и его метод маршрута.
Например, чтобы рассчитать самый быстрый автомобильный маршрут между Берлином и Францией и отобразить его на карте.

вот как мы можем этого добиться:

var directionsService = new google.maps.DirectionsService;

directionsService.route({
  origin: {lat: 52.51628, lng: 13.3777},
  destination: {lat: 48.85824, lng: 2.2945},
  travelMode: google.maps.DirectionsTravelMode.DRIVING
}, function(result, status) {
  if (status === 'OK') {
      var directionsRenderer = new google.maps.DirectionsRenderer({
          suppressMarkers: true
      });

      directionsRenderer.setDirections(result);

      var leg = result.routes[0].legs[0];

      new google.maps.Marker({
          position: {lat: 52.51628, lng: 13.3777},
          map: map
      });

      new google.maps.Marker({
          position: {lat: 48.85824, lng: 2.2945},
          map: map
      });

      directionsRenderer.setMap(map);
  } else {
      window.alert('Directions request failed due to ' + status);
  }
});

Создание простого кластера с помощью AdvancedMarkerElement

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

Для этого варианта использования нам понадобится импортировать скрипт markerclusterer.

<script src="https://unpkg.com/@googlemaps/markerclusterer/dist/index.min.js"></script>

Нам также потребуется добавить свойство mapId при создании объекта карты:

var map = new google.maps.Map(document.getElementById('map'), {
    center: { lat: 48.13641, lng: 11.57754 },
    zoom: 5,
    fullscreenControl: false,
    streetViewControl: false,
    mapId: "DEMO_MAP_ID",
});

И код создания кластера и маркеров под ним —

const locations = [
  {lat: 48.18485, lng: 16.31224},
  {lat: 48.20871, lng: 16.37265},
  {lat: 48.20681, lng: 16.36683}
]

const markers = locations.map((position, i) => {
  const marker = new google.maps.marker.AdvancedMarkerElement({
      position
  });

  return marker;
});

new markerClusterer.MarkerClusterer({ markers, map });

Наконец, давайте соберем весь код воедино —

<!DOCTYPE html>
<html>
  <head>
    <script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>
    <script src="https://unpkg.com/@googlemaps/markerclusterer/dist/index.min.js"></script>
    <script async defer src="https://maps.googleapis.com/maps/api/js?key=YOUR_GOOGLE_MAPS_PLATFORM_KEY_HERE&callback=initMap"></script>
    <style>
      #map {
        height: 100%;
      }
      html,
      body {
          height: 100%;
      }
    </style>
  </head>
  <body>
    
    <div id="map"></div>

    <script>

        async function initMap() {

            const { AdvancedMarkerElement } = await google.maps.importLibrary(
                "marker",
            );

            var map = new google.maps.Map(document.getElementById('map'), {
                center: { lat: 48.13641, lng: 11.57754 },
                zoom: 5,
                fullscreenControl: false,
                streetViewControl: false,
                mapId: "DEMO_MAP_ID",
            });

            
            var londonMarker = new google.maps.Marker({
                position: {lat:51.50136, lng:-0.14191},
                map: map
            });

            londonMarker.addListener("click", () => {
                map.setCenter(londonMarker.getPosition());

                var infowindow = new google.maps.InfoWindow({
                  content: "<div><p>Hello!</p></div>"
                });

                infowindow.open(map, londonMarker);
            });


            var italianMarker = new google.maps.Marker({
                position: {lat:41.88989, lng:12.49337},
                map: map
            });

            italianMarker.addListener("click", () => {
                map.setCenter(italianMarker.getPosition());

                var infowindow = new google.maps.InfoWindow({
                  content: "<div><p>Ciao!</p></div>"
                });

                infowindow.open(map, italianMarker);
            });



            var netherlandsMarker = new google.maps.Marker({
                position: {lat:52.2277, lng:6.89701},
                map: map
            });

            netherlandsMarker.addListener("click", () => {
                map.setCenter(netherlandsMarker.getPosition());

                var infowindow = new google.maps.InfoWindow({
                  content: "<div><p>Hallo!</p></div>"
                });

                infowindow.open(map, netherlandsMarker);
            });
            
            
            var directionsService = new google.maps.DirectionsService;

            directionsService.route({
                origin: {lat: 52.51628, lng: 13.3777},
                destination: {lat: 48.85824, lng: 2.2945},
                travelMode: google.maps.DirectionsTravelMode.DRIVING
            }, function(result, status) {
                if (status === 'OK') {
                    var directionsRenderer = new google.maps.DirectionsRenderer({
                        suppressMarkers: true
                    });

                    directionsRenderer.setDirections(result);

                    var leg = result.routes[0].legs[0];

                    new google.maps.Marker({
                        position: {lat: 52.51628, lng: 13.3777},
                        map: map
                    });

                    new google.maps.Marker({
                        position: {lat: 48.85824, lng: 2.2945},
                        map: map
                    });

                    directionsRenderer.setMap(map);
                } else {
                    window.alert('Directions request failed due to ' + status);
                }
            });

            const locations = [
                {lat: 48.18485, lng: 16.31224},
                {lat: 48.20871, lng: 16.37265},
                {lat: 48.20681, lng: 16.36683}
            ]

            const markers = locations.map((position, i) => {
                const marker = new google.maps.marker.AdvancedMarkerElement({
                    position
                });

                return marker;
            });

            new markerClusterer.MarkerClusterer({ markers, map });
        }

    </script>

  </body>
</html>

Поздравляем! Ваша настроенная карта Google должна выглядеть следующим образом: