Cesium 采集地形高度,采集模型高度 (异步方法,适合数据较多的时候)

本文介绍了一个在Cesium中进行地形和模型高度采集的Demo。使用`scene.clampToHeightMostDetailed`方法获取模型高度,通过`Cesium.sampleTerrainMostDetailed`结合`cartesianToCartographic`和`cartographicToCartesian`转换获取地形高度。方法适用于异步批量采集,注意避免频繁使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阅前须知:

1. 该文章适合采集大量点的高度(异步采集),采集效率一般,应避免频繁使用;

2. 如果采集单点高度(同步采集),请参考API:scene类下的 sampleHeightclampToHeight,适合采集单点。

Scene - Cesium Documentation

正文开始


Demo主要功能:

        1. 采集地形高度(地形:viewer.terrainProvider)

        2. 采集模型高度(3DTile,model,entity等)

(其中this.cartesianToCartographic方法:极坐标转为笛卡尔坐标,可参考cesium坐标转换:不同坐标系之间的相互转换_Gisleung的博客-CSDN博客

    /**
     * 采集高度
     * @param {*} cartesians:笛卡尔坐标组成的数组
     * @param {*} type:'terrain' 获取地形高度,'model'获取模型高度
     * @returns 采集结果:笛卡尔坐标组成的数组
     */
    getHeightByType(cartesians, type) {
        if (type === 'model') {
            return new Promise(async resolve => {
                try {
                    let promise = viewer.scene.clampToHeightMostDetailed(cartesians)
                    promise.then(updatedCartesians => resolve(updatedCartesians))
                } catch (e) {
                    resolve(false)
                }
            })
        } else if (type = 'terrain') {
            // 首先将cartesians转为positions
            let positions = []
            cartesians.forEach(cartesian => {
                positions.push(this.cartesianToCartographic(cartesian))
            })
            let terrain = viewer.terrainProvider
            return new Promise(async resolve => {
                try {
                    // 当前场景中没有使用地形
                    if (!terrain) resolve(false)
                    const promise = Cesium.sampleTerrainMostDetailed(terrain, positions);
                    promise.then(updatedPositions => {
                        let resultCartesians = []
                        updatedPositions.forEach(position => {
                            if (position) {
                                // 采集成功,转为笛卡尔坐标
                                resultCartesians.push(this.cartographicToCartesian(position))
                            } else {
                                // postion为undefined时,说明该位置采集失败
                                // resultCartesians.push(position)
                            }
                        })
                        resolve(resultCartesians)
                      })
                } catch (e) {
                    resolve(false)
                }
            })
        }
    },

简单使用:

const cartesian1 = new Cesium.Cartesian3.fromDegrees(102.837, 24.276, 60000)
const cartesian2 = new Cesium.Cartesian3.fromDegrees(101.837, 23.276, 60000)
this.getHeightByType([cartesian1, cartesian2], 'model').then(results => {
    console.log('demo: 拾取结果:', results)
})
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值