/**
* WGS84坐标转笛卡尔空间直角坐标
* @param { WGS84 }
* @return { Cartesian3 }
*/
export function wgs84ToCartesian3(wgs84) {
return Cesium.Cartesian3.fromDegrees(
wgs84.longitude,
wgs84.latitude,
wgs84.height,
Cesium.Ellipsoid.WGS84
);
}
/**
* 笛卡尔空间直角坐标转WGS84坐标
* @param { Cartesian3 }
* @return { WGS84 }
*/
export function cartesian3ToWgs84(cartesian3) {
const cartographic =
Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian3);
const longitude = Cesium.Math.toDegrees(cartographic.longitude);
const latitude = Cesium.Math.toDegrees(cartographic.latitude);
const height = cartographic.height;
return { longitude, latitude, height };
}
/**
* WGS84坐标转弧度
* @param { WGS84 }
* @return { Cartographic.Radians }
*/
export function wgs84ToRadians(wgs84) {
return Cesium.Cartographic.fromDegrees(
wgs84.longitude,
wgs84.latitude,
wgs84.height
);
}
/**
* 判断拾取模型的位置
* @param { Cartesian2, Viewer }
* @return { Boolean }
*/
export function isModel(cartesian2, viewer) {
const LIST = viewer.scene.drillPick(cartesian2);
return LIST.some((item) => {
const { primitive } = item;
return (
(item && primitive instanceof Cesium.Cesium3DTileFeature) ||
(item && primitive instanceof Cesium.Cesium3DTileset) ||
(item && primitive instanceof Cesium.Model)
);
});
}
/**
* 拾取位置
* @param { Cartesian2, Viewer }
* @return { Cartesian3, WGS84 }
*/
export function pickPosition(cartesian2, viewer) {
const globePosition = pickGlobePosition(cartesian2, viewer);
const terrainPosition = pickTerrainPosition(cartesian2, viewer);
const modelPosition = pickModelPosition(cartesian2, viewer);
const isPickModel = isModel(cartesian2, viewer);
return isPickModel ? modelPosition : terrainPosition || globePosition;
}
/**
* 拾取球面位置
* @param { Cartesian2, Viewer }
* @return { Cartesian3 }
*/
export function pickGlobePosition(cartesian2, viewer) {
try {
return viewer.scene.camera.pickEllipsoid(
cartesian2,
viewer.scene.globe.ellipsoid
);
} catch (error) {
return null;
}
}
/**
* 拾取地形位置
* @param { Cartesian2, Viewer }
* @return { Cartesian3 }
*/
export function pickTerrainPosition(cartesian2, viewer) {
try {
const ray = viewer.scene.camera.getPickRay(cartesian2);
return viewer.scene.globe.pick(ray, viewer.scene);
} catch (error) {
return null;
}
}
/**
* 拾取模型位置
* @param { Cartesian2, Viewer }
* @return { Cartesian3 }
*/
export function pickModelPosition(cartesian2, viewer) {
try {
const cartesian3 = viewer.scene.pickPosition(cartesian2);
const cartographic = Cesium.Cartographic.fromCartesian(cartesian3);
if (cartographic.height < 0) cartographic.height = 0;
const longitude = Cesium.Math.toDegrees(cartographic.longitude);
const latitude = Cesium.Math.toDegrees(cartographic.latitude);
const height = cartographic.height;
return wgs84ToCartesian3({ longitude, latitude, height });
} catch (error) {
return null;
}
}
/**
* 获取多边形中心点
* @param { Polygon }
* @return { Cartesian3 }
*/
export function getPolygonCenter(polygon) {
const positions = polygon.hierarchy.getValue(
Cesium.JulianDate.now()
).positions;
return Cesium.BoundingSphere.fromPoints(positions).center;
}
/**
* 视图定位方法,定位到点
* @param lon 经度
* @param lat 纬度
* @param alt 范围(相机距离中心点的位置为5000)
*/
export function cameraFlyToLonLat(lon, lat, alt, viewer) {
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(lon, lat, alt),
orientation: {
heading: Cesium.Math.toRadians(0.0),
pitch: Cesium.Math.toRadians(-90.0),
roll: 0.0,
},
});
}
// 获取屏幕中心点经纬度
export function getCenterPosition(viewer) {
let centerResult = viewer.camera.pickEllipsoid(
new Cesium.Cartesian2(
viewer.canvas.clientWidth / 2,
viewer.canvas.clientHeight / 2
)
);
let curPosition =
Cesium.Ellipsoid.WGS84.cartesianToCartographic(centerResult);
let curLongitude = (curPosition.longitude * 180) / Math.PI;
let curLatitude = (curPosition.latitude * 180) / Math.PI;
return {
lon: curLongitude,
lat: curLatitude,
};
}
网友评论