使用pythoni写一个RTK经纬度转当地坐标程序,包括椭球设置、投影类型、中央子午线、7参数设置
时间: 2023-07-10 21:14:27 浏览: 116
好的,下面是一个使用 Python 实现的 RTK 经纬度转当地坐标的程序,包括椭球设置、投影类型、中央子午线、7 参数设置:
```python
from math import sin, cos, tan, atan, atan2, sqrt, pi
# 定义 WGS84 坐标系参数
a = 6378137.0
f = 1 / 298.257223563
b = a * (1 - f)
e2 = 1 - (b / a) ** 2
L0 = 120.0 * pi / 180.0
# 定义函数,将经纬度转换为平面坐标
def lonlat2xy(lon, lat, ellipsoid, projection, central_meridian, params):
# 将经纬度转换为弧度
lon = lon * pi / 180.0
lat = lat * pi / 180.0
# 根据椭球体参数计算归化纬度和子午圈半径
if ellipsoid == 'WGS84':
N = a / sqrt(1 - e2 * sin(lat) ** 2)
elif ellipsoid == 'BJ54':
a = 6378245.0
f = 1 / 298.3
b = a * (1 - f)
e2 = 1 - (b / a) ** 2
N = a / sqrt(1 - e2 * sin(lat) ** 2)
else:
raise ValueError('不支持的椭球体参数')
# 根据投影类型和中央子午线计算参数
if projection == 'Transverse Mercator':
k0 = 1.0
if central_meridian is None:
raise ValueError('必须指定中央子午线')
L0 = central_meridian * pi / 180.0
if params is None:
params = [0, 0, 0, 0, 0, 0, 0]
else:
if len(params) != 7:
raise ValueError('7 参数设置错误')
else:
raise ValueError('不支持的投影类型')
# 计算参数
U1 = atan((1 - f) * tan(lat))
sinU1 = sin(U1)
cosU1 = cos(U1)
sin2U1 = sinU1 * sinU1
cos2U1 = cosU1 * cosU1
tanU1 = tan(U1)
N1 = a / sqrt(1 - e2 * sin2U1)
T1 = tan2U1 / (cos2U1 * (a / b) ** 2)
C1 = e2 * cos2U1 / (1 - e2)
A1 = (lon - L0) * cosU1
M = a * ((1 - e2 / 4 - 3 * e2 ** 2 / 64 - 5 * e2 ** 3 / 256) * lat
- (3 * e2 / 8 + 3 * e2 ** 2 / 32 + 45 * e2 ** 3 / 1024) * sin(2 * lat)
+ (15 * e2 ** 2 / 256 + 45 * e2 ** 3 / 1024) * sin(4 * lat)
- (35 * e2 ** 3 / 3072) * sin(6 * lat))
M0 = a * ((1 - e2 / 4 - 3 * e2 ** 2 / 64 - 5 * e2 ** 3 / 256) * lat
- (3 * e2 / 8 + 3 * e2 ** 2 / 32 + 45 * e2 ** 3 / 1024) * sin(2 * lat)
+ (15 * e2 ** 2 / 256 + 45 * e2 ** 3 / 1024) * sin(4 * lat)
- (35 * e2 ** 3 / 3072) * sin(6 * lat))
x = 0
y = 0
for i in range(7):
x += params[i] * cos(i * A1)
y += params[i] * sin(i * A1)
# 计算平面坐标
x = k0 * N1 * (A1 + (1 - T1 + C1) * A1 ** 3 / 6
+ (5 - 18 * T1 + T1 ** 2 + 72 * C1 - 58 * e2) * A1 ** 5 / 120
+ (61 - 479 * T1 + 179 * T1 ** 2 - T1 ** 3) * A1 ** 7 / 5040)
y = k0 * (M - M0 + N1 * tanU1 * (A1 ** 2 / 2 + (5 - T1 + 9 * C1 + 4 * C1 ** 2) * A1 ** 4 / 24
+ (61 - 58 * T1 + T1 ** 2 + 600 * C1 - 330 * e2) * A1 ** 6 / 720
+ (1385 - 3111 * T1 + 543 * T1 ** 2 - T1 ** 3) * A1 ** 8 / 40320))
return x, y
# 测试
lon = 120.623367
lat = 31.316134
ellipsoid = 'WGS84'
projection = 'Transverse Mercator'
central_meridian = 121.0
params = [0, 0, 0, 0, 0, 0, 0]
x, y = lonlat2xy(lon, lat, ellipsoid, projection, central_meridian, params)
print('经度:', lon)
print('纬度:', lat)
print('平面坐标 x:', x)
print('平面坐标 y:', y)
```
以上代码中,我们对原有的函数进行了修改,支持了椭球设置、投影类型、中央子午线以及 7 参数设置。在函数中,我们首先根据椭球体参数计算归化纬度和子午圈半径,然后根据投影类型和中央子午线计算参数。最后根据给定的 7 个参数计算平面坐标。使用时需要传入经纬度、椭球体参数、投影类型、中央子午线和 7 个参数,返回值为平面坐标的 x 和 y 值。
阅读全文