提供一些常见的场景数据获取方法。
1、获取屏幕中心点坐标:
//格式化 数字 小数位数
const formatNum = (num:number, digits: number) =>{
return Number(Number(num).toFixed(digits || 0));
};
//取屏幕中心点坐标
const pickCenterPoint = (scene:any) => {
let canvas = scene.canvas;
let center = new Cesium.Cartesian2(canvas.clientWidth / 2, canvas.clientHeight / 2);
let ray = scene.camera.getPickRay(center);
let target = scene.globe.pick(ray, scene);
if (!target) target = scene.camera.pickEllipsoid(center);
return target;
};
//提取屏幕中心点坐标
const getCenter = (viewer:any) =>{
let position = pickCenterPoint(viewer.scene);
if (!position) return null;
let carto = Cesium.Cartographic.fromCartesian(position);
let result:any = {};
result.lat = formatNum(Cesium.Math.toDegrees(carto.latitude), 6);
result.lon = formatNum(Cesium.Math.toDegrees(carto.longitude), 6);
result.height = formatNum(carto.height, 2);
return result;
}
2、获取相机高度:
const getHeight = (viewer) => {
let scene = viewer.scene;
let ellipsoid = scene.globe.ellipsoid;
let height = ellipsoid.cartesianToCartographic(viewer.camera.position).height;
return height;
};
3、获取相机位置:
//获取相机位置
const cameraRelay = () => {
//位置
let position = viewer.scene.camera.position
// 视高 km
let alt = (viewer.camera.positionCartographic.height / 1000).toFixed(2);
// 方位角
let heading = Cesium.Math.toDegrees(viewer.camera.heading).toFixed(2);
// 俯仰角
let pitch = Cesium.Math.toDegrees(viewer.camera.pitch).toFixed(2);
// 翻滚角
let roll = Cesium.Math.toDegrees(viewer.camera.roll).toFixed(2);
let cameraStr = `视高:${alt}km 方位角:${heading}° 俯仰角:${pitch}° 翻滚角:${roll}°`;
return cameraStr;
};
//监听相机位置获取事件
const getCamera = () => {
viewer.camera.changed.addEventListener(cameraRelay);
};
4、获取当前场景范围:
//获取当前场景范围
const getCurrentExtent = (viewer:any) =>{
// 范围对象默认值--中国区域
let extent:any = {
xmin: 70,
xmax: 140,
ymin: 0,
ymax: 55,
height: 0
};
// 得到当前三维场景
let scene = viewer.scene;
// 得到当前三维场景的椭球体
let ellipsoid = scene.globe.ellipsoid;
let canvas = scene.canvas;
// canvas左上角
let car3_lt = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(0, 0), ellipsoid);
if (car3_lt) {
// 在椭球体上
let carto_lt = ellipsoid.cartesianToCartographic(car3_lt);
extent.xmin = Cesium.Math.toDegrees(carto_lt.longitude);
extent.ymax = Cesium.Math.toDegrees(carto_lt.latitude);
extent.height = Math.max(extent.height, carto_lt.height);
} else {
// 不在椭球体上
let xMax = canvas.width / 2;
let yMax = canvas.height / 2;
let car3_lt2;
// 这里每次10像素递加,一是10像素相差不大,二是为了提高程序运行效率
for (let yIdx = 0; yIdx <= yMax; yIdx += 10) {
let xIdx = yIdx <= xMax ? yIdx : xMax;
car3_lt2 = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(xIdx, yIdx), ellipsoid);
if (car3_lt2) break;
}
if (car3_lt2) {
let carto_lt = ellipsoid.cartesianToCartographic(car3_lt2);
extent.xmin = Cesium.Math.toDegrees(carto_lt.longitude);
extent.ymax = Cesium.Math.toDegrees(carto_lt.latitude);
extent.height = Math.max(extent.height, carto_lt.height);
}
}
// canvas右下角
let car3_rb = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(canvas.width, canvas.height), ellipsoid);
if (car3_rb) {
// 在椭球体上
let carto_rb = ellipsoid.cartesianToCartographic(car3_rb);
extent.xmax = Cesium.Math.toDegrees(carto_rb.longitude);
extent.ymin = Cesium.Math.toDegrees(carto_rb.latitude);
extent.height = Math.max(extent.height, carto_rb.height);
} else {
// 不在椭球体上
let xMax = canvas.width / 2;
let yMax = canvas.height / 2;
let car3_rb2;
// 这里每次10像素递减,一是10像素相差不大,二是为了提高程序运行效率
for (let yIdx = canvas.height; yIdx >= yMax; yIdx -= 10) {
let xIdx = yIdx >= xMax ? yIdx : xMax;
car3_rb2 = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(xIdx, yIdx), ellipsoid);
if (car3_rb2) break;
}
if (car3_rb2) {
let carto_rb = ellipsoid.cartesianToCartographic(car3_rb2);
extent.xmax = Cesium.Math.toDegrees(carto_rb.longitude);
extent.ymin = Cesium.Math.toDegrees(carto_rb.latitude);
extent.height = Math.max(extent.height, carto_rb.height);
}
}
return extent;
};
欢迎指正与star