我有一个飞行路径与晚/长和海拔,我需要将其转换为笛卡尔X,Y,Z为铯.js。我正试图转换这个,因为我似乎没有得到正确的结果从我的函数。
var R = 6371;
function polarToCartesian(latitude, longitude, elevation){
x = (R+elevation) * math.cos(latitude) * math.cos(longitude);
y = (R+elevation) * math.cos(latitude) * math.sin(longitude);
z = (R+elevation) * math.sin(latitude);
var ar = [x,y,z];
return ar;
}
我要么没有极坐标到笛卡尔坐标的正确公式要么我没有正确的地球半径。我在某个地方发现我的半径应该是6371,但似乎找不到相同的SO问题供参考。
我通过手动将地球半径+给定位置飞行路径的高度相加来检查我的代码是否正确,并查看这是否等于我的x,y,z向量的长度。
例如:x,y,z (3689.2472215653725,3183.2401988117012,13306.90338789763)
当我给我的函数this
-93.028,44.6942,7800
lat,长,海拔
有人能指出我找到正确的js代码来完成这个转换吗?
您应该使用Cesium的内置函数。参见Cartesian3.fromDegrees
和Cartesian3.fromDegreesArray
var result = Cesium.Cartesian3.fromDegrees(latitude, longitude, elevation);
注意,结果将与铯预期的一样:以米为单位,而不是千米。这还考虑了椭球体的形状,其默认值为WGS84(地球不是一个完美的球体,正如您的函数所假定的那样)。
javascript 本身没有任何问题。然而,你的方程式是不正确的。你正在寻找从拉/长/Alt转换为球面(又名笛卡尔),这是回答在这里。
所以你可以把上面的重写为:
function polarToCartesian(latitude, longitude, elevation){
const x = math.cos(latitude) * math.cos(longitude) * elevation;
const y = math.cos(latitude) * math.sin(longitude) * elevation;
const z = math.sin(latitude) * elevation;
return [x, y, z];
}