需求
相机变化(包括移动、缩放)时,获取当前视野范围的四点坐标。
采用的思路是,添加相机变化的监听事件,当变化大于设置的识别精度,则会触发方法,获取当前屏幕四点坐标,分别建立相机与四点坐标的射线,求射线与地球的交点。
下面是以这个思路实现的代码:
viewer.scene.camera.percentageChanged = 0.2; // 设置相机变化的识别精度,默认值为0.5
// 设置相机变化的监听事件
cameraChangedListener = (percentage) => {
getScreenPoi();
};
removeChanged = viewer.camera.changed.addEventListener( cameraChangedListener );
getScreenPoi(){
let canvas = viewer.scene.canvas;
let ptLT = new Cesium.Cartesian2(0, 0); // 左上角
let ptLB = new Cesium.Cartesian2(0, canvas.clientHeight); // 左下角
let ptRT = new Cesium.Cartesian2(canvas.clientWidth, 0); // 右上角
let ptRB = new Cesium.Cartesian2(canvas.clientWidth, canvas.clientHeight); // 右下角
let pickLT = viewer.scene.globe.pick(viewer.camera.getPickRay(ptLT), viewer.scene);
let pickLB = viewer.scene.globe.pick(viewer.camera.getPickRay(ptLB), viewer.scene);
let pickRT = viewer.scene.globe.pick(viewer.camera.getPickRay(ptRT), viewer.scene);
let pickRB = viewer.scene.globe.pick(viewer.camera.getPickRay(ptRB), viewer.scene);
if (pickLT) {
// 将三维坐标转成地理坐标
let geoPtLT =
viewer.scene.globe.ellipsoid.cartesianToCartographic(pickLT);
// 地理坐标转换为经纬度坐标
left_top = [
(geoPtLT.longitude / Math.PI) * 180,
(geoPtLT.latitude / Math.PI) * 180,
];
}
if(pickLB) {
...
}
}
问题
上面代码基本可以满足需求,但是遇到奇怪的bug:鼠标滚轮向下滚动,即缩小(高度变高)时,有较大概率遇到四个点的pickXX会有一个或几个出现undefined的情况,但平移、放大都正常。
考虑了问题原因,想从以下几个方面寻找:
- 滚轮缩小事件
- camera.getPickRay方法