Leaflet

一個開放原始碼的 JavaScript 函式庫
適用於行動裝置友善的互動式地圖

← 返回部落格文章列表

Leaflet.MarkerCluster 0.1 發佈

這是一篇來自 Dave Leaver 的客座文章,他是 Leaflet 的活躍貢獻者(尤其是,他實作了 0.4 版本縮放動畫的改進),也是目前最佳標記叢集外掛的作者,而這篇文章將介紹這個外掛。

幾乎所有在地圖上標記的人最終都會遇到這些標記重疊的問題。在我在 Smartrak 的日常工作中,我們經常有客戶在地圖上有數千個點。當您縮小時,這些標記都會重疊,使地圖看起來雜亂無章。在某些情況下,即使在最大縮放級別下,標記也會重疊,這使得與它們的互動變得不可能。此外,在地圖上放置大量標記通常會使效能降低到無法接受的程度。

為了改善這一點,許多網站使用標記叢集,這是一種將每個縮放級別上彼此靠近的標記分組在一起的技術。一個很好的例子是 Redfin。我們需要類似的東西,但使用 Leaflet。本著開源的精神,我們開發並發布了我們的解決方案,以便每個人都可以利用它。因此,我們自豪地推出 Leaflet.MarkerCluster

功能

這個叢集器內建了各種很棒的行為

用法

使用標記叢集器很簡單,只需將您現有的 LayerGroup 用法替換為 L.MarkerClusterGroup

var markers = new L.MarkerClusterGroup();

markers.addLayer(L.marker([175.3107, -37.7784]));
// add more markers here...

map.addLayer(markers);

您也可以將所有的 FeatureGroup 事件(以及額外的 clusterclick)用於個別標記和叢集。

markers.on('clusterclick', function (a) { alert('Cluster Clicked'); });
markers.on('click', function (a) { alert('Marker Clicked'); });

最佳實務

取得

您可以在 github 下載頁面下載最新版本。

技術細節

底層叢集演算法(MarkerClusterGroup._cluster)是簡單的貪婪叢集。

foreach marker
    if there is a cluster within the clustering distance, join it.
    else if there is an unclustered marker within the clustering distance, form a cluster with it.

我們針對最大(最底部)縮放級別執行的第一個叢集步驟,然後我們叢集所有產生的標記和叢集,以產生下一個較高的縮放級別,依此類推,直到我們到達頂部。這些叢集儲存在具有良好地理空間品質的樹狀結構中(一個叢集包含其子叢集)。我們使用這棵樹來最佳化識別在任何特定縮放級別下螢幕上的標記和叢集。

L.DistanceGrid

L.DistanceGrid 在叢集時提供了一些不錯的優化(由 Leaflet 維護者 Vladimir 貢獻)。

為了叢集標記,我們需要將每個標記與其他每個標記進行比較,以嘗試形成叢集。為了加快速度,我們需要減少需要比較的標記集。DistanceGrid 的做法是將所有標記放在與我們需要搜尋的距離相同大小的網格上。然後,當尋找要叢集的標記時,我們只需要查看我們所在的網格正方形及其直接鄰近的網格正方形中的標記。這可以帶來很大的效能提升,因為我們只會查看可能形成叢集的標記。(查看初始 PR 以獲取數字

結語

我希望您喜歡使用這個叢集器並從中獲得您想要的一切。如果您在公開網站上使用它,請給我發送電子郵件,以便我可以查看它並可能在 github 網站上連結它。

如果您有任何問題,也請在 github 頁面上記錄錯誤。

祝您使用愉快!
Dave Leaver。