谷歌地图标记聚类不适用于缩小

Posted

技术标签:

【中文标题】谷歌地图标记聚类不适用于缩小【英文标题】:Google Map Marker Clustering not Working on zoom out 【发布时间】:2018-11-25 04:29:15 【问题描述】:

我正在尝试在 javascript 中使用 Google 地图标记聚类。我对此很陌生。 场景 我从数据库中获取大量数据,每次调用 10000 个,然后通过将 lat lng 数组发送到标记集群来在谷歌地图上渲染该集合。 我的数据集由 100000 个网点组成。我一次获取 10000 个网点,这被调用了 10 次,因此创建了 10 个 10000 个集群并且它们彼此重叠。当我尝试放大集群时,集群会扩展到更小的集群。 但是在缩小而不是向后聚集时,它们会重叠。 问题 - 需要在缩小时将所有 100000 个网点集中在一个集群中。 或者如果这不可能,那么如何解决重叠问题?

这是代码sn-p

 var mapDiv = document.getElementById('newmap');
 map = new google.maps.Map(mapDiv, 
     center: new google.maps.LatLng(latitude, longitude),
     zoom: 3,
     panControl: true,
     mapTypeControl: true,
     mapTypeControlOptions: 
             style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
     ,
     zoomControl: true,
     zoomControlOptions: 
             position: google.maps.ControlPosition.LEFT_TOP,

     ,
     streetViewControl: true,
     mapTypeId: google.maps.MapTypeId.ROADMAP
 );

 function addMarker1(locations, outletname, outletData) 
     var infoWindow = new google.maps.InfoWindow();
     var markers = locations.map(function(location, i) 
             return new google.maps.Marker(
                     position: location,

             );
     );
     var markerCluster = new MarkerClusterer(map, markers, 
             imagePath: 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'
     );
  

  // this is sending data 10000 each
  for (var i = 0; i < outletDataLen; i++) 
     outletArray.push(outletData[i]['Outletview']['name']);
     j.push(
             lat: parseFloat(outletData[i]['Outletview']['latitude']),
             lng: parseFloat(outletData[i]['Outletview']['longitude'])
     );
     outletname.push(outletData[i]['Outletview']['name']);
  
  addMarker1(j, outletname, outletData);

【问题讨论】:

我不确定,但每次调用“addmarker1”函数时,都会创建一个带有新标记和markerCluster 的新信息窗口,所以最后你将拥有10 个标记簇,我认为它们因此而重叠 最后,实例只有 1 个 infowindow 和 makercluster,在“addMarker1”之外和 addMarker1 内部,重新使用外部声明的... 【参考方案1】:

MarkerCluster 对象中获取标记并将新的Markers 数据与其连接,并将其添加到相同的Markerobject 中,如下所示,同时引用API

var mapDiv = document.getElementById('newmap');
map = new google.maps.Map(mapDiv, 
    center: new google.maps.LatLng(latitude, longitude),
    zoom: 3,
    panControl: true,
    mapTypeControl: true,
    mapTypeControlOptions: 
            style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
    ,
    zoomControl: true,
    zoomControlOptions: 
            position: google.maps.ControlPosition.LEFT_TOP,

    ,
    streetViewControl: true,
    mapTypeId: google.maps.MapTypeId.ROADMAP
);

var markerCluster = new MarkerClusterer(map, [], 
    imagePath: 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'
);

function addMarker1(locations, outletname, outletData) 
    var infoWindow = new google.maps.InfoWindow();
    var markers = locations.map(function(location, i) 
            return new google.maps.Marker(
                    position: location,

            );
    );
    var mapmarkers = markerCluster.getTotalMarkers();
    markers = markers.concat(mapmarkers);
    markerCluster.addMarkers(markers);
    markerCluster.redraw();

// this is sending data 10000 each
for (var i = 0; i < outletDataLen; i++) 
    outletArray.push(outletData[i]['Outletview']['name']);
    j.push(
            lat: parseFloat(outletData[i]['Outletview']['latitude']),
            lng: parseFloat(outletData[i]['Outletview']['longitude'])
    );
    outletname.push(outletData[i]['Outletview']['name']);

addMarker1(j, outletname, outletData);

【讨论】:

您好,感谢您的回复。我以这种方式尝试了解决方案。我声明了一个全局数组。 new_arr=new_arr.concat(标记); markerCluster.addMarkers(new_arr); markerCluster.redraw();。这适用于小数据。但它挂着大量的数据。有没有其他优化方案? 而不是全局数组对象创建全局markerCluster 实例并尝试更新其中的标记。如果您担心数组上concat 方法的性能,请参阅此thread。 嗨,我也试过这个解决方案。页面仍然挂起。我收到错误“网页正在减慢您的浏览器”。此外,这批 10000 个它们现在最初可以一起作为一个单独的集群在开始。但是当我尝试再次放大和缩小时,它们会像以前一样形成一个重叠的集群。 正在发生的问题是,在 concat 上,markercuster 通过添加 10000 形成 10 个补丁,每个补丁是 100000。现在再次放大和缩小事件正在形成 10 个补丁。它没有采用最终的标记数组。如何解决这个问题? var marker1 = locations.map(function(location, i) return new google.maps.Marker ( position: location, ); );var markerCluster = new MarkerClusterer(map, new_arr ,imagePath: 'developers.google.com/maps/documentation/javascript/examples/…'); new_arr=new_arr.concat(markers1); markerCluster.resetViewport(); markerCluster.clearMarkers();markers = []; markerCluster.removeMarker(new_arr); markerCluster.addMarkers(new_arr); markerCluster.redraw();【参考方案2】:

解决方法是在遍历标记之前清除数据 if (markerCluster) markerCluster.clearMarkers(); markerCluster.resetViewport(); markers = []; markerCluster.removeMarker(new_arr);

【讨论】:

以上是关于谷歌地图标记聚类不适用于缩小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xamarin Forms 中实现标记聚类(谷歌地图)

将简单的标记聚类器添加到谷歌地图

带有集群和自定义视图标记的谷歌地图在放大和缩小时滞后太多

谷歌地图风格不适用于韩国地区

底页不适用于谷歌地图

Android 模拟位置不适用于谷歌地图