Cesium中如何监听地图点击事件并获取经纬度?
我在用Cesium做地图应用,想实现点击地图时弹出当前点的经纬度,但不知道怎么绑定点击事件。试过用viewer.screenSpaceEventHandler,但拿到的坐标是笛卡尔坐标,转成经纬度后数值很奇怪,是不是哪里弄错了?
下面是我现在的代码:
viewer.screenSpaceEventHandler.setInputAction(function(movement) {
const cartesian = viewer.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid);
if (cartesian) {
const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
const lon = Cesium.Math.toDegrees(cartographic.longitude);
const lat = Cesium.Math.toDegrees(cartographic.latitude);
console.log('Lon:', lon, 'Lat:', lat);
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
pickEllipsoid上,它只在当前相机能“看到”的地表球体上拾取点,如果地图有地形起伏或者你开了 3D Tiles,那它就直接穿过去拾取不到点,或者拾取到错误的位置。前端这块更稳妥的做法是用
viewer.camera.pickEllipsoid(movement.position, viewer.scene.globe),但其实更推荐用viewer.scene.pickPosition(movement.position),它会考虑地形高度(DEM),返回真实地表的笛卡尔坐标,再转经纬度就准了。另外你得注意:如果场景是 2D 或 Columbus View,得用
viewer.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid);如果是 3D,最好用pickPosition。给你改个通用点的写法,兼容 2D 和 3D:
注意
Cartographic.fromCartesian是 Cesium 内部标准方法,你原代码没问题,主要是拾取逻辑太脆弱。如果还是不准,大概率是你地图没开地形服务,或者场景里有遮挡物(比如 3D 建筑挡住了点击点),这时候
pickPosition就会返回undefined。可以加个
console.log(cartesian)看下到底拾取到没,别光看经纬度奇怪就以为是转换错了。