目录
viewer.scene.pick(e.position)
viewer.scene.pickPosition(e.position) 场景坐标
viewer.scene.globe.pick(viewer.camera.getPickRay(e.position), viewer.scene)) 地表坐标
viewer.camera.pickEllipsoid(e.position) 世界坐标
鼠标点击点位置,有以下情形:
其中,e.position中的x,y为屏幕坐标,屏幕左上角为原点
viewer.scene.pick (windowPosition,width , height ) →0bject
拾取cesium场景中的空间对象,且返回最前面的一个空间对象,可以拾取entity实体,primitive图元,数据源datasource,3dtiles瓦片数据。
只有点击entity等实体才不为undefined,否则就算点击地球也会是undefined
let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);handler.setInputAction((e) => {console.log("e:", e);let pickedObject = viewer.scene.pick(e.position)// 通过屏幕坐标获取当前位置的实体信息console.log("viewer.scene.pick(e.position):", viewer.scene.pick(e.position));//只有点击entity才不为undefined,否则就算点击地球也会是undefinedif (!Cesium.defined(pickedObject)) {console.log("没有拾取到空间对象")return;}}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
viewer.scene.pickPosition (windowPosition,result)→Cartesian3
注意:获取到笛卡尔坐标存在不准确性:
1.在无地形的情况下,不开启深度测试,在地球上拾取是准确的;
2.在有地形的情况下,不开启深度测试,在地球上拾取是不准确的;因为存在深度问题,必须开启深度测试,即 viewer.scene.globe.depthTestAgainstTerrain = true。
总结:
pickPosition在
depthTestAgainstTerrain=false
时只能在3DTile上获取准确位置当
depthTestAgainstTerrain=true
时,在3DTile和底图上均能获取准确位置
let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);handler.setInputAction((e) => {console.log("e:", e);let cartesian = viewer.scene.pickPosition(e.position);console.log("cartesian:", cartesian);let cartographic = Cesium.Cartographic.fromCartesian(cartesian);console.log("cartographic:", cartographic);let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度let alt = cartographic.height; // 高度let coordinate = {longitude: Number(lng.toFixed(6)),latitude: Number(lat.toFixed(6)),altitude: Number(alt.toFixed(2)),};console.log("coordinate:", coordinate);}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
let ray = viewer.camera.getPickRay(e.position);
viewer.scene.globe.pick (ray,scene,result ) →Cartesian3
let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);handler.setInputAction((e) => {console.log("e:", e);let ray = viewer.camera.getPickRay(e.position);console.log("ray:", ray);let cartesian = viewer.scene.globe.pick(ray, viewer.scene);console.log("cartesian:", cartesian);let cartographic = Cesium.Cartographic.fromCartesian(cartesian);console.log("cartographic:", cartographic);let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度let alt = cartographic.height; // 高度let coordinate = {longitude: Number(lng.toFixed(6)),latitude: Number(lat.toFixed(6)),altitude: Number(alt.toFixed(2)),};console.log("coordinate:", coordinate);}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
viewer.scene.camera.pickEllipsoid (windowPosition,ellipsoid , result ) →Cartesian3
pickEllipsoid 只用于无地形椭球面的获取坐标,不可用于加载地形场景。在加载地形的场景上获取的坐标不准确
let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);handler.setInputAction((e) => {console.log("e:", e);let cartesian = viewer.camera.pickEllipsoid(e.position);console.log("cartesian:", cartesian);let cartographic = Cesium.Cartographic.fromCartesian(cartesian);console.log("cartographic:", cartographic);let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度let alt = cartographic.height; // 高度,椭球面height永远等于0let coordinate = {longitude: Number(lng.toFixed(6)),latitude: Number(lat.toFixed(6)),altitude: Number(alt.toFixed(2)),};console.log("coordinate:", coordinate);}, Cesium.ScreenSpaceEventType.LEFT_CLICK);