侧边栏壁纸
  • 累计撰写 21 篇文章
  • 累计创建 6 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Cesium 各种拾取方法

hugh_shi
2023-12-19 / 0 评论 / 0 点赞 / 25 阅读 / 3149 字 / 正在检测是否收录...

参考:

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

注意事项

  1. 以上拾取的方法使用前建议打开深度检测,否测经常会拾取不准确:

viewer.scene.globe.depthTestAgainstTerrain = true

0

评论区