首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

百度地圖 API:MarkerClusterer 點聚合後自訂 Label 與 InfoWindow 不顯示怎麼辦?

     編輯:程式設計綜合問答

問題現象

使用 MarkerClusterer 進行點聚合,聚合後的叢集標記(Cluster Marker)沒有原本 Marker 的 Label 與 InfoWindow,彷彿被新 Marker 覆蓋。

原因

MarkerClusterer 內部會建立自己的 Marker 代表叢集,**不會自動繼承原始 Marker 的事件與屬性**。

解決方案:自訂 Cluster Marker 渲染

  1. 實作 MarkerClusterer.Renderer 介面(或繼承預設渲染器)。
  2. 在 render(cluster) 方法中,根據叢集內的原始 Marker 資料,建立自訂 Marker 並綁定 Label/InfoWindow。

關鍵程式碼片段

var clusterer = new BMapLib.MarkerClusterer(map, {
    renderer: {
        render: function(cluster) {
            var count = cluster.getSize();
            var markers = cluster.getMarkers();
            // 取第一個 marker 的資料作為代表(或自行彙總)
            var first = markers[0];
            var labelContent = first.getLabel().content;
            var infoContent = first.getInfoWindow().getContent();

            var mk = new BMap.Marker(cluster.getCenter());
            var label = new BMap.Label(labelContent, { offset: new BMap.Size(10, 0) });
            mk.setLabel(label);

            var infoWin = new BMap.InfoWindow(infoContent);
            mk.addEventListener("click", function() {
                this.openInfoWindow(infoWin);
            });
            return mk;
        }
    }
});

替代方案:不使用聚合器,自行實作縮放等級判斷

  • 監聽 zoomend 事件。
  • 縮放小時顯示叢集數量標記;放大時顯示原始 Marker。
  • 彈性較高,但需自行管理效能。

注意

百度地圖 JS API 版本差異大,請參考對應版本文件的 MarkerClusterer 選項與事件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved