cesium 写鼠标点击事件时,想获取鼠标点击位置,发现不同场景对坐标需求不一致,获取出来的坐标也不一致。比如以下情形:
- 获取点击处屏幕坐标
- 获取鼠标点的对应椭球面位置 获取加载地形后对应的经纬度和高程
- 获取加载地形后对应的经纬度和高程
- 获取倾斜摄影或模型点击处的坐标
1、屏幕坐标
通过 movement.position
获取,鼠标点击位置距离canvas左上角的像素值。
let viewer = new Cesium.Viewer('cesiumContainer');
let handler= new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (movement) {
console.log('屏幕坐标', movement.position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
2、世界坐标(Cartesian3)
通过 viewer.scene.camera.pickEllipsoid(movement.position, ellipsoid)
获取,可以获取当前点击位置与椭球面相交处的坐标。其中 ellipsoid 是当前地球使用的椭球对象:viewer.scene.globe.ellipsoid
。
let viewer = new Cesium.Viewer('cesiumContainer');
let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (movement) {
console.log('世界坐标',
viewer.scene.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid));
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
3、场景坐标
通过 viewer.scene.pickPosition(movement.position)
获取,返回根据 场景的深度缓冲区 和 窗口位置坐标 重构的 笛卡尔位置。
模型上使用这个坐标比较准确。
let viewer = new Cesium.Viewer('cesiumContainer');
let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (movement) {
console.log('场景坐标', viewer.scene.pickPosition(movement.position));
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
4、地表坐标
通过 viewer.scene.globe.pick(ray, scene)
获取,可以获取射线与渲染的地球表面之间的交点。其中 ray = viewer.camera.getPickRay(movement.position)
。
let viewer = new Cesium.Viewer('cesiumContainer');
let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (movement) {
let ray = viewer.camera.getPickRay(movement.position);
let position = viewer.scene.globe.pick(ray, viewer.scene);
console.log('地表坐标', position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
同一个位置使用不同api,获取的坐标不一样: