介紹
專門支援資料與渲染器的動態更新,調用 new mapPlus.DynamicCluster(options),開始使用動態叢集圖。
DynamicCluster 是一個專為動態更新資料與渲染器而設計的 API。
其核心邏輯以每個渲染器對應的唯一識別符 key 作為更新的基準點,從而精準檢測新舊資料的差異,並僅對變更部分進行處理,而非重新渲染所有資料,以提升叢集圖的性能。
開始使用
調用 new mapPlus.DynamicCluster(options),開始使用地圖動態叢集。
-
options
(object): 必填,動態叢集的參數。參數 描述 options.data object[]選填,動態叢集的資料,可搭配 options.markerRenderer進行使用。options.markerRenderer function選填,渲染地標的回調函式,回調函式中需回傳 地標參數 與不重複 key值。未填則使用options.data中的資料。`options.styles object選填,叢集圖的樣式。 options.onClusterClick function選填,點選叢集圖執行的回調函式,預設為畫面移至該座標叢集區域。 options.onMarkerClick function選填,點選地標執行的回調函式。 options.clusterMaxZoom number選填,集群圖層會停止集群化的最大縮放級別,預設為 14。options.clusterMinPoints number選填,形成一個集群所需的最小點數,預設為 2。options.clusterRadius number選填,集群半徑,以像素為單位,預設為 50。
範例
// 資料const data = [ { id: 'a', position: [121.52012916930945, 25.029326932236182] }, { id: 'b', position: [121.52412916930945, 25.026326932236182] }, { id: 'c', position: [121.52612916930945, 25.027326932236182] }, { id: 'd', position: [121.52812916930945, 25.025326932236182] }, { id: 'e', position: [121.53012916930945, 25.022326932236182] },];
// 地標渲染器function markerRenderer({ id, position }) { return { key: id, position, }}
// 新增動態叢集new mapPlus.DynamicCluster({ data, markerRenderer,});地標渲染器
可使用 DynamicCluster(options) 的 options.data 與 options.markerRenderer 來設定地標的渲染。
markerRenderer
options.markerRenderer(callback)
markerRenderer 接受一個 callback 回調函式,該回調函式需返回包含 地標參數 以及唯一的 key 值的物件。
callback(data, index) 參數說明:
- data
(any):為options.data中的資料。 - index
(number):資料的索引。
範例
// 資料const data = [ { id: 'a', color: '#FF0000', radius: 30, position: [121.52012916930945, 25.029326932236182] }, { id: 'b', color: '#00FF00', radius: 40, position: [121.52412916930945, 25.026326932236182] }, { id: 'c', color: '#0000FF', radius: 30, position: [121.52612916930945, 25.027326932236182] }, { id: 'd', color: '#FF0000', radius: 40, position: [121.52812916930945, 25.025326932236182] }, { id: 'e', color: '#00FF00', radius: 50, position: [121.53012916930945, 25.022326932236182] },];
// 地標渲染器function markerRenderer({ id, color, radius, position }, index) { const icon = document.createElement('div'); icon.style.width = `${radius}px`; icon.style.height = `${radius}px`; icon.style.backgroundColor = color; return { key: id, icon, position, }}
// 新增動態叢集new mapPlus.DynamicCluster({ data, markerRenderer,});叢集圖樣式
可使用 DynamicCluster(options) 的 options.styles 來設定叢集圖的樣式。
範例
// 樣式const styles = { default: { radius: 25, fillColor: '#98FB98', fillOpacity: .6, strokeColor: '#98FB98', strokeOpacity: 1, strokeWidth: 3, textColor: '#000000', textSize: 12, }, 4: { radius: 30, fillColor: '#FFD700', strokeColor: '#FFD700', }, 5: { radius: 35, fillColor: '#FF6347', strokeColor: '#FF6347', }}
// 新增動態叢集new mapPlus.DynamicCluster({ data, styles, markerRenderer,});叢集圖點選事件
可使用 DynamicCluster(options) 的 options.onClusterClick ,設定點選叢集圖執行的回調函式,預設為畫面移至該座標叢集區域。
範例
// 叢集圖點選function onClusterClick({ properties }) { const { point_count } = properties; if (point_count === undefined ) { alert('一共有1個地標在這裡!'); } else { alert('一共有' + point_count + '個地標在這裡!'); }}
// 新增動態叢集new mapPlus.DynamicCluster({ data, markerRenderer, onClusterClick,});地標點選事件
可使用 DynamicCluster(options) 的 options.onMarkerClick ,設定點選地標執行的回調函式。
範例
// 資料const data = [ { id: 'a', position: [121.52012916930945, 25.029326932236182] }, { id: 'b', position: [121.52412916930945, 25.026326932236182] }, { id: 'c', position: [121.52612916930945, 25.027326932236182] }, { id: 'd', position: [121.52812916930945, 25.025326932236182] }, { id: 'e', position: [121.53012916930945, 25.022326932236182] },];
// 地標渲染器function markerRenderer({ id, position }) { return { key: id, name: `marker ${id}`, position, }}
// 地標點選function onMarkerClick({ event , marker , options }) { const infoWindow = new mapPlus.InfoWindow({ content: `This is "${options.name}"`, }); infoWindow.open({ anchor: marker });}
// 新增動態叢集new mapPlus.DynamicCluster({ data, markerRenderer, onMarkerClick,});