在cesium中默认使用的是wgs84椭球,关于如何将wgs84经纬度坐标转换成笛卡尔坐标,cesium代码如下:
// 将经纬度转换成笛卡尔坐标
Ellipsoid.prototype.cartographicToCartesian = function (cartographic, result) {
//`cartographic is required` is thrown from geodeticSurfaceNormalCartographic.
var n = cartographicToCartesianNormal;
var k = cartographicToCartesianK;
// 计算给定点在地球表面的法线
this.geodeticSurfaceNormalCartographic(cartographic, n);
// 计算球面坐标
Cartesian3.multiplyComponents(this._radiiSquared, n, k);
var gamma = Math.sqrt(Cartesian3.dot(n, k));
Cartesian3.divideByScalar(k, gamma, k);
// 计算高程向量
Cartesian3.multiplyByScalar(n, cartographic.height, n);
if (!defined(result)) {
result = new Cartesian3();
}
// 返回笛卡尔坐标
return Cartesian3.add(k, n, result);
};
其中计算过程如下
函数 this.geodeticSurfaceNormalCartographic(cartographic, n);的计算公式为:
n = vec3(cos(θ)*cos(β),cos(θ)*sin(β),sin(θ));
函数Cartesian3.multiplyComponents(this._radiiSquared, n, k);的计算公式为:
k = vec3((a^2*cos(θ)*cos(β),b^2*cos(θ)*sin(β),c^2*sin(θ));
常规的球面参数方程为:x = a*cos(θ)*cos(β),y = b*cos(θ)*sin(β) ,z = c*sin(θ).之所以使用平方的形式是因为后面还要点乘vec3(a,b,c)向量,这里提前做了后面就不在相乘了。
函数var gamma = Math.sqrt(Cartesian3.dot(n, k));的计算公式为:
gamma = [[(a*cos(θ)*cos(β)]^2,[b*cos(θ)*sin(β)]^2,[c*sin(θ)]^2]^(1/2);
是为了向量的归一化时做被除数;
函数 Cartesian3.divideByScalar(k, gamma, k);的公式为:
k = k / gamma;表示的意义为椭球向量的归一化后再乘以(a,b,c);
k = vec3(a,b,c) 点乘 [vec3(a*cos(θ)*cos(β),b*cos(θ)*sin(β),c*sin(θ)) / ([a*cos(θ)*cos(β)]^2 + [b*cos(θ)*sin(β)]^2 + [c*sin(θ)]^2)^(1/2)];
函数Cartesian3.multiplyByScalar(n, cartographic.height, n);的公式为
n = vec3(cos(θ)*cos(β),cos(θ)*sin(β),sin(θ)) * height; 意义为地球表面的高程方向向量。
函数Cartesian3.add(k, n, result);的结果为:
点再地球表面的向量加上点再地球表面的高程向量