最近实现Cesium手动绘制图形的功能,需要鼠标点击及移动时获取当前的空间坐标。实现的过程中发现了下面两种获取空间坐标的方式:
在Cesium Sandcastle给出的绘制示例中,采用了pickPosition
的方式获取空间坐标,并给出如下注释:
大致可理解为
viewer.camera.pickEllipsoid
在加载地形的场景上获取的坐标有误差,用viewer.camera.pickPosition
来解决这一问题。于是我用viewer.camera.pickEllipsoid
做了下测试,发现确实有较大误差:于是采用了Cesium Sandcastle中推荐的
viewer.scene.pickPosition
进行位置获取,却发现误差更大了:查阅资料后得知:
viewer.scene.pickPosition
需要开启“地形深度检测”来解决在没有3dTile模型下的笛卡尔座标不准问题:
//解决viewer.scene.pickPosition(e.position)在没有3dTile模型下的笛卡尔座标不准问题。
viewer.scene.globe.depthTestAgainstTerrain = true;
也就是说,viewer.scene.pickPosition
在未开启“地形深度检测”的情况下只能在3DTile上准确获取空间坐标(如下图)。
开启“地形深度检测”后,
viewer.scene.pickPosition
也能在非3DTile上准确获取坐标(如下图)。总结如下:
- pickEllipsoid在加载地形的情况下有一定误差,地形凹凸程度越大,误差越大。
- pickPosition在
depthTestAgainstTerrain=false
时只能在3DTile上获取准确位置,当depthTestAgainstTerrain=true
时,在3DTile和底图上均能获取准确位置
新发现问题
当开启了地形深度检测后,绘制点时会被遮挡。