参考:
Cesium 拾取 API 完全总结 - 岭南灯火 - 博客园 (cnblogs.com)
Cesium-鼠标拾取椭球、地形、模型坐标点详解_查看当时cesium椭球体-CSDN博客
拾取坐标
主要分三类:椭球表面坐标的拾取、带有地形的坐标拾取、物体上的坐标拾取,相应有三个 API 可以拾取:
椭球表面的拾取采取的方法:
viewer.camera.pickEllipsoid
let cartesian = viewer.camera.pickEllipsoid(event.position);
let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度
let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度
let alt = cartographic.height; // 高度,椭球面height永远等于0
在带有地形的椭球表面拾取:
viewer.scene.globe.pick
,需要先创建一条从当前相机位置到目标点的射线:viewer.camera.getPickRay
let ray = viewer.camera.getPickRay(evt.position);
let cartesian = viewer.scene.globe.pick(ray, viewer.scene);
let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度值
let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度值
// alt 结果与 cartographic.height 相差无几,注意:cartographic.height 可以为 0,也就是说,可以根据经纬度计算出高程。
let alt = viewer.scene.globe.getHeight(cartographic);
物体上拾取(Entity、Primitive):
scene.pick
let scene = viewer.scene;
if (scene.mode !== Cesium.SceneMode.MORPHING) {
let pickedObject = scene.pick(evt.position);
if (scene.pickPositionSupported && Cesium.defined(pickedObject) && pickedObject.node) {
let cartesian = viewer.scene.pickPosition(evt.position);
if (Cesium.defined(cartesian)) {
let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
let lng = Cesium.Math.toDegrees(cartographic.longitude);
let lat = Cesium.Math.toDegrees(cartographic.latitude);
let alt = cartographic.height; // 模型高度
}
}
}
拾取物体
上文中在模型上拾取 中通过 scene.pick获取到的其实就是对应的物体了(获取 entity 时,其包含在返回的 id 字段中),之后可以通过 getPropertyIds
方法看到这个 feature 中哪些属性,用 getProperty
可以获取到相关属性的值。具体可以参考官方的示例:3D Tiles Feature Picking - Cesium Sandcastle
注意事项
以上拾取的方法使用前建议打开深度检测,否测经常会拾取不准确:
viewer.scene.globe.depthTestAgainstTerrain = true
评论区