admin管理员组文章数量:1650829
文章目录
- 1.实现效果
- 2.实现方法
- 2.1实现思路
- 2.2具体代码
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("无法获取");
}
})
版权声明:本文标题:cesium获取当前可视范围内3D tiles的feature数量 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1729532434a1204977.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论