API Google Maps JS v3 - простий приклад декількох маркерів


657

Досить новий для Google Maps Api. У мене є масив даних, які я хочу переглянути та побудувати на карті. Здається, досить просто, але всі знайдені мною багатомаркетні підручники досить складні.

Давайте використаємо для прикладу масив даних з сайту google:

var locations = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.259302, 1]
];

Я просто хочу створити всі ці пункти та мати спливаюче вікно з інформацією, коли натиснути, щоб відобразити ім'я.

Відповіді:


1128

Це найпростіший варіант, який я міг би звести до цього:

<!DOCTYPE html>
<html> 
<head> 
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> 
  <title>Google Maps Multiple Markers</title> 
  <script src="http://maps.google.com/maps/api/js?sensor=false" 
          type="text/javascript"></script>
</head> 
<body>
  <div id="map" style="width: 500px; height: 400px;"></div>

  <script type="text/javascript">
    var locations = [
      ['Bondi Beach', -33.890542, 151.274856, 4],
      ['Coogee Beach', -33.923036, 151.259052, 5],
      ['Cronulla Beach', -34.028249, 151.157507, 3],
      ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
      ['Maroubra Beach', -33.950198, 151.259302, 1]
    ];

    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 10,
      center: new google.maps.LatLng(-33.92, 151.25),
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    var infowindow = new google.maps.InfoWindow();

    var marker, i;

    for (i = 0; i < locations.length; i++) {  
      marker = new google.maps.Marker({
        position: new google.maps.LatLng(locations[i][1], locations[i][2]),
        map: map
      });

      google.maps.event.addListener(marker, 'click', (function(marker, i) {
        return function() {
          infowindow.setContent(locations[i][0]);
          infowindow.open(map, marker);
        }
      })(marker, i));
    }
  </script>
</body>
</html>

👨💻 Редагувати / вилка на Codepen →

ЕКРАН

Кілька маркерів Google Maps

Існує якась магія закриття, яка відбувається при передачі аргументу зворотного дзвінка до addListener методу . Це може бути досить хитрою темою, якщо ви не знайомі з тим, як працюють закриття. Я б запропонував переглянути наступну статтю Mozilla для короткого ознайомлення, якщо це так:

Mozilla Dev Center: Робота з Closures


4
@RaphaelDDL: Так, ці скобки потрібні, щоб насправді викликати безіменну функцію. Аргументи потрібно передавати через те, як працює JavaScript (через закриття). Дивіться мою відповідь на це питання для прикладу та додаткової інформації: stackoverflow.com/a/2670420/222908
Даніель Вассалло

Хороша відповідь, але це може бути спрощено далі. Оскільки всі маркери матимуть індивідуальне InfoWindows і оскільки JavaScript не має значення, якщо ви додаєте до об’єкту додаткові властивості, все, що вам потрібно зробити, - це додати InfoWindowвластивості маркера, а потім викликати в .open()себе InfoWindow. Я б опублікував зміни тут, але зміни були досить великими, що я розмістив власну відповідь .
Метью Кордаро

Чому б не використати new MarkerClusterer()для масивного бюста? Перевірте відповідь ChirsSwires.
DevWL

Привіт @ Даніелю Вассалло, я теж вимагаю відображення декількох маркерів у моєму іонному кутовому проекті. будь ласка, допоможіть мені, я вже задав питання про stackoverflow. ось посилання на запитання: stackoverflow.com/questions/57985967/…
Saif

Це працює. Дякую. Як ви будете видаляти маркери з карти Google, оскільки ви використовуєте один екземпляр маркера та ініціалізуєте у циклі. Будь ласка, поділіться своїми думками.
Kamlesh

59

Ось ще один приклад з безлічі маркерів навантаження з унікальним titleі infoWindowтекстом. Тестовано з останніми API Google Maps V3.11.

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <title>Multiple Markers Google Maps</title>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
        <script src="https://maps.googleapis.com/maps/api/js?v=3.11&sensor=false" type="text/javascript"></script>
        <script type="text/javascript">
        // check DOM Ready
        $(document).ready(function() {
            // execute
            (function() {
                // map options
                var options = {
                    zoom: 5,
                    center: new google.maps.LatLng(39.909736, -98.522109), // centered US
                    mapTypeId: google.maps.MapTypeId.TERRAIN,
                    mapTypeControl: false
                };

                // init map
                var map = new google.maps.Map(document.getElementById('map_canvas'), options);

                // NY and CA sample Lat / Lng
                var southWest = new google.maps.LatLng(40.744656, -74.005966);
                var northEast = new google.maps.LatLng(34.052234, -118.243685);
                var lngSpan = northEast.lng() - southWest.lng();
                var latSpan = northEast.lat() - southWest.lat();

                // set multiple marker
                for (var i = 0; i < 250; i++) {
                    // init markers
                    var marker = new google.maps.Marker({
                        position: new google.maps.LatLng(southWest.lat() + latSpan * Math.random(), southWest.lng() + lngSpan * Math.random()),
                        map: map,
                        title: 'Click Me ' + i
                    });

                    // process multiple info windows
                    (function(marker, i) {
                        // add click event
                        google.maps.event.addListener(marker, 'click', function() {
                            infowindow = new google.maps.InfoWindow({
                                content: 'Hello, World!!'
                            });
                            infowindow.open(map, marker);
                        });
                    })(marker, i);
                }
            })();
        });
        </script>
    </head>
    <body>
        <div id="map_canvas" style="width: 800px; height:500px;"></div>
    </body>
</html>

Знімок екрана з 250 маркерів:

API Google Maps V3.11 з кількома маркерами

Це автоматично рандомізує Lat / Lng, щоб зробити його унікальним. Цей приклад буде дуже корисним, якщо ви хочете перевірити маркери на 500, 1000, xxx та продуктивність.


1
Будьте обережні, коли публікуєте копіювати та вставляти відповідні відповіді на довільну відповідь на багато питань, спільнота, як правило, позначається як "спам". Якщо ви це робите, то зазвичай це означає, що питання є дублікатами, тому позначте їх як такі.
Кев

1
Це отримає багато спливаючих вікон infoWindowдля кожного маркера і не приховає інший, infoWindowякщо він відображається в даний час. це справді корисно :)
Kannika

@Anup, якщо ви просто прочитаєте питання та прокоментуєте, було б краще. питання задає "приклад для декількох маркерів", чи це випадковий, чи ваш власний бла-бла.
Мадан Сапкота

Знову ж, чому б не використати new MarkerClusterer()для масового бюста? Перевірте відповідь ChirsSwires.
DevWL

1
@DevWL, на нього відповіли ще у 2013 році. Ви можете оновити.
Мадан Сапкота

39

Я думав, що поставлю це тут, оскільки, здається, це популярна точка для тих, хто починає використовувати API Карт Google. Кілька маркерів, зроблених на стороні клієнта, ймовірно, є зниженням ефективності багатьох програм для відображення. Важко орієнтувати, виправляти, а в деяких випадках навіть встановити, що виникає проблема (через розбіжності в браузері, обладнання, доступне клієнту, мобільні пристрої, список продовжується).

Найпростіший спосіб почати вирішувати це питання - використовувати рішення кластеризації маркерів. Основна ідея - згрупувати географічно подібні місця в групу з кількістю відображених точок. Оскільки користувач збільшує масштаб карти, ці групи розширюються, щоб виявити під ними окремі маркери.

Мабуть, найпростіша втілення - це бібліотека markerclusterer . Основна реалізація буде наступною (після імпорту бібліотеки):

<script type="text/javascript">
  function initialize() {
    var center = new google.maps.LatLng(37.4419, -122.1419);

    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 3,
      center: center,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    var markers = [];
    for (var i = 0; i < 100; i++) {
      var location = yourData.location[i];
      var latLng = new google.maps.LatLng(location.latitude,
          location.longitude);
      var marker = new google.maps.Marker({
        position: latLng
      });
      markers.push(marker);
    }
    var markerCluster = new MarkerClusterer(map, markers);
  }
  google.maps.event.addDomListener(window, 'load', initialize);
</script>

Маркери замість того, щоб додавати їх безпосередньо до карти, додаються до масиву. Потім цей масив передається в бібліотеку, яка обробляє складний обчислення для вас, і додається до карти.

Ці впровадження не тільки значно підвищують ефективність роботи клієнта, але й у багатьох випадках призводять до більш простого і менш захаращеного інтерфейсу користувача та більш простому переробленню даних у великих масштабах.

Інші реалізації доступні від Google.

Сподіваємось, це допомагає дещо з тих, що новіші у нюансах картографування.


2
Дякую, велика велика допомога! Існує порядок або величина різниці в продуктивності, зробивши спочатку точки даних google.map, а потім передавши їх в бібліотеку картографування, в цьому випадку MarketCluster будує графік. з приблизно 150 000 пунктів даних, перший пост "Даніеля Вассалло" зайняв приблизно 2 хвилини, щоб завантажити ці 5 секунд. Дякуємо купу "Swires"!
Waqas

1
Я подумав, що це буде гарним місцем для цього, я б уявив, що більшість народів спершу висаджується на стек, коли пов’язані з картами Google - це ця сторінка, а друге - "чому моя карта займає стільки часу для завантаження".
ChrisSwires

@Monic - це все, що є у вашому наборі даних, це просто змінна заповнювач.
ChrisSwires

20

Асинхронна версія:

<script type="text/javascript">
  function initialize() {
    var locations = [
      ['Bondi Beach', -33.890542, 151.274856, 4],
      ['Coogee Beach', -33.923036, 151.259052, 5],
      ['Cronulla Beach', -34.028249, 151.157507, 3],
      ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
      ['Maroubra Beach', -33.950198, 151.259302, 1]
    ];

    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 10,
      center: new google.maps.LatLng(-33.92, 151.25),
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    var infowindow = new google.maps.InfoWindow();

    var marker, i;

    for (i = 0; i < locations.length; i++) {  
      marker = new google.maps.Marker({
        position: new google.maps.LatLng(locations[i][1], locations[i][2]),
        map: map
      });

      google.maps.event.addListener(marker, 'click', (function(marker, i) {
        return function() {
          infowindow.setContent(locations[i][0]);
          infowindow.open(map, marker);
        }
      })(marker, i));
    }
}

function loadScript() {
  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = 'https://maps.googleapis.com/maps/api/js?v=3.exp&' +
      'callback=initialize';
  document.body.appendChild(script);
}

window.onload = loadScript;
  </script>

15

Це робочий приклад зображення карти

var arr = new Array();
    function initialize() { 
        var i;  
        var Locations = [
                {
                  lat:48.856614, 
                  lon:2.3522219000000177, 
                  address:'Paris',
                  gval:'25.5',
                  aType:'Non-Commodity',
                  title:'Paris',
                  descr:'Paris'           
                },        
                    {
                  lat: 55.7512419, 
                  lon: 37.6184217,
                  address:'Moscow',
                  gval:'11.5',
                  aType:'Non-Commodity',
                  title:'Moscow',
                  descr:'Moscow Airport'              
                },     

                {
              lat:-9.481553000000002, 
              lon:147.190242, 
              address:'Port Moresby',
              gval:'1',
              aType:'Oil',
              title:'Papua New Guinea',
              descr:'Papua New Guinea 123123123'              
            },
            {
           lat:20.5200,
           lon:77.7500,
           address:'Indore',
            gval:'1',
            aType:'Oil',
            title:'Indore, India',
            descr:'Airport India'
        }
    ];

    var myOptions = {
        zoom: 2,
        center: new google.maps.LatLng(51.9000,8.4731),
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    var map = new google.maps.Map(document.getElementById("map"), myOptions);

    var infowindow =  new google.maps.InfoWindow({
        content: ''
    });

    for (i = 0; i < Locations.length; i++) {
            size=15;        
            var img=new google.maps.MarkerImage('marker.png',           
                new google.maps.Size(size, size),
                new google.maps.Point(0,0),
                new google.maps.Point(size/2, size/2)
           );

        var marker = new google.maps.Marker({
            map: map,
            title: Locations[i].title,
            position: new google.maps.LatLng(Locations[i].lat, Locations[i].lon),           
                icon: img
        });

        bindInfoWindow(marker, map, infowindow, "<p>" + Locations[i].descr + "</p>",Locations[i].title);  

    }

}

function bindInfoWindow(marker, map, infowindow, html, Ltitle) { 
    google.maps.event.addListener(marker, 'mouseover', function() {
            infowindow.setContent(html); 
            infowindow.open(map, marker); 

    });
    google.maps.event.addListener(marker, 'mouseout', function() {
        infowindow.close();

    }); 
} 

Повний робочий приклад. Ви можете просто скопіювати, вставити та використовувати.


12

З зразків API Google Map :

function initialize() {
  var myOptions = {
    zoom: 10,
    center: new google.maps.LatLng(-33.9, 151.2),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  var map = new google.maps.Map(document.getElementById("map_canvas"),
                                myOptions);

  setMarkers(map, beaches);
}

/**
 * Data for the markers consisting of a name, a LatLng and a zIndex for
 * the order in which these markers should display on top of each
 * other.
 */
var beaches = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.259302, 1]
];

function setMarkers(map, locations) {
  // Add markers to the map

  // Marker sizes are expressed as a Size of X,Y
  // where the origin of the image (0,0) is located
  // in the top left of the image.

  // Origins, anchor positions and coordinates of the marker
  // increase in the X direction to the right and in
  // the Y direction down.
  var image = new google.maps.MarkerImage('images/beachflag.png',
      // This marker is 20 pixels wide by 32 pixels tall.
      new google.maps.Size(20, 32),
      // The origin for this image is 0,0.
      new google.maps.Point(0,0),
      // The anchor for this image is the base of the flagpole at 0,32.
      new google.maps.Point(0, 32));
  var shadow = new google.maps.MarkerImage('images/beachflag_shadow.png',
      // The shadow image is larger in the horizontal dimension
      // while the position and offset are the same as for the main image.
      new google.maps.Size(37, 32),
      new google.maps.Point(0,0),
      new google.maps.Point(0, 32));
      // Shapes define the clickable region of the icon.
      // The type defines an HTML &lt;area&gt; element 'poly' which
      // traces out a polygon as a series of X,Y points. The final
      // coordinate closes the poly by connecting to the first
      // coordinate.
  var shape = {
      coord: [1, 1, 1, 20, 18, 20, 18 , 1],
      type: 'poly'
  };
  for (var i = 0; i < locations.length; i++) {
    var beach = locations[i];
    var myLatLng = new google.maps.LatLng(beach[1], beach[2]);
    var marker = new google.maps.Marker({
        position: myLatLng,
        map: map,
        shadow: shadow,
        icon: image,
        shape: shape,
        title: beach[0],
        zIndex: beach[3]
    });
  }
}

8
ця відповідь не включає частину
infoWindow

@omat Дивно, що власні документи Google не говорять про те, що має бути частина інформаційного вікна. Але тим не менше це не працює і для мене :(
Еміль Альбак

11

Ось ще одна версія, яку я написав для збереження нерухомості на карті, яка розміщує вказівник infowindow на фактичному lat та long маркера, тимчасово приховуючи маркер під час відображення infowindow.

Це також усуває стандартне призначення маркера та прискорює обробку, безпосередньо присвоюючи новий маркер масиву маркерів під час створення маркерів. Зауважте, що додаткові властивості додані і до маркера, і до вікна інформації, тому такий підхід є нетрадиційним ... але це я!

У цих питаннях щодо інформаційного вікна ніколи не згадується, що стандартне інформаційне вікно НЕ розміщується в lat та lng точки маркера, а у верхній частині зображення маркера. Видимість маркера повинна бути прихованою, щоб це працювало, інакше API Карт знову поверне якір із інформаційним вікном на верхню частину зображення маркера.

Посилання на маркери в масиві 'маркери' створюються негайно після оголошення маркера для будь-яких додаткових завдань обробки, які можуть бути бажані пізніше (приховування / показ, захоплення координат тощо). Це економить додатковий крок присвоєння об’єкта маркера "маркеру", а потім натискання "маркера" на масив маркерів ... багато зайвої обробки в моїй книзі.

У будь-якому випадку, інша вітрина по-іншому, і сподіваємось, вона допоможе вам інформувати та надихати.

    var locations = [
      ['Bondi Beach', -33.890542, 151.274856, 4],
      ['Coogee Beach', -33.923036, 151.259052, 5],
      ['Cronulla Beach', -34.028249, 151.157507, 3],
      ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
      ['Maroubra Beach', -33.950198, 151.259302, 1]
    ];
    var map;
    var markers = [];

    function init(){
      map = new google.maps.Map(document.getElementById('map_canvas'), {
        zoom: 10,
        center: new google.maps.LatLng(-33.92, 151.25),
        mapTypeId: google.maps.MapTypeId.ROADMAP
      });

      var num_markers = locations.length;
      for (var i = 0; i < num_markers; i++) {  
        markers[i] = new google.maps.Marker({
          position: {lat:locations[i][1], lng:locations[i][2]},
          map: map,
          html: locations[i][0],
          id: i,
        });

        google.maps.event.addListener(markers[i], 'click', function(){
          var infowindow = new google.maps.InfoWindow({
            id: this.id,
            content:this.html,
            position:this.getPosition()
          });
          google.maps.event.addListenerOnce(infowindow, 'closeclick', function(){
            markers[this.id].setVisible(true);
          });
          this.setVisible(false);
          infowindow.open(map);
        });
      }
    }

google.maps.event.addDomListener(window, 'load', init);

Ось робоча JSFiddle

Додаткова примітка.
У цих даних прикладу Google ви помітите четверте місце в масиві "location" з номером. Враховуючи це у прикладі, ви також можете використовувати це значення для ідентифікатора маркера замість поточного значення циклу, такого, що ...

var num_markers = locations.length;
for (var i = 0; i < num_markers; i++) {  
  markers[i] = new google.maps.Marker({
    position: {lat:locations[i][1], lng:locations[i][2]},
    map: map,
    html: locations[i][0],
    id: locations[i][3],
  });
};

10

Прийнята відповідь, переписана в ES6:

$(document).ready(() => {
  const mapEl = $('#our_map').get(0); // OR document.getElementById('our_map');

  // Display a map on the page
  const map = new google.maps.Map(mapEl, { mapTypeId: 'roadmap' });

  const buildings = [
    {
      title: 'London Eye, London', 
      coordinates: [51.503454, -0.119562],
      info: 'carousel'
    },
    {
      title: 'Palace of Westminster, London', 
      coordinates: [51.499633, -0.124755],
      info: 'palace'
    }
  ];

  placeBuildingsOnMap(buildings, map);
});


const placeBuildingsOnMap = (buildings, map) => {
  // Loop through our array of buildings & place each one on the map  
  const bounds = new google.maps.LatLngBounds();
  buildings.forEach((building) => {
    const position = { lat: building.coordinates[0], lng: building.coordinates[1] }
    // Stretch our bounds to the newly found marker position
    bounds.extend(position);

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

    const infoWindow = new google.maps.InfoWindow();
    // Allow each marker to have an info window
    google.maps.event.addListener(marker, 'click', () => {
      infoWindow.setContent(building.info);
      infoWindow.open(map, marker);
    })

    // Automatically center the map fitting all markers on the screen
    map.fitBounds(bounds);
  })
})

6

Посилання на джерело

Демонстраційна посилання

Повний HTML-код

  • Показати вікно InfoWlick при натисканні або наведення курсору.
  • Буде показано лише одне інформаційне вікно

введіть тут опис зображення

    <!DOCTYPE html>
    <html>

    <head>
        <style>
            /*  <span class="metadata-marker" style="display: none;" data-region_tag="css"></span>       Set the size of the div element that contains the map */
            #map {
                height: 400px;
                /* The height is 400 pixels */
                width: 100%;
                /* The width is the width of the web page */
            }
        </style>
        <script>
            var map;
            var InforObj = [];
            var centerCords = {
                lat: -25.344,
                lng: 131.036
            };
            var markersOnMap = [{
                    placeName: "Australia (Uluru)",
                    LatLng: [{
                        lat: -25.344,
                        lng: 131.036
                    }]
                },
                {
                    placeName: "Australia (Melbourne)",
                    LatLng: [{
                        lat: -37.852086,
                        lng: 504.985963
                    }]
                },
                {
                    placeName: "Australia (Canberra)",
                    LatLng: [{
                        lat: -35.299085,
                        lng: 509.109615
                    }]
                },
                {
                    placeName: "Australia (Gold Coast)",
                    LatLng: [{
                        lat: -28.013044,
                        lng: 513.425586
                    }]
                },
                {
                    placeName: "Australia (Perth)",
                    LatLng: [{
                        lat: -31.951994,
                        lng: 475.858081
                    }]
                }
            ];

            window.onload = function () {
                initMap();
            };

            function addMarkerInfo() {
                for (var i = 0; i < markersOnMap.length; i++) {
                    var contentString = '<div id="content"><h1>' + markersOnMap[i].placeName +
                        '</h1><p>Lorem ipsum dolor sit amet, vix mutat posse suscipit id, vel ea tantas omittam detraxit.</p></div>';

                    const marker = new google.maps.Marker({
                        position: markersOnMap[i].LatLng[0],
                        map: map
                    });

                    const infowindow = new google.maps.InfoWindow({
                        content: contentString,
                        maxWidth: 200
                    });

                    marker.addListener('click', function () {
                        closeOtherInfo();
                        infowindow.open(marker.get('map'), marker);
                        InforObj[0] = infowindow;
                    });
                    // marker.addListener('mouseover', function () {
                    //     closeOtherInfo();
                    //     infowindow.open(marker.get('map'), marker);
                    //     InforObj[0] = infowindow;
                    // });
                    // marker.addListener('mouseout', function () {
                    //     closeOtherInfo();
                    //     infowindow.close();
                    //     InforObj[0] = infowindow;
                    // });
                }
            }

            function closeOtherInfo() {
                if (InforObj.length > 0) {
                    /* detach the info-window from the marker ... undocumented in the API docs */
                    InforObj[0].set("marker", null);
                    /* and close it */
                    InforObj[0].close();
                    /* blank the array */
                    InforObj.length = 0;
                }
            }

            function initMap() {
                map = new google.maps.Map(document.getElementById('map'), {
                    zoom: 4,
                    center: centerCords
                });
                addMarkerInfo();
            }
        </script>
    </head>

    <body>
        <h3>My Google Maps Demo</h3>
        <!--The div element for the map -->
        <div id="map"></div>

        <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>

    </body>

    </html>

1
Дякую за те closeOtherInfo, що я не зміг знайти гідне рішення для роботи з merkercluster до вашої відповіді. :)
chris loughnane

1
Тепер це те, що я шукав. Людина подяки чудово працює у 2020 році
Faizan Anwer Ali Rupani

5

Додати маркер у свою програму дуже просто. Ви можете просто додати цей код:

var marker = new google.maps.Marker({
  position: myLatLng,
  map: map,
  title: 'Hello World!'
});

Наступні поля є особливо важливими і зазвичай задаються під час створення маркера:

  • position(обов'язково) вказує LatLng, що ідентифікує початкове розташування маркера. Одним із способів отримання LatLng є використання служби геокодування .
  • map(необов'язково) визначає карту, на якій розмістити маркер. Якщо ви не вказали карту побудови маркера, маркер створюється, але не додається до (або відображається на) карті. Ви можете додати маркер пізніше, зателефонувавши до setMap()методу маркера .

Зауважте , у прикладі поле заголовка встановлює назву маркера, який відображатиметься як підказка.

Ви можете ознайомитися з документацією Google api тут .


Це повний приклад встановлення одного маркера на карті. Будьте уважні, вам доведеться замінити YOUR_API_KEYйого ключем API Google :

<!DOCTYPE html>
<html>
<head>
   <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
   <meta charset="utf-8">
   <title>Simple markers</title>
<style>
  /* Always set the map height explicitly to define the size of the div
   * element that contains the map. */
  #map {
    height: 100%;
  }
  /* Optional: Makes the sample page fill the window. */
  html, body {
    height: 100%;
    margin: 0;
    padding: 0;
  }
</style>
</head>
<body>
 <div id="map"></div>
<script>

  function initMap() {
    var myLatLng = {lat: -25.363, lng: 131.044};

    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 4,
      center: myLatLng
    });

    var marker = new google.maps.Marker({
      position: myLatLng,
      map: map,
      title: 'Hello World!'
    });
  }
</script>
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap">
</script>


Тепер, якщо ви хочете побудувати маркери масиву на карті, вам слід зробити так:

var locations = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.259302, 1]
];

function initMap() {
  var myLatLng = {lat: -33.90, lng: 151.16};

  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 10,
    center: myLatLng
    });

  var count;

  for (count = 0; count < locations.length; count++) {  
    new google.maps.Marker({
      position: new google.maps.LatLng(locations[count][1], locations[count][2]),
      map: map,
      title: locations[count][0]
      });
   }
}

Цей приклад дає мені такий результат:

введіть тут опис зображення


Ви також можете додати інформаційне вікно у свою шпильку. Вам просто потрібен цей код:

var marker = new google.maps.Marker({
    position: new google.maps.LatLng(locations[count][1], locations[count][2]),
    map: map
    });

marker.info = new google.maps.InfoWindow({
    content: 'Hello World!'
    });

Ви можете мати документацію Google про infoWindows тут .


Тепер ми можемо відкрити infoWindow, коли маркер "клацне" так:

var marker = new google.maps.Marker({
     position: new google.maps.LatLng(locations[count][1], locations[count][2]),
     map: map
     });

marker.info = new google.maps.InfoWindow({
     content: locations [count][0]
     });


google.maps.event.addListener(marker, 'click', function() {  
    // this = marker
    var marker_map = this.getMap();
    this.info.open(marker_map, this);
    // Note: If you call open() without passing a marker, the InfoWindow will use the position specified upon construction through the InfoWindowOptions object literal.
            });

Зверніть увагу , що ви можете мати деяку документацію Listener тут в розробника Google.


І, нарешті, ми можемо побудувати інфо вікно в маркері, якщо користувач натисне на нього. Це мій повний код:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <title>Info windows</title>
    <style>
    /* Always set the map height explicitly to define the size of the div
    * element that contains the map. */
    #map {
        height: 100%;
    }
    /* Optional: Makes the sample page fill the window. */
    html, body {
        height: 100%;
        margin: 0;
        padding: 0;
    }
    </style>
</head>
<body>
    <div id="map"></div>
    <script>

    var locations = [
        ['Bondi Beach', -33.890542, 151.274856, 4],
        ['Coogee Beach', -33.923036, 151.259052, 5],
        ['Cronulla Beach', -34.028249, 151.157507, 3],
        ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
        ['Maroubra Beach', -33.950198, 151.259302, 1]
    ];


    // When the user clicks the marker, an info window opens.

    function initMap() {
        var myLatLng = {lat: -33.90, lng: 151.16};

        var map = new google.maps.Map(document.getElementById('map'), {
            zoom: 10,
            center: myLatLng
            });

        var count=0;


        for (count = 0; count < locations.length; count++) {  

            var marker = new google.maps.Marker({
                position: new google.maps.LatLng(locations[count][1], locations[count][2]),
                map: map
                });

            marker.info = new google.maps.InfoWindow({
                content: locations [count][0]
                });


            google.maps.event.addListener(marker, 'click', function() {  
                // this = marker
                var marker_map = this.getMap();
                this.info.open(marker_map, this);
                // Note: If you call open() without passing a marker, the InfoWindow will use the position specified upon construction through the InfoWindowOptions object literal.
                });
        }
    }
    </script>
    <script async defer
    src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap">
    </script>
</body>
</html>

Зазвичай ви повинні мати такий результат:

Ваш результат


4

Виходячи з відповіді Daniel Vassallo в , ось версія, яка займається питанням закриття більш простим способом.

Оскільки всі маркери матимуть індивідуальне InfoWindow, а оскільки JavaScript не має значення, якщо ви додаєте до об'єкта додаткові властивості, все, що вам потрібно зробити, - це додати InfoWindow до властивостей маркера, а потім викликати від себе .open()в InfoWindow !

Редагувати: Маючи достатньо даних, завантаження сторінки може зайняти багато часу, тому замість побудови InfoWindow з маркером, побудова повинна відбуватися лише за потреби. Зауважте, що будь-які дані, що використовуються для побудови вікна Info, повинні бути додані до Маркера як властивості ( data). Також зауважте, що після події першого натискання він infoWindowбуде зберігатись як властивість його маркера, тому браузеру не потрібно постійно реконструювати.

var locations = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.259302, 1]
];

var map = new google.maps.Map(document.getElementById('map'), {
  center: new google.maps.LatLng(-33.92, 151.25)
});

for (i = 0; i < locations.length; i++) {  
  marker = new google.maps.Marker({
    position: new google.maps.LatLng(locations[i][1], locations[i][2]),
    map: map,
    data: {
      name: locations[i][0]
    }
  });
  marker.addListener('click', function() {
    if(!this.infoWindow) {
      this.infoWindow = new google.maps.InfoWindow({
        content: this.data.name;
      });
    }
    this.infoWindow.open(map,this);
  })
}

2

Ось майже повний приклад функції javascript, яка дозволить декілька маркерів, визначених у JSONObject.

Він відображатиме лише маркери, які знаходяться в межах карти.

Це важливо, щоб ви не займалися зайвою роботою.

Ви також можете встановити обмеження для маркерів, щоб у вас не було надмірно великої кількості маркерів (якщо є можливість речі у вашому використанні);

він також не відображатиме маркери, якщо центр карти не змінився більше 500 метрів.
Це важливо, оскільки якщо користувач натискає на маркер і випадково перетягує карту, роблячи так, ви не хочете, щоб карта перезавантажувала маркери.

Я приєднав цю функцію до слухача простою події для карти, щоб маркери відображалися лише тоді, коли карта не працює, і знову відображати маркери після іншої події.

У знімку екрана дії незначна зміна екрану екрану, що показує більше вмісту в інформаційному вікні. введіть тут опис зображення вставлено з pastbin.com

<script src="//pastebin.com/embed_js/uWAbRxfg"></script>


0

Ось приклад кількох маркерів у Reactjs .

введіть тут опис зображення

Нижче наведено компонент карти

import React from 'react';
import PropTypes from 'prop-types';
import { Map, InfoWindow, Marker, GoogleApiWrapper } from 'google-maps-react';

const MapContainer = (props) => {
  const [mapConfigurations, setMapConfigurations] = useState({
    showingInfoWindow: false,
    activeMarker: {},
    selectedPlace: {}
  });

  var points = [
    { lat: 42.02, lng: -77.01 },
    { lat: 42.03, lng: -77.02 },
    { lat: 41.03, lng: -77.04 },
    { lat: 42.05, lng: -77.02 }
  ]
  const onMarkerClick = (newProps, marker) => {};

  if (!props.google) {
    return <div>Loading...</div>;
  }

  return (
    <div className="custom-map-container">
      <Map
        style={{
          minWidth: '200px',
          minHeight: '140px',
          width: '100%',
          height: '100%',
          position: 'relative'
        }}
        initialCenter={{
          lat: 42.39,
          lng: -72.52
        }}
        google={props.google}
        zoom={16}
      >
        {points.map(coordinates => (
          <Marker
            position={{ lat: coordinates.lat, lng: coordinates.lng }}
            onClick={onMarkerClick}
            icon={{
              url: 'https://res.cloudinary.com/mybukka/image/upload/c_scale,r_50,w_30,h_30/v1580550858/yaiwq492u1lwuy2lb9ua.png',
            anchor: new google.maps.Point(32, 32), // eslint-disable-line
            scaledSize: new google.maps.Size(30, 30)  // eslint-disable-line
            }}
            name={name}
          />))}
        <InfoWindow
          marker={mapConfigurations.activeMarker}
          visible={mapConfigurations.showingInfoWindow}
        >
          <div>
            <h1>{mapConfigurations.selectedPlace.name}</h1>
          </div>
        </InfoWindow>
      </Map>
    </div>
  );
};

export default GoogleApiWrapper({
  apiKey: process.env.GOOGLE_API_KEY,
  v: '3'
})(MapContainer);

MapContainer.propTypes = {
  google: PropTypes.shape({}).isRequired,
};
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.