4

我有一张有很多标记的地图。所有这些标记都有一个InfoWindow。 使用Markers集群库(http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/src/markerclusterer.js),我可以获得单击时放大的集群。
某些标记具有完全相同的坐标,因此即使在达到最大变焦时它们也会变为一个簇。到目前为止,这一切都很好,除了我想在打开一个InfoWindow时单击群集时缩放时从不分割成标记。在这个InfoWindow中,我想根据它包含的标记显示信息。Google Maps InfoWindow on Clusters

这是我的代码到目前为止。它在InfoMark上可以正常工作,但在点击群集时不会显示InfoWindow。

function initialize(lat, lng) { 
    var myLatlng = new google.maps.LatLng(lat,lng); 
    var mapOptions = { 
     mapTypeControl: false, 
     center: myLatlng, 
     zoom: 14, 
     maxZonn:15 
    }; 

    map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); 

    google.maps.event.addListener(map, 'idle', function() { 
     getMarkers(map.getBounds()); 

    }); 

}; 

function getMarkers(bounds){ 
    var filter = build_filter(); 
    var bounds = { 
     'swlat':bounds.getSouthWest().lat(), 
     'swlng':bounds.getSouthWest().lng(), 
     'nelat':bounds.getNorthEast().lat(), 
     'nelng':bounds.getNorthEast().lng() 
    }; 

    data = { 
     'bounds': bounds 
    } 


$.ajax({ 
    type: "POST", 
    dataType: 'json', 
    async: false, 
    url: "<?=$x_url;?>", 
    data: data, 
    cache: true, 
    success: function (json) { 
     addMarkers2Map(json); 

    } 
    }); 
}  


function addMarkers2Map(data){ 

    $('#properties_counter').html(data.length); 
    var markers = []; 
    for (var i = 0; i < data.length; ++i) { 
     // set the marker position 
     var latLng = new google.maps.LatLng(data[i].lat, data[i].lng); 
     console.log(data[i].lat); 


     // drop the marker 
     var marker = new MarkerWithLabel({ 
      position: latLng, 
      map: map, 
      labelContent: data[i].price, 
      labelAnchor: new google.maps.Point(27, 35), 
      title: data[i].title, 
      labelClass: "map-markers", 
      zIndex: i 
      // icon: ' ' 

     }); 

     markers.push(marker); 

     var infowindow = null; 
     buildInfoWindow(marker,map,data[i], i); 

    } 

    var markerCluster = new MarkerClusterer(map, markers); 

    google.maps.event.addListener(markerCluster, 'click', function() { 

      infowindow.open(map,markerCluster); 

    }); 
} 

function buildInfoWindow(marker, map, data, index){ 
    var strVar=""; 
    strVar += "<img src=\""+data.main_photo+"\"><br>"; 
    strVar += data.name+"<\/i>&nbsp;|&nbsp;"+data.age+"&nbsp;<i class=\"fa fa-prp\"><\/i>&nbsp;|&nbsp;"+data.gender+"&nbsp;<i class=\"fa fa-check\"><\/i>"; 
    strVar += "<div class=\"avatar-list\">"; 
    strVar += "<a href=\""+data.link+"\"><img class=\"avatar-photo-list\" src=\""+data.picture+"\"><\/a>"; 
    strVar += "<\/div>"; 
    strVar += "<div class=\"adress2\">"+data.city+"<\/div>"; 
    strVar += "<\/a>"; 

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

    google.maps.event.addListener(marker, 'click', function() { 
     infowindow.open(map,marker); 
    }); 
} 

我该如何做到这一点?

+0

请提供证明此问题的[最小,完整,测试和可读示例](http://stackoverflow.com/help/mcve)。您可能需要查看[MarkerClustererPlus](http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclustererplus/) – geocodezip

回答

0

我最终解决这个问题这样,加入以下代码:

var clusterOptions = { 
    zoomOnClick: false 
} 

markerCluster = new MarkerClusterer(map, markers, clusterOptions); 

google.maps.event.addListener(markerCluster, 'clusterclick', function(cluster) { 
if (map.getZoom() < map.maxZoom){ 

    map.setCenter(cluster.center_); 

    map.setZoom(map.getZoom() + 2); 
} else { 

    var content = ''; 
    // Convert the coordinates to an MVCObject 
    var info = new google.maps.MVCObject; 
    info.set('position', cluster.center_); 
    //Get markers 
    var marks_in_cluster = cluster.getMarkers(); 

    console.log(marks_in_cluster); 

    for (var z = 0; z < marks_in_cluster.length; z++) { 
     content = makeClusterInfo(marks_in_cluster,z); 
    } 

    infowindow.close(); // closes previous open ifowindows 
    infowindow.setContent(content); 
    infowindow.open(map, info); 
    google.maps.event.addListener(map, 'zoom_changed', function() { 
     infowindow.close() 
    }); 
    } 
}); 
7

将一个“clusterclick”侦听器添加到MarkerClusterer,当该事件被触发时打开infowindow。

proof of concept fiddle

代码片段:

var gm_map; 
 
var markerArray = []; 
 
var infoWindow = new google.maps.InfoWindow(); 
 

 
function initialize() { 
 
    var marker, i; 
 

 
    var options_googlemaps = { 
 
    minZoom: 4, 
 
    zoom: 18, 
 
    center: new google.maps.LatLng(59.328631, 13.485688), 
 
    maxZoom: 18, 
 
    mapTypeId: google.maps.MapTypeId.ROADMAP, 
 
    streetViewControl: false 
 
    } 
 

 
    gm_map = new google.maps.Map(document.getElementById('google-maps'), options_googlemaps); 
 

 

 
    var options_markerclusterer = { 
 
    gridSize: 20, 
 
    maxZoom: 18, 
 
    zoomOnClick: false, 
 
    imagePath: 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m' 
 
    }; 
 

 

 

 
    var markerCluster = new MarkerClusterer(gm_map, clusterMarkers, options_markerclusterer); 
 

 
    google.maps.event.addListener(markerCluster, 'clusterclick', function(cluster) { 
 

 
    var markers = cluster.getMarkers(); 
 

 
    var array = []; 
 
    var num = 0; 
 

 
    for (i = 0; i < markers.length; i++) { 
 

 
     num++; 
 
     array.push(markers[i].getTitle() + '<br>'); 
 
    } 
 
    if (gm_map.getZoom() <= markerCluster.getMaxZoom()) { 
 
     infoWindow.setContent(markers.length + " markers<br>" + array); 
 
     infoWindow.setPosition(cluster.getCenter()); 
 
     infoWindow.open(gm_map); 
 
    } 
 
    }); 
 

 
    for (i = 0; i < clusterMarkers.length; i++) { 
 
    var marker = clusterMarkers[i]; 
 

 
    google.maps.event.addListener(marker, 'click', (function(marker) { 
 
     return function() { 
 
     infoWindow.setContent(this.getTitle()); 
 
     infoWindow.open(gm_map, this); 
 
     } 
 
    })(marker)); 
 
    } 
 
} 
 

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

 
var clusterMarkers = [ 
 
    new google.maps.Marker({ 
 
    position: new google.maps.LatLng(59.381059, 13.504026), 
 
    map: gm_map, 
 
    title: "P1220214 1.JPG" 
 
    }), 
 

 
    new google.maps.Marker({ 
 
    position: new google.maps.LatLng(59.338683, 13.492057), 
 
    map: gm_map, 
 
    title: "P1220214 2.JPG" 
 
    }), 
 

 
    new google.maps.Marker({ 
 
    position: new google.maps.LatLng(59.340715, 13.49631), 
 
    map: gm_map, 
 
    title: "P1220214 3.JPG" 
 
    }), 
 

 
    new google.maps.Marker({ 
 
    position: new google.maps.LatLng(59.327232, 13.487384), 
 
    map: gm_map, 
 
    title: "P1220214 4.JPG" 
 
    }), 
 

 
    new google.maps.Marker({ 
 
    position: new google.maps.LatLng(59.379034, 13.516566), 
 
    map: gm_map, 
 
    title: "P1220214 5.JPG" 
 
    }), 
 

 
    new google.maps.Marker({ 
 
    position: new google.maps.LatLng(59.328631, 13.485688), 
 
    map: gm_map, 
 
    title: "P1220214 6.JPG" 
 
    }), 
 

 
    new google.maps.Marker({ 
 
    position: new google.maps.LatLng(59.328657, 13.485591), 
 
    map: gm_map, 
 
    title: "P1220214 7.JPG" 
 
    }), 
 

 
    new google.maps.Marker({ 
 
    position: new google.maps.LatLng(59.328501, 13.485782), 
 
    map: gm_map, 
 
    title: "P1220214 8.JPG" 
 
    }) 
 
]
.photo-map { 
 
    background-color: #222222; 
 
    height: 500px; 
 
    width: 100%; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://maps.googleapis.com/maps/api/js"></script> 
 
<script src="https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/markerclusterer.js"></script> 
 

 
<div class="photo-map" id="google-maps"></div>

+0

感谢您的分享。 这工作,但实际上并没有解决我的问题。 我仍然需要能够在每个群集的infowindow中缩放和显示不同的内容。在你的情况下,它显示信息窗口。 我想出了一个解决方案,我分享作为答复。 – BeoWulf

+0

您的代码正是我正在寻找的内容,但无论我做什么,我都无法获得'clusterclick'。你需要添加一个特殊的.js库来获得该功能吗? – Valachio