在实际项目中,我们经常会使用到鼠标点击获取信息的情况,包括但不限于:测距测面、绘制点线面、点框选查询等等。
经过查阅网上资料和自己测试后,总结下cesium 中获取鼠标位置的方法:
let hander = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
hander.setInputAction((e)=>{
...
...
},Cesium.ScreenSpaceEventType.LEFT_CLICK)
1、viewer.scene.pickPosition(e.position)
根据窗口坐标,从场景的深度缓冲区中拾取相应的位置,返回笛卡尔坐标。
注意:
只有在开启深度测试且不使用默认地形的情况下才是准确的!
默认地形(EllipsoidTerrainProvider)
viewer.scene.globe.depthTestAgainstTerrain = true;//开启深度测试
在未开启“地形深度检测”的情况下只能在3DTile上准确获取空间坐标
否则 大概率会返回 underfined
总结:
pickPosition在depthTestAgainstTerrain=false
时只能在3DTile上获取准确位置
当depthTestAgainstTerrain=true
时,在3DTile和底图上均能获取准确位置
2、viewer.scene.camera.pickEllipsoid(e.position,viewer.scene.ellipsoid)
获取当前点击视线与椭球面相交处的坐标,返回笛卡尔坐标
注意:
在加载地形的场景上获取的坐标有误差
总结:
pickEllipsoid 只用于无地形椭球面的获取坐标,不可用于加载地形场景。
3、viewer.scene.globe.pick
获取点击处地球表面的世界坐标,不包括模型、倾斜摄影表面
let ray= viewer.camera.getPickRay(e.position);
let position = viewer.scene.globe.pick(ray,viewer.scene))
注意:
结果相对稳定准确,不论地形深度检测开启与否,不论加载的是默认地形还是别的地形数据;
缺点是只能求交地形,scene.pickPosition不仅可以求交地形,还可以求交除地形以外其他所有有深度的物体。所以使用时可以二者结合来使用
参考博客:Cesium获取鼠标点击位置(PickPosition)解决viewer.scene.pickPosition(e.position)不准的问题_pumark的博客-CSDN博客