高斯坐标正反算

测绘行业基础计算的代码,废话不多说,先介绍下基本原理。

一 高斯正反算基本原理

1 高斯投影坐标正算
(1)高斯投影正算:已知椭球面上某点的大地坐标(B,L),求该点在高斯投影平面上的直
角坐标(X,Y),即(B,L)-->(X,Y)的坐标变换。  
(2)投影变换必须满足的条件:
中央子午线投影后为直线; 
中央子午线投影后长度不变;  
投影具有正形性质,即正形投影条件。

(3)公式如下:

1 高斯投影坐标反算

(1)高斯投影反算:已知在高斯投影平面上的直
角坐标(X,Y),反求该点在椭球面上的大地坐标(B,L),即(X,Y)-->(B,L)的坐标变换。

(2)同正算一样,对投影函数提出三个条件:
x坐标轴投影成中央子午线,是投影的对称轴;
x轴上长度投影保持不变;
正形投影条件。

(3)反算公式

公式随手截的图,所以分辨率....

具体公式,学测绘的书上都有的

二 实现代码

其实这个小程序真要动手写起来难度不大,难的是算法原理的理解和公式中每个字母所代表的含义,以下是具体代码:

  1 import tkinter
  2 import tkinter.filedialog as fdg
  3 import re
  4 import math
  5
  6
  7
  8 """
  9 =================> 用户UI界面相关 <==================
 10 """
 11 root = tkinter.Tk()
 12 root.title(‘杨宇航-高斯正反算‘)
 13 root.resizable(width=False, height=False)
 14 root.geometry(‘500x700‘)
 15
 16
 17
 18
 19 # #   =============== 高斯正算UI界面 ==============
 20 # # 文本坐标文件导入
 21 label_wel_zheng = tkinter.Label(root,text=‘<高斯正算>‘,font=(‘黑体‘,16),fg=‘black‘)
 22 label_wel_zheng.place(x=185, y=10)
 23 label_open = tkinter.Label(root,text=‘1.请选择转化文件:‘,font=(‘黑体‘,10),fg=‘black‘)
 24 label_open.place(x=5, y=40)
 25 open_pth_Z = tkinter.Variable()
 26 entry_open = tkinter.Entry(root,width=59,textvariable=open_pth_Z).place(x=70, y=70)
 27 bot_open = tkinter.Button(root,width=8,height=1,text=‘导入文件‘,font=(‘黑体‘,9),fg=‘black‘,bg=‘orange‘,command=lambda :File_Open_Z())
 28 bot_open.place(x=5,y=70)
 29 # # 椭球选择
 30 label_glo = tkinter.Label(root,text=‘2.请选择椭球(填入相应椭球代号):‘,font=(‘黑体‘,10),fg=‘black‘)
 31 label_glo.place(x=5, y=100)
 32 glo_Z = tkinter.Variable()
 33 entry_glo = tkinter.Entry(root,textvariable=glo_Z).place(x=227,y=100)
 34 label_gloa = tkinter.Label(root,text=‘A:克拉索夫斯基椭球‘,font=(‘黑体‘,12),fg=‘black‘)
 35 label_gloa.place(x=5, y=125)
 36 label_glob = tkinter.Label(root,text=‘B:WGS-84椭球‘,font=(‘黑体‘,12),fg=‘black‘)
 37 label_glob.place(x=255, y=125)
 38 label_gloc = tkinter.Label(root,text=‘C:CGCS-2000椭球‘,font=(‘黑体‘,12),fg=‘black‘)
 39 label_gloc.place(x=5, y=155)
 40 label_glod = tkinter.Label(root,text=‘D:IUGG-75椭球‘,font=(‘黑体‘,12),fg=‘black‘)
 41 label_glod.place(x=255, y=155)
 42 # # 投影带选择
 43 label_num = tkinter.Label(root,text=‘3.请选择投影带(填入相应投影带代号):‘,font=(‘黑体‘,10),fg=‘black‘)
 44 label_num.place(x=5, y=190)
 45 num = tkinter.Variable()
 46 entry_num = tkinter.Entry(root,textvariable=num).place(x=255,y=190)
 47 label_num3 = tkinter.Label(root,text=‘A:三度带投影‘,font=(‘黑体‘,12),fg=‘black‘)
 48 label_num3.place(x=5, y=220)
 49 label_num6 = tkinter.Label(root,text=‘B:六度带投影‘,font=(‘黑体‘,12),fg=‘black‘)
 50 label_num6.place(x=255, y=220)
 51 # # 最终坐标文件保存
 52 label_save = tkinter.Label(root,text=‘4.请选择转化结果输出路径:‘,font=(‘黑体‘,10),fg=‘black‘)
 53 label_save.place(x=5,y=250)
 54 save_pth_Z = tkinter.Variable()
 55 entry_save = tkinter.Entry(root,width=59,textvariable=save_pth_Z).place(x=70, y=275)
 56 bot_save = tkinter.Button(root,width=8,height=1,text=‘保存文件‘,font=(‘黑体‘,9),fg=‘black‘,bg=‘orange‘,command=lambda :File_Save_Z())
 57 bot_save.place(x=5,y=275)
 58 # # 定义开始转换按钮及其他内容
 59 bot_start_Z = tkinter.Button(root,text=‘开始转化‘,font=(‘黑体‘,10),fg=‘white‘,bg=‘blue‘,command=lambda :Gaosi_Zheng())
 60 bot_start_Z.place(x=210, y=310)
 61 show1 = tkinter.Variable()
 62 label_show = tkinter.Label(root,textvariable=show1).place(width=480,height=42,x=5,y=333)
 63
 64
 65
 66
 67 # #   =============== 高斯反算UI界面 ==============
 68 # # 文本坐标文件导入
 69 label_open = tkinter.Label(root,text=‘<高斯反算>‘,font=(‘黑体‘,16),fg=‘black‘)
 70 label_open.place(x=185, y=380)
 71 label_open = tkinter.Label(root,text=‘1.请选择转化文件:‘,font=(‘黑体‘,10),fg=‘black‘)
 72 label_open.place(x=5, y=410)
 73 open_pth_F = tkinter.Variable()
 74 entry_open = tkinter.Entry(root,width=50,textvariable=open_pth_F).place(x=70, y=440)
 75 bot_open = tkinter.Button(root,width=8,height=1,text=‘导入文件‘,font=(‘黑体‘,9),fg=‘black‘,bg=‘orange‘,command=lambda :File_Open_F())
 76 bot_open.place(x=5,y=440)
 77 # # 椭球选择
 78 label_glo = tkinter.Label(root,text=‘2.请选择椭球(填入相应椭球代号):‘,font=(‘黑体‘,10),fg=‘black‘)
 79 label_glo.place(x=5, y=470)
 80 glo_F = tkinter.Variable()
 81 entry_glo = tkinter.Entry(root,textvariable=glo_F).place(x=227,y=470)
 82 label_gloa = tkinter.Label(root,text=‘A:克拉索夫斯基椭球‘,font=(‘黑体‘,12),fg=‘black‘)
 83 label_gloa.place(x=5, y=495)
 84 label_glob = tkinter.Label(root,text=‘B:WGS-84椭球‘,font=(‘黑体‘,12),fg=‘black‘)
 85 label_glob.place(x=255, y=495)
 86 label_gloc = tkinter.Label(root,text=‘C:CGCS-2000椭球‘,font=(‘黑体‘,12),fg=‘black‘)
 87 label_gloc.place(x=5, y=525)
 88 label_glod = tkinter.Label(root,text=‘D:1975国际椭球‘,font=(‘黑体‘,12),fg=‘black‘)
 89 label_glod.place(x=255, y=525)
 90 # # 最终坐标文件保存
 91 label_num = tkinter.Label(root,text=‘3.请选择文件输出路径:‘,font=(‘黑体‘,10),fg=‘black‘)
 92 label_num.place(x=5, y=560)
 93 save_pth_F = tkinter.Variable()
 94 entry_save = tkinter.Entry(root,width=59,textvariable=save_pth_F).place(x=70,y=590)
 95 bot_save = tkinter.Button(root,width=8,height=1,text=‘保存文件‘,font=(‘黑体‘,9),fg=‘black‘,bg=‘orange‘,command=lambda :File_Save_F())
 96 bot_save.place(x=5,y=590)
 97 # # 定义开始转换按钮及其他内容
 98 bot_start = tkinter.Button(root,text=‘开始转换‘,font=(‘黑体‘,10),fg=‘white‘,bg=‘blue‘,command=lambda :Gaosi_Fan())
 99 bot_start.place(x=210, y=620)
100 show2 = tkinter.Variable()
101 label_show = tkinter.Label(root,textvariable=show2).place(width=480,height=42,x=5,y=665)
102
103
104
105
106 """
107 =====================> 操作函数相关 <======================
108 """
109
110 # # 坐标文件显示函数
111 def File_Open_Z():
112     file_open_name = fdg.askopenfilename()
113     open_pth_Z.set(file_open_name)
114 def File_Open_F():
115     file_open_name = fdg.askopenfilename()
116     open_pth_F.set(file_open_name)
117
118 # # 椭球选择函数
119 def Ch_Glob_Z():
120     s = glo_Z.get()
121     if s == ‘A‘:
122         a = 6378245
123         e2 = 0.006693421622966
124         e_2 = 0.006738525414683
125     elif s == ‘B‘:
126         a = 6378137
127         e2 = 0.00669437999013
128         e_2 = 0.00673949674227
129     elif s == ‘C‘:
130         a = 6378137
131         e2 = 0.00669438002290
132         e_2 = 0.00673949677548
133     elif s == ‘D‘:
134         a = 6378140
135         e2 = 0.006694384999588
136         e_2 = 0.006739501219473
137     return [a, e2, e_2]
138
139 def Ch_Glob_F():
140     s = glo_F.get()
141     if s == ‘A‘:
142         a = 6378245
143         e2 = 0.006693421622966
144         e_2 = 0.006738525414683
145     elif s == ‘B‘:
146         a = 6378137
147         e2 = 0.00669437999013
148         e_2 = 0.00673949674227
149     elif s == ‘C‘:
150         a = 6378137
151         e2 = 0.00669438002290
152         e_2 = 0.00673949677548
153     elif s == ‘D‘:
154         a = 6378140
155         e2 = 0.006694384999588
156         e_2 = 0.006739501219473
157     return [a, e2, e_2]
158
159
160 # # 高斯正算主函数
161 def Gaosi_Zheng():
162     with open(open_pth_Z.get(), ‘r‘, encoding=‘utf-8‘) as f_open:
163         STR_LI = f_open.readlines()      # 最初数据读入列表
164     for i in STR_LI:
165         INT_list = list(eval(i))
166         L1 = INT_list[0]
167         B1 = INT_list[1]
168         # 投影带选择get
169         nnn = num.get()
170         if nnn == ‘A‘:
171             n = int(L1 / 3)
172             l = math.radians(L1 - n * 3)
173             L, B = math.radians(L1), math.radians(B1)
174             TUP = Ch_Glob_Z()
175             a = TUP[0]
176             e2 = TUP[1]
177             e_2 = TUP[2]
178         elif nnn == ‘B‘:
179             n = int(L1 / 6) + 1
180             l0 = 6 * n - 3
181             l = math.radians(L1 - l0)
182             L, B = math.radians(L1), math.radians(B1)
183             TUP = Ch_Glob_Z()
184             a = TUP[0]
185             e2 = TUP[1]
186             e_2 = TUP[2]
187         t = math.tan(B)
188         q = e_2 * (math.cos(B) ** 2)
189         # 高斯正算函数主体
190         # 计算X
191         m0 = a * (1 - e2)
192         m2 = (3 / 2) * e2 * m0
193         m4 = (5 / 4) * e2 * m2
194         m6 = (7 / 6) * e2 * m4
195         m8 = (9 / 8) * e2 * m6
196         a0 = m0 + (1 / 2) * m2 + (3 / 8) * m4 + (5 / 16) * m6 + (35 / 128) * m8
197         a2 = (1 / 2) * m2 + (1 / 2) * m4 + (15 / 32) * m6 + (7 / 16) * m8
198         a4 = (1 / 8) * m4 + (3 / 16) * m6 + (7 / 32) * m8
199         a6 = (1 / 32) * m6 + (1 / 16) * m8
200         a8 = (1 / 128) * m8
201         X1 = a0 * B - (1 / 2) * a2 * (math.sin(2 * B)) + (1 / 4) * a4 * (math.sin(4 * B)) - (1 / 6) * a6 * (
202             math.sin(6 * B)) + (1 / 8) * a8 * (math.sin(8 * B))
203
204         N = a / (math.sqrt(1 - e2*(math.sin(B)**2)))
205         X2 = (1 / 2) * N * math.sin(B) * math.cos(B) * (l ** 2)
206         X3 = (1 / 24) * N * (math.sin(B)) * (math.cos(B) ** 3) * (5 - t ** 2 + 9 * q + 4 * (q ** 2)) * (l ** 4)
207         X4 = (1 / 720) * N * (math.sin(B)) * (math.cos(B) ** 5) * (61 - 58 * t ** 2 + t ** 4) * (l ** 6)
208         X = (X1 + X2 + X3 + X4)  # X坐标通用值
209         X = round(X, 5)
210         Y1 = N * (math.cos(B)) * l
211         Y2 = (1 / 6) * N * (math.cos(B) ** 3) * (1 - t ** 2 + q) * (l ** 3)
212         Y3 = (1 / 120) * N * (math.cos(B) ** 5) * (5 - 18 * t ** 2 + t ** 4 + 14 * q - 58 * q * t ** 2) * (l ** 5)
213         Y = (Y1 + Y2 + Y3) + 500000 + (n * 1000000)  # Y坐标通用值
214         Y = round(Y, 5)
215         Q = str((X, Y))
216         with open(save_pth_Z.get(),‘a‘,encoding=‘utf-8‘) as f_save:   # 将转换成功的坐标文件存入用户所选路径
217             f_save.write(Q + ‘,‘)
218         show1.set(‘坐标转化成功!‘)
219
220 # # 高斯反算主函数
221 def Gaosi_Fan():
222     with open(open_pth_F.get(), ‘r‘, encoding=‘utf-8‘) as f:
223         ff = f.readlines()
224         a = eval(ff[0])
225         for i in a:
226             X = i[0]  # X 为 float 类型
227             st = str(i[1])
228             n = eval(re.findall(‘^..‘, st)[0])
229             Y = i[1] - n*1000000 - 500000
230             # 根据椭球选择相应的 a,e2,e_2
231             TUP = Ch_Glob_F()
232             a = TUP[0]
233             e2 = TUP[1]
234             e_2 = TUP[2]
235             m0 = a * (1 - e2)
236             m2 = (3 / 2) * e2 * m0
237             m4 = (5 / 4) * e2 * m2
238             m6 = (7 / 6) * e2 * m4
239             m8 = (9 / 8) * e2 * m6
240             a0 = m0 + (1 / 2) * m2 + (3 / 8) * m4 + (5 / 16) * m6 + (35 / 128) * m8
241             a2 = (1 / 2) * m2 + (1 / 2) * m4 + (15 / 32) * m6 + (7 / 16) * m8
242             a4 = (1 / 8) * m4 + (3 / 16) * m6 + (7 / 32) * m8
243             a6 = (1 / 32) * m6 + (1 / 16) * m8
244             a8 = (1 / 128) * m8
245             # 计算底点纬度 Bf
246             Bfi1 = X / a0
247             for i in range(100):
248                 Bfi = Bfi1
249                 FBi = -(a2 / 2) * math.sin(2 * Bfi) + (a4 / 4) * math.sin(4 * Bfi) - (a6 / 6) * math.sin(6 * Bfi)
250                 Bfi1 = (X - FBi) / a0
251                 if Bfi1 - Bfi < 0.00000000001:
252                     Bf = Bfi1
253             # 定义其他量 Nf, Mf, qf, tf
254             Nf = a / (math.sqrt(1 - e2*(math.sin(Bf)**2)))
255             Mf = (a*(1-e2)) / math.sqrt((1-e2*(math.sin(Bf)**2))**3)
256             tf = math.tan(Bf)
257             qf = e_2 * (math.cos(Bf))**2
258             # 纬度值 B
259             B1 = tf * (Y**2) / (2*Mf*Nf)
260             B2 = tf * (5+3*(tf**2)+(qf**2)-9*(qf**2)*(tf**2)) * (Y**4) / (24*Mf*(Nf**3))
261             B3 = tf * (61+90*(tf**2)+45*(tf**4)) * (Y**6) / (720*Mf*(Nf**5))
262             BB = Bf - B1 + B2 - B3
263             BB = math.degrees(BB) + 0.000001
264             B = round(BB,5)
265             # 经度值 L
266             L0 = 0
267             L1 = Y / (Nf*math.cos(Bf))
268             L2 = ((1+2*(tf**2)+qf**2)*(Y**3)) / (6*(Nf**3)*math.cos(Bf))
269             L3 = (5+28*(tf**2)+24*(tf**4)*(Y**5)) / (120*(Nf**5)*math.cos(Bf))
270             if n >= 12 and n <= 23:
271                 L0 = math.radians(6)*n - math.radians(3)
272             if n >= 24 and n <= 45:
273                 L0 = math.radians(3)*n
274             LL = L0 + L1 - L2 + L3
275             LL = math.degrees(LL) + 0.000001
276             L = round(LL,5)
277             A = (L, B)
278             END = str(A)
279             with open(save_pth_F.get(), ‘a‘, encoding=‘utf-8‘) as f_save:
280                 f_save.write(END + ‘,‘)
281             show2.set(‘坐标转化成功!‘)
282
283
284 # 最终计算结果输出函数
285 def File_Save_Z():
286     file_save_name = fdg.asksaveasfilename(
287     defaultextension = ‘.txt‘,              # 默认后缀名
288     filetypes = [(‘文本文件类型‘,‘*.txt‘),     # 下拉文件类型
289                 (‘其他类型‘,‘*.*‘)],
290     initialdir = ‘C:\\Users\\Desktop‘,      # 默认打开路径
291     initialfile = ‘text‘,                   # 默认文件保存名
292     title = ‘文件另存为‘
293     )
294     save_pth_Z.set(file_save_name)
295
296 def File_Save_F():
297     file_save_name = fdg.asksaveasfilename(
298         defaultextension = ‘.txt‘,              # 默认后缀名
299         filetypes = [(‘文本文件类型‘,‘*.txt‘),     # 下拉文件类型
300                     (‘其他类型‘,‘*.*‘)],
301         initialdir = ‘C:\\Users\\Desktop‘,      # 默认打开路径
302         initialfile = ‘text‘,                   # 默认文件保存名
303         title = ‘文件另存为‘
304     )
305     save_pth_F.set(file_save_name)
306
307
308
309 root.mainloop()

原文地址:https://www.cnblogs.com/skygrass0531/p/12298307.html

时间: 2024-10-04 15:39:50

高斯坐标正反算的相关文章

高斯坐标正反算程序运算步骤

第一步.选择原始坐标系为测点经纬度第二步.选择新坐标系为 高斯坐标第三歩.录入原始坐标数据第四歩.录入输出路径并OK核心代码:

GIS 空间分析案例教程-坐标高斯投影正反算

商务科技合作:向日葵,135-4855__4328,xiexiaokui#qq.com 特点: 1. 地理处理工具,可以与任何arcgis 工具和语言集成 2. 精度高,实测误差小于0.001mm 3. 兼容强,支持所有arcgis坐标系 4. 操作便,直接输入坐标,选择坐标系 5. 效率高,可以批处理文件 工具使用: 输入坐标:38129685.2416, 2816880.406199999 输入坐标系:CGCS2000_3_Degree_GK_Zone_38 输出坐标系:GCS_China_

经纬度坐标与高斯坐标的转换代码(转)

原文:http://www.cnblogs.com/SuperMagic/archive/2007/12/04/982817.html /* 功能说明: 将绝对高斯坐标(y,x)转换成绝对的地理坐标(wd,jd).        */// double y;     输入参数: 高斯坐标的横坐标,以米为单位 // double x;  输入参数: 高斯坐标的纵坐标,以米为单位// short  DH;     输入参数: 带号,表示上述高斯坐标是哪个带的// double *L;     输出参

高斯坐标

522994.430 3388020.940 17.870 3673522994.400 3388020.990 17.870 3786522994.370 3388021.040 17.870 3424522994.340 3388021.080 17.870 3532522994.310 3388021.130 17.870 4103522994.280 3388021.190 17.870 5619522994.250 3388021.230 17.870 4871522994.350 3

一条直线围绕着不是原点的点旋转后的坐标怎么算

方法一: 上图表示直线l1:y=kx+b绕点P(m,n)选装θ rad得到直线l2 由图可知,四边形PACB中∠ACB=2π-π/2-π/2-θ=π-θ,则直线l1旋转了θ rad 可得l2的斜率为tan(arctank+θ) 然后设l2的方程为y=tan(arctank+θ)+b' 利用PA=PB列方程,求出b'. (此方法无法计算垂直于Y轴的直线) 方法二: 直接求点B.C的坐标,然后用两点是求直线l2的方程

高斯投影正反算的代码

/高斯投影正.反算 //////6度带宽 54年北京坐标系 //高斯投影由经纬度(UnitD)反算大地坐标(含带号,Unit:Metres) void GaussProjCal(double longitude, double latitude, double *X, double *Y) {int ProjNo=0; int ZoneWide; ////带宽 double longitude1,latitude1, longitude0,latitude0, X0,Y0, xval,yval;

arcpy arcgis python实例教程--原点夹角距离定义线(坐标正算)

商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 此地理处理工具根据要素类中包含根据表的 x 坐标字段.y 坐标字段.方位角字段和距离字段中的值,计算线段终点的坐标 脚本BearingDistanceToCoord 工具使用方法 效果: 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 原文地址:https://www.cnblogs.com/xiexiaokui/p/11766417.h

高斯——克吕格投影反算

高斯—克吕格投影正算