最近实现Cesium手动绘制图形的功能,需要鼠标点击及移动时获取当前的空间坐标。实现的过程中发现了下面两种获取空间坐标的方式:

在Cesium Sandcastle给出的绘制示例中,采用了pickPosition的方式获取空间坐标,并给出如下注释:

Csium绘制示例


大致可理解为viewer.camera.pickEllipsoid 在加载地形的场景上获取的坐标有误差,用viewer.camera.pickEllipsoid来解决这一问题。于是我用viewer.camera.pickEllipsoid 做了下测试,发现确实有较大误差:

pickEllipsoid在地形起伏表面绘制.gif


于是采用了Cesium Sandcastle中推荐的viewer.scene.pickPosition进行位置获取,却发现误差更大了

pickPosition.gif


查阅资料后得知:viewer.scene.pickPosition需要开启“地形深度检测”来解决在没有3dTile模型下的笛卡尔座标不准问题:

 

 

//解决viewer.scene.pickPosition(e.position)在没有3dTile模型下的笛卡尔座标不准问题。
viewer.scene.globe.depthTestAgainstTerrain = true;

也就是说,viewer.scene.pickPosition 在未开启“地形深度检测”的情况下只能在3DTile上准确获取空间坐标(如下图)。

未开启地形深度检测,pickPosition在3DTile上绘制.gif


开启“地形深度检测”后,viewer.scene.pickPosition 也能在非3DTile上准确获取坐标(如下图)。

开启地形深度检测的pickPosition.gif


总结如下

 

  • pickEllipsoid在加载地形的情况下有一定误差,地形凹凸程度越大,误差越大。
  • pickPosition在depthTestAgainstTerrain=false时只能在3DTile上获取准确位置,当depthTestAgainstTerrain=true时,在3DTile和底图上均能获取准确位置

新发现问题

当开启了地形深度检测后,绘制点时会被遮挡。