Google Maps JS API v3 - Basit Çoklu İşaretleyici Örneği


657

Google Maps Api için oldukça yeni. Bir harita üzerinde dolaşmak ve çizim yapmak istediğim bir dizi veri var. Oldukça basit görünüyor, ancak bulduğum tüm çok markalı öğreticiler oldukça karmaşık.

Örnek olarak google'ın sitesindeki veri dizisini kullanalım:

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]
];

Sadece tüm bu noktaları çizmek ve adı görüntülemek için tıklandığında bir infoWindow açılır.

Yanıtlar:


1128

Bu onu en aza indirebileceğim en basit şey:

<!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 üzerinde düzenleme / çatal →

EKRAN GÖRÜNTÜSÜ

Google Haritalar Çoklu İşaretçileri

Geri çağrı argümanını addListeneryönteme geçirirken bir miktar kapanma büyüsü oluyor . Kapakların nasıl çalıştığını bilmiyorsanız, bu oldukça zor bir konu olabilir. Durum buysa, kısa bir tanıtım için aşağıdaki Mozilla makalesine göz atmanızı öneririm:

İlla Mozilla Dev Center: Kapaklarla Çalışma


4
@RaphaelDDL: Evet, isimsiz işlevi gerçekten çağırmak için bu parantez gereklidir. Bağımsız değişkenlerin JavaScript'in çalışması nedeniyle (kapatmalar nedeniyle) iletilmesi gerekir. Bir örnek ve daha fazla bilgi için bu soruya verdiğim cevaba bakın: stackoverflow.com/a/2670420/222908
Daniel Vassallo

İyi cevap, ama daha da basitleştirilebilir. Tüm işaretçilerin tek tek InfoWindow'ları olacağından ve JavaScript bir nesneye ekstra özellikler ekleyip eklemediğinizi umursamadığından, tek yapmanız gereken Marker'in InfoWindowözelliklerine bir ekleme yapmak .open()ve InfoWindow'da kendisinden çağırmaktır. Değişikliği buraya gönderirdim, ancak değişiklikler kendi cevabımı gönderdiğim kadar büyüktü .
Matthew Cordaro

Neden new MarkerClusterer()büyük performans büstü için kullanılmıyor? ChirsSwires yanıtını kontrol edin.
DevWL

merhaba Daniel Vassallo, ben de iyonik açısal projemde birden fazla belirteç görüntüleme aynı requiremnt var. lütfen bana yardım et, zaten stackoverflow hakkında bir soru sordum. İşte soru bağlantısı: stackoverflow.com/questions/57985967/…
Saif

İşe yarıyor. Teşekkürler. Tek bir işaretleyici örneği kullandığınız ve döngüde başlattığınız için işaretçileri google haritadan nasıl kaldıracaksınız. Lütfen düşüncelerinizi paylaşın.
Kamlesh

59

Aşağıda, benzersiz titleve infoWindowmetin içeren çok sayıda işaretleyicinin başka bir örneği verilmiştir . En son google maps API V3.11 ile test edildi.

<!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 Marker Ekran Görüntüsü:

Birden Çok İşaretleyicili Google Maps API V3.11

Lat / Lng'yi benzersiz hale getirmek için otomatik olarak rastgele seçer. 500, 1000, xxx işaretleyicilerini ve performansını test etmek istiyorsanız bu örnek çok yardımcı olacaktır.


1
Birden fazla soruya kopyala ve yapıştır levhası / kelimesi kelimesine yanıtlar gönderirken dikkatli olun, bunlar topluluk tarafından "spam" olarak işaretlenir. Bunu yapıyorsanız, bu genellikle soruların kopya olduğu anlamına gelir, bu yüzden onları böyle işaretleyin.
Kev

1
Bu, infoWindowher bir işaretçi için birçok açılır ve infoWindowşu anda gösteriliyorsa diğerini gizlemez . gerçekten yararlı :)
Kannika

@Anup, sadece soruyu okuyup yorum yaparsanız daha iyi olur. soru, rastgele veya kendi bla bla'nizin "çoklu markör için örnek" sorusunu soruyor.
Madan Sapkota

Yine neden new MarkerClusterer()büyük performans büstü için kullanılmıyor? ChirsSwires yanıtını kontrol edin.
DevWL

1
@DevWL, 2013 yılında yanıtlandı. Güncellemekte özgürsünüz.
Madan Sapkota

39

Google Maps API'larını kullanmaya başlayanlar için popüler bir açılış noktası gibi göründüğünü buraya koyacağımı düşündüm. İstemci tarafında işlenen çoklu işaretçiler muhtemelen birçok harita uygulamasının performans açısından düşmesidir. Kıyaslamak, düzeltmek ve hatta bazı durumlarda bir sorun oluşturmak zordur (tarayıcı uygulama farklılıkları, istemcinin kullanabileceği donanım, mobil cihazlar, liste devam eder).

Bu sorunu gidermeye başlamanın en basit yolu bir işaretçi kümeleme çözümü kullanmaktır. Temel fikir, coğrafi olarak benzer yerleri görüntülenen nokta sayısı olan bir grupta gruplandırmaktır. Kullanıcı haritayı yakınlaştırdıkça, bu gruplar alttaki bireysel işaretleri göstermek için genişler.

Belki de uygulanması en basit olanı markerclusterer kütüphanesidir. Temel bir uygulama aşağıdaki gibi olacaktır (kütüphane ithalatından sonra):

<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>

Doğrudan haritaya eklemek yerine işaretçiler bir diziye eklenir. Bu dizi daha sonra sizin için karmaşık hesaplamayı işleyen ve haritaya eklenmiş olan kütüphaneye aktarılır.

Bu uygulamalar yalnızca istemci tarafı performansını büyük ölçüde arttırmakla kalmaz, aynı zamanda birçok durumda daha basit ve daha az karmaşık bir kullanıcı arayüzüne ve daha büyük ölçeklerde verilerin daha kolay sindirilmesine yol açar.

Diğer uygulamalar Google'dan edinilebilir.

Umarım bu haritalama nüanslarına daha yeni olanlardan bazılarına yardımcı olur.


2
Teşekkürler, büyük bir yardım! Önce google.map veri noktalarını işaretleyip ardından harita kütüphanesine ileterek, bu durumda MarketCluster'ı çizmek için bir sipariş veya büyüklük farkı vardır. yaklaşık 150.000 veri noktası ile 'Daniel Vassallo' nun ilk gönderisinin yüklenmesi yaklaşık 2 dakika sürdü, bu 5 saniye. Bir demet 'Swires' teşekkürler!
Waqas

1
Bunun bunun için iyi bir yer olacağını düşündüm, çoğu insanın Google haritaları ile ilgili olduğunda ilk önce yığına inişini hayal ediyorum ve ikincisi 'haritamın yüklenmesi neden bu kadar uzun sürüyor'.
ChrisSwires

@Monic, veri kümeniz ne olursa olsun, yalnızca yer tutucu bir değişkendir.
ChrisSwires

20

Eşzamansız sürüm:

<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

Bu, çalışan örnek harita görüntüsüdür

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();

    }); 
} 

Tam çalışma örneği. Sadece kopyalayabilir, yapıştırabilir ve kullanabilirsiniz.


12

Gönderen Google Harita API örneklerinin :

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
Bu cevap infoWindow bölümünü içermez
onurmatik

@omat Garip bir şekilde Google'ın kendi dokümanları bir infoWindow parçası olması gerektiğini önermez. Ama yine de benim için çalışmıyor :(
Emil Ahlbäck

11

Harita gayrimenkulünü kaydetmek için yazdığım, infowindow göstergesini işaretleyiciyi geçici olarak gizlerken, infowindow işaretçisini gerçek işaretçiye ve uzunluğa yerleştiren başka bir sürüm .

Ayrıca standart 'işaretleyici' atamasını ortadan kaldırır ve işaretleyicilerin oluşturulduğu yerdeki işaretleyici dizisine doğrudan yeni işaretleyici atayarak işlemeyi hızlandırır. Ancak, hem işaretçiye hem de içeriye ek özelliklerin eklendiğini unutmayın, bu nedenle bu yaklaşım biraz alışılmadık ... ama bu benim!

Bu infowindow sorularında hiçbir zaman standart infowindow'dan bahsedilmemiştir. işaretleme noktasının lat ve DEĞİL , daha ziyade işaretçi görüntüsünün üstüne yerleştirilmediğinden bahsedilmemiştir. İşaretçi görünürlüğü bunun çalışması için gizlenmelidir, aksi takdirde Haritalar API'sı bilgi penceresi çapasını işaretçi görüntüsünün üstüne geri iter.

'Markers' dizisindeki markörlere referans, daha sonra istenebilecek ek işleme görevleri için (gizleme / gösterme, koordinatları yakalama, vb.) İşaretleyici beyanından hemen sonra yaratılır. Bu, işaretleyici nesnesini 'işaretleyiciye' atamanın ve ardından 'işaretleyiciyi' işaretleyicilerin dizisine itmenin ek adımını kaydeder ... kitabımda çok fazla gereksiz işlem.

Her neyse, farklı bir bilgi alanlarını ele alalım ve umarım sizi bilgilendirmeye ve ilham vermeye yardımcı olur.

    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);

İşte çalışan bir JSFiddle

Ek Not
Bu verilen Google örnek verilerinde, 'konumlar' dizisinde bir sayı ile dördüncü sırada olduğunu göreceksiniz. Örnekte bu göz önüne alındığında, geçerli döngü değeri yerine işaretçi kimliği için bu değeri de kullanabilirsiniz, böylece ...

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

Kabul edilen cevap, ES6'da yeniden yazılmıştır:

$(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

Kaynak Bağlantı

Demo Bağlantısı

Tam HTML kodu

  • Tıklama veya Fareyle üzerine gelindiğinde InfoWindow'u göster.
  • Yalnızca bir InfoWindow gösterilecek

resim açıklamasını buraya girin

    <!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
Teşekkür ederim closeOtherInfo, cevabınıza kadar merkercluster ile çalışmak için iyi bir çözüm bulamadım. :)
chris loughnane

1
Şimdi aradığım şey buydu. Teşekkürler 2020'de harika çalışıyor
Faizan Anwer Ali Rupani

5

Programınıza bir işaretleyici eklemek çok kolaydır. Sadece bu kodu ekleyebilirsiniz:

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

Aşağıdaki alanlar özellikle önemlidir ve bir işaretleyici oluştururken yaygın olarak ayarlanır:

  • position(zorunlu), işaretçinin başlangıç ​​konumunu tanımlayan bir LatLng belirtir. LatLng almanın bir yolu, Geocoding hizmetini kullanmaktır .
  • map(isteğe bağlı), işaretçinin yerleştirileceği Haritayı belirtir. İşaretçinin yapımında bir harita belirtmezseniz, işaretçi oluşturulur ancak haritaya eklenmez (veya haritada gösterilmez). İşaretçiyi daha sonra işaretleyiciyi arayarak ekleyebilirsiniz.setMap() yöntemini .

Not örnekte, başlık alanı bir araç ipucu olarak görünecektir işaretin başlığını ayarlayın.

Google api dokümantasyonuna buradan başvurabilirsiniz. .


Bu, haritada bir işaretleyici ayarlamak için eksiksiz bir örnektir . Dikkatli olun YOUR_API_KEY, google API anahtarınızla değiştirmeniz gerekir :

<!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>


Şimdi, bir dizinin işaretlerini bir haritaya çizmek istiyorsanız, bunu yapmanız gerekir:

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]
      });
   }
}

Bu örnek bana şu sonucu verir:

resim açıklamasını buraya girin


Ayrıca, raptiyenize bir infoWindow ekleyebilirsiniz. Sadece bu koda ihtiyacınız var:

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'ın infoWindows hakkındaki dokümanlarına buradan ulaşabilirsiniz. .


Şimdi, marker "clik" olduğunda infoWindow'u açabiliyoruz:

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.
            });

Burada hakkında bazı belgelere sahip olabileceğinizi unutmayınListener Google geliştiricisinde .


Ve son olarak, kullanıcı üzerine tıklarsa infoWindow'u bir işaretleyiciye çizebiliriz. Bu tam kodum:

<!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>

Normalde şu sonucu almalısınız:

Senin sonucun


4

Aşağıdaki Daniel Vassallo cevabı , burada bir versiyonu olduğunu daha basit bir şekilde kapatma konuyla ilgilenir.

Tüm belirteçler beri bu yana bireysel olacaktır InfoWindow ve bir nesneye fazladan özellikler eklerseniz JavaScript beri umursamıyor, yapmanız gereken tek şey bir ekleme olduğu InfoWindow için Marker özellikleri ve ardından çağrı .open()üzerine infowindow kendisinden!

Düzenleme: Yeterli veri ile, sayfa yükleme çok zaman alabilir, bu yüzden InfoWindow marker ile inşa etmek yerine , inşaat sadece gerektiğinde gerçekleşmelidir. InfoWindow'u oluşturmak için kullanılan tüm verilerin İşaretçiye özellik ( data) olarak eklenmesi gerektiğini unutmayın . Ayrıca, ilk tıklama etkinliğinden sonra, infoWindowtarayıcının sürekli olarak yeniden yapılandırılması gerekmediğinden, işaretçisinin bir özelliği olarak devam edeceğini unutmayın .

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

Aşağıda, bir JSONObject öğesinde tanımlanan birden çok işaretleyiciye izin veren neredeyse eksiksiz bir örnek javascript işlevi verilmiştir.

Yalnızca haritanın sınırları içinde bulunan işaretleri görüntüler.

Bu önemlidir, bu yüzden fazladan iş yapmazsınız.

İşaretçiler için de bir sınır belirleyebilirsiniz, böylece aşırı miktarda işaretçi göstermezsiniz (kullanımınızda bir şey varsa);

haritanın merkezi 500 metreden fazla değişmediyse de işaretler göstermez.
Bu önemlidir çünkü bir kullanıcı işaretçiyi tıklar ve yanlışlıkla haritayı sürüklerse, haritanın işaretçileri yeniden yüklemesini istemezsiniz.

Bu işlevi harita için boşta kalan olay dinleyicisine ekledim, böylece işaretçiler yalnızca harita boştayken gösterilecek ve farklı bir olaydan sonra işaretleri yeniden görüntüleyecektir.

Aksiyon ekran görüntüsünde, ekran görüntüsünde, içeriğinde daha fazla içerik gösteren küçük bir değişiklik var. resim açıklamasını buraya girin pastbin.com'dan yapıştırıldı

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


0

İşte Reactjs'deki çoklu işaretleyicilere bir örnek .

resim açıklamasını buraya girin

Harita bileşeni aşağıda

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,
};
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.