如何通过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
相关产品推荐
相关产品推荐

