python应用实例:北京城市地方坐标系向BJ54坐标系的变换程序【测绘&地质工作者福利】

python萌新+新晋研究僧一枚,课题需要,用python写了坐标转换程序,标注了新人在用tkinter模块的一些问题与陷阱,供萌新学习,供有需求者取用,大佬轻喷,转载请注明出处。
打包成exe的解压即用版程序(严格按使用方法使用)的神秘代码如下:
https://pan.baidu.com/s/1LnkxFKob_ZwDS8BaKEwPUw

python 3.6.5环境下写就,代码习惯略差惊恐好吧我承认我的ui没仔细做,毕竟是个自用程序,主要看内涵


Java带来的坏习惯,总喜欢写主程序,还特简单那种。。。大佬轻喷,惨不忍睹的main.py

main.py

import sys
from UI import Application
from coordinate import Coordinate,Coordinate_54
from fuction import run

app = Application()
app.master.title("坐标转换工具")  # 窗口标题
app.mainloop()  # 主消息循环

好吧我承认我的代码习惯很差,大佬轻喷,毕竟主业不是码农,抽时间自学而已。但只要有些基础的读懂没问题的,UI部分,需注意的陷阱注释标出,这才是真。。。。主程序
UI.py
class Coordinate():
    """坐标类基类按北京城市地方坐标系设置参数"""
    def __init__(self,coordinate_value):
        """参数写成字典方便拓展"""
        #转换参数
        self.P=284766.1483
        self.Q=455704.6404
        self.R=1.000019209
        self.S= -0.007318594343
       #字典赋值
        # self.coordinate_value={'xd':0,'yd':0}
        
class Coordinate_54(Coordinate):
    """54坐标系"""
    def __init__(self,coordinate_value):
        super().__init__(coordinate_value)
        self.coordinate_value=coordinate_value#知识漏洞,coordinate只是个形参并非属性!
        self.coordinate_value_54 = {'xbj54': 0, 'ybj54': 0}
    def transform(self):
        """转换程序"""
        # 转换因子
        P = float(self.P)
        Q = float(self.Q)
        R = float(self.R)
        S = float(self.S)
        # transform!
        xd = float(self.coordinate_value['xd'])
        yd = float(self.coordinate_value['yd'])
        ybj54 =( ((yd - Q) * R - (xd - P)*S) / (R **2 + S**2))+400000
        xbj54 = ((xd - P) + ybj54 * S) / R +4402923
        # 用字典存储
        self.coordinate_value_54['xbj54']=xbj54
        self.coordinate_value_54['ybj54']=ybj54

class Coordinate_2000(Coordinate):
    """2000坐标系"""
    def __init__(self,coordinate_value):
        super().__init__(coordinate_value)
        self.coordinate_value=coordinate_value

class Coordinate_84(Coordinate):
    """WGS84坐标系"""
    def __init__(self,coordinate_value):
        super().__init__(coordinate_value)
        self.coordinate_value=coordinate_value


其中涉及到的坐标系类,写在coordinate.py里(预留了两个类,做四参数法转2000用,虽然很难)
coordinate.py
class Coordinate():
    """坐标类基类按北京城市地方坐标系设置参数"""
    def __init__(self,coordinate_value):
        """参数写成字典方便拓展"""
        #转换参数
        self.P=284766.1483
        self.Q=455704.6404
        self.R=1.000019209
        self.S= -0.007318594343
       #字典赋值
        # self.coordinate_value={'xd':0,'yd':0}
        
class Coordinate_54(Coordinate):
    """54坐标系"""
    def __init__(self,coordinate_value):
        super().__init__(coordinate_value)
        self.coordinate_value=coordinate_value#知识漏洞,coordinate只是个形参并非属性!
        self.coordinate_value_54 = {'xbj54': 0, 'ybj54': 0}
    def transform(self):
        """转换程序"""
        # 转换因子
        P = float(self.P)
        Q = float(self.Q)
        R = float(self.R)
        S = float(self.S)
        # transform!
        xd = float(self.coordinate_value['xd'])
        yd = float(self.coordinate_value['yd'])
        ybj54 =( ((yd - Q) * R - (xd - P)*S) / (R **2 + S**2))+400000
        xbj54 = ((xd - P) + ybj54 * S) / R +4402923
        # 用字典存储
        self.coordinate_value_54['xbj54']=xbj54
        self.coordinate_value_54['ybj54']=ybj54

class Coordinate_2000(Coordinate):
    """2000坐标系"""
    def __init__(self,coordinate_value):
        super().__init__(coordinate_value)
        self.coordinate_value=coordinate_value

class Coordinate_84(Coordinate):
    """WGS84坐标系"""
    def __init__(self,coordinate_value):
        super().__init__(coordinate_value)
        self.coordinate_value=coordinate_value


版权声明:本文为better_call_Soul原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。