在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);的结果为:
点再地球表面的向量加上点再地球表面的高程向量