cesium没有提供primitive聚合的方法,一般可以直接修改源码:EntityCluster.js实现聚合,但是还可以使用如下方法
关键:属性:DistanceDisplayCondition
BillboardCollection为例:
每个poi点给他一个显隐的距离限制,
至于这个距离限制到底是多少,就得靠自己去约束了,我是直接在数据库里添加了一个字段,来控制具体某一类型的poi视距到多少才进行显示。
数据库方面:
如下:
typename为 “ 汽车服务;加油站;加油站 ” 的可看作最远视距显示的POI;
然后typename中包含 “汽车服务;加油站” 的可看作中距离视距显示的POI;
最后typename中包含 “汽车服务” 的可在最近视距显示全部的POI;
视距控制方面:
1.存储基于typename的层级
2.如果是那一层的poi点,则返回相应的视距
POIPrimitive.prototype._clustering = function(typename_,lod){
if (typename_.indexOf(lod.lod1) != -1) {
//高视距
return [100000,500000]
} else if(typename_.indexOf(lod.lod2) != -1){
//中视距
return [8000,80000]
}else {
//低视距
return [3000,3000]
}
}
调用方面:
this.$axiosInstance.searchPoiByclassname(params).then(res => {
for (let i = 0; i < res.data.rows.length; i++) {
//计算相应视距
let dis = POIPrimitive_._clustering(res.data.rows[i].typename,node.lod);
//画poi
POIPrimitive_._add({
position:[res.data.rows[i].lon, res.data.rows[i].lat, 0.0],
label:{
fillColor:Cesium.Color.fromCssColorString(node.labelcolor),
text:res.data.rows[i].name,
// 添加显隐视距限制
distanceDisplayCondition:new Cesium.DistanceDisplayCondition(0, dis[0])
},
billboard:{
image:node.img,
// 添加显隐视距限制
distanceDisplayCondition:new Cesium.DistanceDisplayCondition(0, dis[1])
}
})
}
});
效果:
远视距
中视距 近视距