个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
经纬度与笛卡尔坐标系转换,转换的几何计算并不复杂,不过不推理一遍的话,始终是理解的不够透彻。所以借整理思路的机会,把推理过程理一遍。
笛卡尔球心坐标系:
-
首先:明确缺省采用的WGS84坐标系所使用的地球半径
ellipsoid.xyz = (6378137.0, 6378137.0, 6356752.3142451793));
X,Y 方向使用地球的赤道面的半径,也即地球长半轴长度:6378137.0
Z 方向使用地球经度面的半径,也即地球短半轴长度:6356752.3142451793 -
然后,明确圆心点和各个轴的指向:
以地球的球心为原点;
z轴指向北极;
x轴指向0度经线方向:0度经线(英国伦敦原格林威治天文台旧址)与赤道交点。
y轴指向90度经线方向:90度经线(该经线经过新疆、青海、西藏区域)与赤道交点。
经纬度转笛卡尔坐标
-
我们已知,纬度代表的是与赤道面的夹角:
北半球上,随着夹角的增大,纬度圈越向北极靠近;z值变大,纬度圈的半径也变短了。
坐标z值 = 短半轴长度 * sin(a)
纬线圈半径 = 长半轴长度 * cos(a)
-
已知,经度代表与0度经度线的夹角,0度经线以东为正,以西为负。
另外我们还知道,x指向0度经线,0度经线x=R,y=0;同理90度经线处x=0,y=R。
0-90度范围内,随着角度的增大,x值减小,y值增大
x = 纬线圈半径 * cos(b)
y = 纬线圈半径 * sin(b)
-
把x/y/z坐标去除半径部分,可以作为该经纬度的x/y/z向量指向:
normal=(
cos(a)*cos(b),
cos(a)*sin(b),
sin(a))
单位化该向量,再乘以对应的半径
Ellipsoid(6378137.0, 6378137.0, 6356752.3142451793)
得到经纬度对应0平面的笛卡尔坐标位置 -
坐标修正:考虑到ellipsoid椭球体坐标并非是球体方法所能表达的,使用一些修正算法进行近似纠正:
纠正算法采用的是:
笛卡尔位置 = (normal * ellipsoidSquared) / dot(normal * sqrt((normal * ellipsoidSquared))) -
对于带高程值的:
上面我们求出了经纬度在0平面(高程为0)时的笛卡尔位置;
加上高程值对应的矢量,就可以得出对应高程的位置;高程的指向和之前一致,所以也直接使用normal指向,所以增加量=height * normal,加到坐标上就得出带高程值的位置。
笛卡尔坐标转经纬度
笛卡尔坐标转经纬度,是上个计算的反向运算,推导过程也和上个相对应。
- 首先使用把矢量长度规整到0平面长度上,把高程值去掉
- 然后使用z值计算出纬度,设a为纬度,b为经度,z = R * sin(a),所以 a = arcsin(z/R)
- 有了纬度之后,对应的纬度圈就明确了,带入x/y的计算公式,再把经度求出来。
个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)