# 高斯坐标正反算算法 # 在正算的时候,y的第一个数字表示是用几度带换算的,第二个数字和第三个数字表示带号 # 该程序是根据武汉大学出版社出版的第三版的《大地测量学基础》编写 # 用于课程实验学习
下面以克氏椭球参数3度带为例进行编程,需要详细的所有的3度带和6度带的各种椭球参数的高斯投影正反算程序代码,可以在本人的上传资料中下载
正算代码:采用的是克氏椭球参数
import math as m
P = 180 / m.pi * 3600 # 1弧度的秒数常数值,1弧度=180/pi=57.29578*3600=206264.80624709636
def GetGS_ZS_KS_3(b, L):
# 克氏椭球高斯正算
l = (L - Get3DL0(L)[0]) * 3600 / P
cos2b = m.pow(m.cos(m.radians(b)), 2)
N = 6399698.902 - (21562.267 - (108.973 - 0.612 * cos2b) * cos2b) * cos2b # P.187
a0 = 32140.404 - (135.3302 - (0.7092 - 0.0040 * cos2b) * cos2b) * cos2b
a4 = (0.25 + 0.00252 * cos2b) * cos2b - 0.04166
a6 = (0.166 * cos2b - 0.084) * cos2b
a3 = (0.3333333 + 0.001123 * cos2b) * cos2b - 0.1666667
a5 = 0.0083 - (0.1667 - (0.1968 + 0.0040 * cos2b) * cos2b) * cos2b
x = 6367558.4969 * b * 3600 / P - (a0 - (0.5 + (a4 + a6 * m.pow(l, 2)) * m.pow(l, 2)) * m.pow(l, 2) * N) * m.sin(
m.radians(b)) * m.cos(m.radians(b))
y = (1 + (a3 + a5 * m.pow(l, 2)) * m.pow(l, 2)) * l * N * m.cos(m.radians(b)) + Get3DL0(L)[
1] * 1000000 + 500000 + 300000000
# 坐标加3度带带号,y坐标西移500000M,加3000000000在开头第一个数字为3,表示为是三度带的转换
return x, y
反算代码:采用的是克氏椭球参数
def GetGS_FS_KS_3(x, y, L0):
# 克氏椭球高斯反算
y = y - L0 / 3 * 1000000 - 500000 - 300000000 # 去掉带号和y坐标恢复东移500000M
bT = x / 6367558.4969 # bT=x/6367558.4969*P 得到是秒数,不乘P直接得到弧度数值
beta = x / 6367558.4969 * P # 得到是秒数
cos2bT = m.pow(m.cos(bT), 2)
Bf = (beta + (50221746 + (293622 + (2350 + 22 * cos2bT) * cos2bT) * cos2bT) * m.pow(10, -10) * m.cos(bT) * m.sin(bT)*P)/P
cos2Bf = m.pow(m.cos(Bf), 2)
Nf = 6399698.902 - (21562.267 - (108.973 - 0.612 * cos2Bf) * cos2Bf) * cos2Bf
Z = y / (Nf * m.cos(Bf))
b2 = (0.5 + 0.003369 * cos2Bf) * m.sin(Bf) * m.cos(Bf)
b3 = 0.333333 - (0.166667 - 0.001123 * cos2Bf) * cos2Bf
b4 = 0.25 + (0.16161 + 0.00562 * cos2Bf) * cos2Bf
b5 = 0.2 - (0.1667 - 0.0088 * cos2Bf) * cos2Bf
b = (Bf * P - (1 - (b4 - 0.12 * m.pow(Z, 2)) * m.pow(Z, 2)) * m.pow(Z, 2) * b2 * P) / 3600.0
l = ((1 - (b3 - b5 * m.pow(Z, 2)) * m.pow(Z, 2)) * Z * P) / 3600.0
L = L0 + l
return b, L
测试数据如下:
正算:
print("程序运行示例如下:")
print("高斯投影正算,克氏椭球参数,用3度带表示,最前面有一个3表示带的种类(小数点前有九位数):")
print("输入B,L")
print(GetGS_ZS_KS_3(30.5, 114 + 1 / 3))
反算:
print("高斯投影反算,克氏椭球参数,带有三度带带号,最前面还有一个3表示带的种类(小数点前有九位数):")
print("第一个和第二个参数分别是x,y,第三个输入的参数是中央子午线")
print(GetGS_FS_KS_3(3375648.958456849, 338532000.2685031, 114))
运行结果如下:
正算:
程序运行示例如下:
高斯投影正算,克氏椭球参数,用3度带表示,最前面有一个3表示带的种类(小数点前有九位数):
输入B,L
(3375648.958456849, 338532000.2685031)
反算:
高斯投影反算,克氏椭球参数,带有三度带带号,最前面还有一个3表示带的种类(小数点前有九位数):
第一个和第二个参数分别是x,y,第三个输入的参数是中央子午线
(30.500000005448364, 114.33333333335709)