You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Cesium.js点击建筑或地形获取高程?

在Cesium.js中通过点击获取地形或建筑高程

可以实现,以下是针对地形和**3D建筑(3DTiles)**两种场景的具体实现方案:

一、获取地形高程

通过Cesium的ScreenSpaceEventHandler监听鼠标点击事件,结合scene.globe.getHeight()获取地形表面的高程值:

// 初始化Cesium场景
const viewer = new Cesium.Viewer('cesiumContainer');
// 加载默认地形(若未加载需手动配置)
viewer.scene.globe.terrainProvider = Cesium.createWorldTerrain();

// 创建点击事件处理器
const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);

handler.setInputAction(function(event) {
    // 将屏幕坐标转换为椭球表面的笛卡尔坐标
    const cartesian = viewer.camera.pickEllipsoid(event.position, viewer.scene.globe.ellipsoid);
    if (cartesian) {
        // 转换为经纬度坐标
        const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
        // 获取地形高程
        viewer.scene.globe.getHeight(cartographic).then(function(height) {
            if (height !== undefined) {
                const elevation = height;
                console.log(`地形高程:${elevation.toFixed(2)} 米`);
                // 可替换为你的业务逻辑,比如提示用户
                // useGrowl('success', `地形高程:${elevation.toFixed(2)} 米`);
            } else {
                console.log('无法获取该位置的地形高程');
                // useGrowl('error', '无法获取该位置的地形高程');
            }
        });
    }
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

二、获取3D建筑(3DTiles)高程

如果场景加载了3DTiles建筑数据,点击建筑时可通过scene.pick()检测命中的模型,再通过scene.pickPosition()获取建筑表面的高程:

// 复用已初始化的viewer和handler
handler.setInputAction(function(event) {
    // 检测点击是否命中3DTiles要素
    const pickedObject = viewer.scene.pick(event.position);
    if (Cesium.defined(pickedObject) && pickedObject.primitive instanceof Cesium.Cesium3DTileFeature) {
        // 获取建筑表面的笛卡尔坐标
        const cartesian = viewer.scene.pickPosition(event.position);
        if (cartesian) {
            const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
            const elevation = cartographic.height;
            console.log(`建筑高程:${elevation.toFixed(2)} 米`);
            // useGrowl('success', `建筑高程:${elevation.toFixed(2)} 米`);
        }
    } else {
        // 未命中建筑时, fallback 到地形高程获取逻辑
        const cartesian = viewer.camera.pickEllipsoid(event.position, viewer.scene.globe.ellipsoid);
        if (cartesian) {
            const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
            viewer.scene.globe.getHeight(cartographic).then(function(height) {
                if (height !== undefined) {
                    console.log(`地形高程:${height.toFixed(2)} 米`);
                    // useGrowl('success', `地形高程:${height.toFixed(2)} 米`);
                }
            });
        }
    }
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

关键注意点

  • 必须确保场景已加载地形数据,否则getHeight()无法返回有效高程。
  • 3DTiles建筑的高程精度依赖于模型本身的位置配置,若模型未正确绑定地理坐标,可能返回不准确值。
  • pickPosition依赖场景深度测试(默认开启),若手动关闭则无法获取表面坐标。

内容的提问来源于stack exchange,提问作者Ahmad Habibi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 21:23:36