admin管理员组

文章数量:1650829

文章目录

    • 1.实现效果
    • 2.实现方法
      • 2.1实现思路
      • 2.2具体代码

Cesium实战系列文章总目录: 传送门

1.实现效果

2.实现方法

原本是想通过Cesium3DTileFeature的位置信息与当前可视范围进行判断来确定,但是发现其并不存储位置坐标信息,所以需要在前置的数据处理过程中,将要素中心点坐标写入属性表中再切片成3D Tiles。

2.1实现思路

(1)获取要素数据
通过Cesium3DTileContentgetFeature方法获取要素,API:添加链接描述
(2)获取属性信息
再通过featuregetProperty方法,获取属性信息,API:传送门

(3)计算可视范围
通过cameracomputeViewRectangle方法计算当前可视范围,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("无法获取");
    }
})

本文标签: 范围内可视数量Cesiumfeature