Cesium实战系列文章总目录: 传送门1.实现效果

2.实现方法
原本是想通过Cesium3DTileFeature的位置信息与当前可视范围进行判断来确定,但是发现其并不存储位置坐标信息,所以需要在前置的数据处理过程中,将要素中心点坐标写入属性表中再切片成3D Tiles。
2.1实现思路
(1)获取要素数据
通过Cesium3DTileContent的getFeature方法获取要素,API:添加链接描述
(2)获取属性信息
再通过feature的getProperty方法,获取属性信息,API:传送门
(3)计算可视范围
通过camera的computeViewRectangle方法计算当前可视范围,API:传送门
(4)判断要素是否在可视范围内
通过Rectangle类的contains方法判断当前点(弧度坐标)是否在矩形范围内,API:传送门
2.2具体代码
具体实现代码如下,通过监听相机变化事件来实时更新当前可视范围内的要素数量。
// 加载3d tiles
let tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
url: '.././data/sz/tileset.json'
}));
viewer.zoomTo(tileset);
// 瓦片内容
let content = undefined;
// 设置瓦片加载完成监听事件
tileset.tileLoad.addEventListener(function(tile) {
content = tile.content;
})
// 监听相机移动事件
viewer.camera.moveEnd.addEventListener(() => {
try {
// 计算当前可视范围矩形
let viewRectangle = viewer.camera.computeViewRectangle();
// 遍历所有要素
let featuresLength = content.featuresLength;
let count = 0;
for (let i = 0; i < featuresLength; i++) {
let feature = content.getFeature(i);
let lon = feature.getProperty('lon');
let lat = feature.getProperty('lat');
let centerCartographic = new Cesium.Cartographic(Cesium.Math.toRadians(Number(lon)), Cesium.Math.toRadians(Number(lat)));
// 要素中心点与当前可视范围做包含判断
if (Cesium.Rectangle.contains(viewRectangle, centerCartographic)) {
count++;
}
}
// 输出
console.log("当前可视范围内的要素数量为:");
console.log(count);
} catch {
console.log("无法获取");
}
})
版权声明:本文为weixin_45782925原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。