/**
* @Author: JoshuaLi
* @name: offsetToLatLon
* @Description: 在给定的地理位置(纬度和经度)上,沿东向和南向偏移指定距离,返回偏移后的新经纬度。
* @param {*} latitude - 维度
* @param {*} longitude - 经度
* @param {*} offsetE - 向东偏移量,单位为米
* @param {*} offsetS - 向南偏移量,单位为米
* @return {Object} 返回一个包含新的纬度和经度的对象
*/
function offsetToLatLon(latitude, longitude, offsetE, offsetS) {
// 创建初始的 Cartographic 位置
let cartographic = Cesium.Cartographic.fromDegrees(longitude, latitude);
// 将 Cartographic 位置转换为笛卡尔坐标
let cartesian = Cesium.Cartographic.toCartesian(cartographic);
// 计算地球表面的局部切线平面上的单位矢量
let surfaceNormal = new Cesium.Cartesian3();
Cesium.Ellipsoid.WGS84.geodeticSurfaceNormal(cartesian, surfaceNormal);
// 计算东向单位矢量
let eastVector = new Cesium.Cartesian3();
Cesium.Cartesian3.cross(Cesium.Cartesian3.UNIT_Z, surfaceNormal, eastVector);
Cesium.Cartesian3.normalize(eastVector, eastVector);
// 计算北向单位矢量
let northVector = new Cesium.Cartesian3();
Cesium.Cartesian3.cross(eastVector, surfaceNormal, northVector);
Cesium.Cartesian3.normalize(northVector, northVector);
// 计算沿东向和北向的偏移矢量
let offsetVectorX = Cesium.Cartesian3.multiplyByScalar(
eastVector,
offsetE,
new Cesium.Cartesian3(),
);
let offsetVectorY = Cesium.Cartesian3.multiplyByScalar(
northVector,
offsetS,
new Cesium.Cartesian3(),
);
// 计算总的偏移矢量
let offsetVector = Cesium.Cartesian3.add(
offsetVectorX,
offsetVectorY,
new Cesium.Cartesian3(),
);
// 将原始笛卡尔坐标与偏移矢量相加,得到新的笛卡尔坐标
let newCartesian = Cesium.Cartesian3.add(
cartesian,
offsetVector,
new Cesium.Cartesian3(),
);
// 将新的笛卡尔坐标转换回 Cartographic(经纬度)
let newCartographic = Cesium.Cartographic.fromCartesian(newCartesian);
// 提取新的经度和纬度
let newLongitude = Cesium.Math.toDegrees(newCartographic.longitude);
let newLatitude = Cesium.Math.toDegrees(newCartographic.latitude);
// 返回新的经纬度
return {
latitude: newLatitude,
longitude: newLongitude,
};
}
Cesium米转经纬度
最新推荐文章于 2024-09-06 22:20:29 发布