聚合標注,是指在不同地圖分辨率下,通過聚合方式展現標注點的一種方法。
其設計目的是為了減少當前視圖下加載標注點的數量,提升客戶端渲染速度。因為如果在地圖上添加很多標注點,當地圖縮放到小級別(即大分辨率)時會出現標注重疊的現象,既不美觀,渲染效率也會受到影響。此時,可以根據地圖縮放級數(zoom)的大小,將當前視圖的標注點進行聚合顯示。
OpenLayers也考慮到加載大數據量標注點的情況,提供了相應的聚合標注功能,以提升顯示速度,增強用戶體驗。OpenLayers封裝了支持聚合的矢量要素數據源(ol.source.Cluster),通過此數據源實現矢量要素的聚合功能。
下面的示例模擬加載10000個隨機矢量點要素,使用ol.source.Cluster數據源,實現矢量要素聚合顯示的功能。

代碼如下:
<body>
<input type="radio" id="addFeatures" name="cluster" />添加聚合標注
<input type="radio" id="removeFeatures" name="cluster" />移除聚合標注
<div id="map"></div>
<script>
var map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
})
],
view: new ol.View({
center: [0, 0],
zoom: 3
})
});
//此示例創建10000個要素
var count = 10000;
var features = new Array(count);
var e = 4500000;
for(var i = 0; i < count; i++){
var coordinates = [2*e*Math.random()-e, 2*e*Math.random()-e];
features[i] = new ol.Feature(
new ol.geom.Point(coordinates)
);
}
//矢量要素數據源
var source = new ol.source.Vector({
features: features
});
//聚合標注數據源
var clusterSource = new ol.source.Cluster({
distance: 40, //聚合的距離參數,即當標注間距離小於此值時進行聚合,單位是像素
source: source //聚合的數據源,即矢量要素數據源對象
});
//加載聚合標注的矢量圖層
var styleCache = {}; //用於保存特定數量的聚合群的要素樣式
var clusters = new ol.layer.Vector({
source: clusterSource,
style: function (feature, resolution){
var size = feature.get('features').length; //獲取該要素所在聚合群的要素數量
var style = styleCache[size];
console.log(size);
if(!style){
style = [
new ol.style.Style({
image: new ol.style.Circle({
radius: 10,
stroke: new ol.style.Stroke({
color: '#fff'
}),
fill: new ol.style.Fill({
color: '#3399CC'
})
}),
text: new ol.style.Text({
text: size.toString(),
fill: new ol.style.Fill({
color: '#fff'
})
})
})
];
styleCache[size] = style;
}
return style;
}
});
map.addLayer(clusters);
//添加聚合標注
document.getElementById('addFeatures').onclick = function(){
//當前聚合標注數據源中的要素
var currentFeatures = clusterSource.getSource().getFeatures();
//如果聚合標注數據源中沒有要素,則重新添加要素
if(currentFeatures.length == 0){
clusterSource.getSource().addFeatures(features);
clusters.setSource(clusterSource);
map.addLayer(clusters);
}
}
//移除聚合標注
document.getElementById('removeFeatures').onclick = function(){
clusterSource.getSource().clear(); //移除聚合標注數據源中的所有要素
map.removeLayer(clusters); //移除標注圖層
}
</script>
</body>
ol.source.Cluster的關鍵參數如下:
- source:聚合要素的數據源,本示例設置的是加載包含10000個隨機矢量要素的矢量數據源對象。
- distance:聚合距離參數,當標注間距離小於此值時進行聚合,本示例設置的是40個像素。
