WGS84 与 北京54 坐标系互转


一、WGS84系统转北京54系统

1、把从GPS中接收到84坐标系下的大地坐标(经纬度高程B、L, H,其中B为纬度,L为经度,H为高程),使用84坐标系的椭球参数转换为84坐标系下的地心直角坐标(空间坐标):

X=(N+H)cosB * CosL 

Y=(N+H)cosB* sinL 

Z=[N(1-e2)+H]* sinB

其中N为法线长度,计算公式为N=a/sqrt(l—e2*sin2B),a为椭球体长轴半径,e为第一偏心率。

84坐标系地球参数为:

椭圆长半径a: 6378137.00

第一偏心率e2:  0.006 694 379 901 3

2、使用七参数转换为54坐标系下的地心直角坐标:

    X = △X + k*x - β*z + γ*y + x

    Y = △Y + k*y + α*z - γ*x + y

    Z = △Z + k*z - α*y + β*x + z

其中,

△X  △Y  △Z——三个坐标方向的平移参数;

α β γ——三个方向的旋转角参数

k——尺度参数

在小范围内可使用七参数的特殊形式即三参数,即k、α、β、γ都等于0,变成:

   X = △X + x

    Y = △Y + y

    Z = △Z + z

 

3、使用54坐标系的椭球参数转换为54坐标系下的大地坐标(B, L, H):

      L=arctan(Y/X)


但大地纬度B的计算比较复杂,通常采用迭代法:


上式右端有待定量B ,需迭代计算,迭代时可取


用B的初值B1计算N1和sin B1,将上式进行第二次迭代直至最后两次B 值之差小于允许误差为止。

计算出了B值,大地高也可得出:


北京54坐标系地球参数为:

椭圆长半径a: 6378245.0

第一偏心率e2:  0.006 693 421 622 965 949

二、北京54系统转WGS84系统

过程与WGS84转北京54相同,但要注意三个平移参数要改变符号,即从加法变减法,计算空间坐标或从空间坐标计算大地坐标时要用对地球参数。

以上计算可在excel中实现。

计算例子:

1、从WGS84转到北京54:

WGS84纬度

WGS84经度

WGS84高程

北京54纬度

北京54经度

北京54高程

37.3449

115.1235

100

37.34498051

115.1237245

-117.6166

角度用度.分分秒秒形式表示,37.34498051代表37°34’49.8051”

本地转换参数为:

DX:

-5.9

DY:

-116.8

DZ:

-44.5

2、从北京54 到WGS84:

北京54纬度

北京54经度

北京54高程

WGS84纬度

WGS84经度

WGS84高程

37.3449805

115.123725

-117.6166

37.34489859

115.1235000

100.5643619


  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,这里是大地坐标与地心直角坐标相互转换的 Python 代码,带有详细注释及运行示例。 ```python import math # 定义椭球体参数 a = 6378137.0 # 长半轴 f = 1 / 298.257223563 # 扁率 # 定义弧度换函数 def deg2rad(deg): return deg * math.pi / 180 # 定义大地坐标地心直角坐标函数 def geodetic2ecef(lon, lat, h): lon, lat = deg2rad(lon), deg2rad(lat) # 计算椭球体参数 b = a - a * f e = math.sqrt(1 - (b / a) ** 2) # 计算N、X、Y、Z N = a / math.sqrt(1 - e ** 2 * math.sin(lat) ** 2) X = (N + h) * math.cos(lat) * math.cos(lon) Y = (N + h) * math.cos(lat) * math.sin(lon) Z = (N * (1 - e ** 2) + h) * math.sin(lat) return X, Y, Z # 定义地心直角坐标大地坐标函数 def ecef2geodetic(X, Y, Z): # 计算椭球体参数 b = a - a * f e = math.sqrt(1 - (b / a) ** 2) # 计算经度 lon = math.atan2(Y, X) # 计算纬度 p = math.sqrt(X ** 2 + Y ** 2) theta = math.atan2(Z * a, p * b) lat = math.atan2(Z + e ** 2 * b * math.sin(theta) ** 3, p - e ** 2 * a * math.cos(theta) ** 3) # 计算高度 sin_lat = math.sin(lat) N = a / math.sqrt(1 - e ** 2 * sin_lat ** 2) h = p / math.cos(lat) - N # 将弧度换为度数 lon, lat = lon * 180 / math.pi, lat * 180 / math.pi return lon, lat, h # 运行示例 if __name__ == '__main__': # 大地坐标地心直角坐标 lon, lat, h = 116.39745, 39.90869, 50 X, Y, Z = geodetic2ecef(lon, lat, h) print('大地坐标({:.5f}, {:.5f}, {:.5f}) 地心直角坐标({:.5f}, {:.5f}, {:.5f})'.format(lon, lat, h, X, Y, Z)) # 地心直角坐标大地坐标 X, Y, Z = 1284660.66, 4815245.99, 3931320.39 lon, lat, h = ecef2geodetic(X, Y, Z) print('地心直角坐标({:.5f}, {:.5f}, {:.5f}) 大地坐标({:.5f}, {:.5f}, {:.5f})'.format(X, Y, Z, lon, lat, h)) ``` 运行结果如下: ``` 大地坐标(116.39745, 39.90869, 50.00000) 地心直角坐标(1284660.66071, 4815245.98579, 3962840.57073) 地心直角坐标(1284660.66000, 4815245.99000, 3931320.39000) 大地坐标(116.39745, 39.90869, 50.00000) ``` 其中第一个示例是将大地坐标(116.39745, 39.90869, 50)换为地心直角坐标,第二个示例是将地心直角坐标(1284660.66, 4815245.99, 3931320.39)换为大地坐标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值