阅前须知:

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)
})
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐