Добавление кластеризатора маркеров на карты Google с циклом for?

Для этой карты Германии я представляю газетные киоски, которые решили бойкотировать листовку ненависти. Свернутая карта с 14 записями пока работает нормально. Но есть некоторые регионы, в которых есть более одного магазина, а на картах Google отображается только один маркер:

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

Я знаю, что на самом деле их больше, и если вы увеличите эти позиции, появятся другие маркеры. Но лучше кластеризация, показывающая количество маркеров, если вокруг этого маркера их больше. Я нашел это на GitHub: Marker Clusterer, но даже в простом примере я не знаю, как добавить эту библиотеку на мою карту. Может быть, я немного запутался с циклом for, чтобы показать маркеры.

Источник моей карты в основном следующий:

<html><head>
<style type="text/css">
      html { height: 100% } body { height: 100%; margin: 0; padding: 0; } a { text-decoration:none; color:#000; } #map_canvas { height: 100% }
    </style>
    <script type="text/javascript"
      src="https://maps.googleapis.com/maps/api/js?key=ACCESSTOKEN&sensor=false">
    </script>
    <script type="text/javascript">
	
	var Orte = [	
	[51.418288,7.339213,"EDEKA Schwalemeyer, Bommerfelder Ring 110, 58452 Witten, Nordrhein-Westfalen. Quelle: http://goo.gl/jQe2Oo"],
	[51.418266,7.342316,"Bonema Trinkhalle & Minishop, Bommerfelder Ring 86, 58452 Witten, Nordrhein-Westfalen. Quelle: http://goo.gl/jQe2Oo"],	
	[51.422492,7.338546,"Kiosk, Auf dem Brenschen 21, 58452 Witten, Nordrhein-Westfalen. Quelle: http://goo.gl/jQe2Oo"],
	[51.415127,7.337124,"Holzofenbäckerei, Elberfelder Straße 11, 58452 Witten, Nordrhein-Westfalen. Quelle: http://goo.gl/jQe2Oo"]
	];
	
	function initialize()
		{ 
		var map = new google.maps.Map(document.getElementById('map_canvas'));
		map.controls[google.maps.ControlPosition.BOTTOM_LEFT].push(legende);		
		var bounds = new google.maps.LatLngBounds();
		var infowindow = new google.maps.InfoWindow();
		var image = {url:"bildfrei.png",size:new google.maps.Size(32,32),};
		
		for (var i in Orte)
			{
				var p = Orte[i];
				var latlng = new google.maps.LatLng(p[0],p[1]);bounds.extend(latlng);         
				var marker = new google.maps.Marker({position:latlng,map:map,title:p[2],icon:image});     
				google.maps.event.addListener(marker, 'click', function() {infowindow.setContent(this.title);infowindow.open(map, this);});
			}		 
		map.fitBounds(bounds);
		}
 
		google.maps.event.addDomListener(window, 'load', initialize); 	 
	 
    </script>    
</head>  
<body onload="initialize()">
<div id="map_canvas" style="width:100%; height:100%"></div>    
  </body>
</html>  

Я уже пытался добавить markerclusterer_compiled.js и var markerCluster = new MarkerClusterer(map, markers); и markerCluster ниже var map = new google.maps.Map(document.getElementById('map_canvas'));... но безуспешно.

Может ли кто-нибудь помочь мне? :-)

ОБНОВЛЕНИЕ: версия с кластеризатором js-библиотеки:

    <html><head>
    <style type="text/css">
          html { height: 100% } body { height: 100%; margin: 0; padding: 0; } a { text-decoration:none; color:#000; } #map-container { padding: 6px; border-width: 1px; border-style: solid;border-color: #ccc #ccc #999 #ccc;-webkit-box-shadow: rgba(64, 64, 64, 0.5) 0 2px 5px;-moz-box-shadow: rgba(64, 64, 64, 0.5) 0 2px 5px; box-shadow: rgba(64, 64, 64, 0.1) 0 2px 5px;  width: 600px; } #map_canvas { height: 100% }
        </style>
        <script type="text/javascript"
          src="https://maps.googleapis.com/maps/api/js?key=ACCESSTOKEN&sensor=false">
<script>
      var script = '<script type="text/javascript" src="markerclusterer';
      if (document.location.search.indexOf('compiled') !== -1) {
        script += '_compiled';
      }
      script += '.js"><' + '/script>';
      document.write(script);
    </script>
        </script>
        <script type="text/javascript">
    	
    	var Orte = [	
    	[51.418288,7.339213,"EDEKA Schwalemeyer, Bommerfelder Ring 110, 58452 Witten, Nordrhein-Westfalen. Quelle: http://goo.gl/jQe2Oo"],
    	[51.418266,7.342316,"Bonema Trinkhalle & Minishop, Bommerfelder Ring 86, 58452 Witten, Nordrhein-Westfalen. Quelle: http://goo.gl/jQe2Oo"],	
    	[51.422492,7.338546,"Kiosk, Auf dem Brenschen 21, 58452 Witten, Nordrhein-Westfalen. Quelle: http://goo.gl/jQe2Oo"],
    	[51.415127,7.337124,"Holzofenbäckerei, Elberfelder Straße 11, 58452 Witten, Nordrhein-Westfalen. Quelle: http://goo.gl/jQe2Oo"]
    	];
    	
    	function initialize()
    		{ 
    		var map = new google.maps.Map(document.getElementById('map_canvas'));
    		var markerCluster = new MarkerClusterer(map, marker);    
    		map.controls[google.maps.ControlPosition.BOTTOM_LEFT].push(legende);		
    		var bounds = new google.maps.LatLngBounds();
    		var infowindow = new google.maps.InfoWindow();
    		var image = {url:"bildfrei.png",size:new google.maps.Size(32,32),};
    		
    		for (var i in Orte)
    			{
    				var p = Orte[i];
    				var latlng = new google.maps.LatLng(p[0],p[1]);bounds.extend(latlng);         
    				var marker = new google.maps.Marker({position:latlng,map:map,title:p[2],icon:image});     
    				google.maps.event.addListener(marker, 'click', function() {infowindow.setContent(this.title);infowindow.open(map, this);});
    			}		 
    		map.fitBounds(bounds);
    		}
     
    		google.maps.event.addDomListener(window, 'load', initialize); 	 
    	 
        </script>    
    </head>  
    <body onload="initialize()">
    <div id="map-container">
    <div id="map_canvas" style="width:100%; height:100%"></div>    
    </div>  
      </body>
    </html>  


person Sebastian    schedule 03.04.2015    source источник
comment
Как выглядит код, в котором вы пытались добавить markerclusterer? Вы смотрели на любой из подобных вопросов на SO?   -  person geocodezip    schedule 03.04.2015
comment
@geocodezip Я обновил пост выше.   -  person Sebastian    schedule 04.04.2015
comment
Я получаю ошибку JavaScript с опубликованным кодом: Uncaught ReferenceError: legende is not defined   -  person geocodezip    schedule 04.04.2015


Ответы (1)


Ваши маркеры не кластеризуются, потому что вы никогда не добавляете их в MarkerClusterer. Один из способов исправить это — добавлять их по мере создания:

for (var i in Orte) {
    var p = Orte[i];
    var latlng = new google.maps.LatLng(p[0], p[1]);
    bounds.extend(latlng);
    var marker = new google.maps.Marker({
        position: latlng,
        map: map,
        title: p[2],
        icon: image
    });
    markerCluster.addMarker(marker);
    google.maps.event.addListener(marker, 'click', function () {
        infowindow.setContent(this.title);
        infowindow.open(map, this);
    });
}

рабочая скрипта

фрагмент кода:

var Orte = [
  [51.418288, 7.339213, "EDEKA Schwalemeyer, Bommerfelder Ring 110, 58452 Witten, Nordrhein-Westfalen. Quelle: http://goo.gl/jQe2Oo"],
  [51.418266, 7.342316, "Bonema Trinkhalle & Minishop, Bommerfelder Ring 86, 58452 Witten, Nordrhein-Westfalen. Quelle: http://goo.gl/jQe2Oo"],
  [51.422492, 7.338546, "Kiosk, Auf dem Brenschen 21, 58452 Witten, Nordrhein-Westfalen. Quelle: http://goo.gl/jQe2Oo"],
  [51.415127, 7.337124, "Holzofenbäckerei, Elberfelder Straße 11, 58452 Witten, Nordrhein-Westfalen. Quelle: http://goo.gl/jQe2Oo"]
];

function initialize() {
  var map = new google.maps.Map(document.getElementById('map_canvas'));
  var markerCluster = new MarkerClusterer(map, marker);
  // map.controls[google.maps.ControlPosition.BOTTOM_LEFT].push(legende);
  var bounds = new google.maps.LatLngBounds();
  var infowindow = new google.maps.InfoWindow();
  var image = {
    url: "bildfrei.png",
    size: new google.maps.Size(32, 32),
  };

  for (var i in Orte) {
    var p = Orte[i];
    var latlng = new google.maps.LatLng(p[0], p[1]);
    bounds.extend(latlng);
    var marker = new google.maps.Marker({
      position: latlng,
      map: map,
      title: p[2]
        /*,
                    icon: image */
    });
    markerCluster.addMarker(marker);
    google.maps.event.addListener(marker, 'click', function() {
      infowindow.setContent(this.title);
      infowindow.open(map, this);
    });
  }
  map.fitBounds(bounds);
  google.maps.event.addListenerOnce(map, 'bounds_changed', function() {
    var newZoom = map.getZoom() - 2;
    map.setZoom(newZoom);
  });
}

google.maps.event.addDomListener(window, 'load', initialize);
html {
  height: 100%
}
body {
  height: 100%;
  margin: 0;
  padding: 0;
}
a {
  text-decoration: none;
  color: #000;
}
#map-container {
  padding: 6px;
  border-width: 1px;
  border-style: solid;
  border-color: #ccc #ccc #999 #ccc;
  -webkit-box-shadow: rgba(64, 64, 64, 0.5) 0 2px 5px;
  -moz-box-shadow: rgba(64, 64, 64, 0.5) 0 2px 5px;
  box-shadow: rgba(64, 64, 64, 0.1) 0 2px 5px;
  width: 600px;
  height: 100%;
}
#map_canvas {
  height: 100%
}
<script src="https://maps.googleapis.com/maps/api/js"></script>
<script src="https://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclustererplus/src/markerclusterer.js"></script>
<div id="map-container">
  <div id="map_canvas" style="width:100%; height:100%"></div>
</div>

person geocodezip    schedule 04.04.2015
comment
Потрясающий! Большое тебе спасибо! :-) - person Sebastian; 05.04.2015