python2利用wxpython生成投影界面工具的图文详解

 更新时间:2021年04月21日 10:34:27   作者:toto+  
这篇文章主要介绍了python2利用wxpython生成投影界面工具的图文详解,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

本投影界面工具的功能:

准备好.prj投影文件,将输入文件夹内的WGS84经纬度坐标shp文件,投影为平面文件,成果自动命名为prj_***并新建在输入文件夹同一路径下。

下一步目标:

利用pyinstaller或其他打包库生成exe文件,目前停滞在python2语法、arcpy打包出错相关问题上。

参考文献:

《Using Py2exe with Arcpy- It can be done easily!》

《如何使用py2exe打包arcpy脚本?》

GUI界面示意图

投影文件所在文件夹结构如下:

                 

GUI代码

# -*- coding: utf-8 -*-
# =============================================================================
#                   输入文件——点选、复制、拖拽
#                   选择待投影的文件夹、投影文件所在文件夹
# =============================================================================
"""
Created on Thu Feb  4 16:12:00 2021
@author: zhutong
"""
 
import wx
from Def_Projection_common_E import createPrjFile,projection
#创建应用程序对象
app = wx.App()
 
 
#自定义窗口类MyFrame
class MyFrame(wx.Frame):
    
    def __init__(self):
        
        super(MyFrame,self).__init__(None,title="通用经纬度转平面坐标工具",pos=(600,500),size=(600,300))#Python2语法
        
        panel = wx.Panel(parent=self)#创建面板对象
        
        self.statictext_shp = wx.StaticText(parent=panel,label="待投影数据所在文件夹",pos=(60,30))#创建静态文本对象
        self.statictext_shp = wx.StaticText(parent=panel,label="投影文件所在文件夹",pos=(60,80))#创建静态文本对象
 
        self.shp_text = wx.TextCtrl(parent=panel,value="",pos=(60,50),size=(350,25))#【文本控件1】        
        open_shp_button = wx.Button(parent=panel, label='打开',pos=(430,50))#【按钮控件1】
 
 
        
        self.prj_text = wx.TextCtrl(parent=panel,value="",pos=(60,100),size=(350,25))#【文本控件2】
        open_prj_button = wx.Button(parent=panel, label='打开',pos=(430,100))#【按钮控件2】
        
        projection_button = wx.Button(parent=panel, label='平面投影',pos=(150,150),size=(180,30))#【按钮控件3】
        
        self.Bind(wx.EVT_BUTTON, self.onButton_opendir, open_shp_button)#绑定事件1——打开文件夹
        
        self.Bind(wx.EVT_BUTTON, self.onButton_opendir, open_prj_button)#绑定事件2——打开文件夹
        
        self.Bind(wx.EVT_BUTTON, self.onButton_projection, projection_button)#绑定事件3——投影
 
        self.Bind(wx.EVT_TEXT, self.inputText, self.shp_text)#绑定事件4——直接在文本框输入路径
 
        self.Bind(wx.EVT_TEXT, self.inputText, self.prj_text)#绑定事件4——直接在文本框输入路径              
 
    def onButton_opendir(self,control):#在事件源(控件)上产生特定事件(左键单击)后的处理程序        
        # Create open file dialog
        openDirDialog = wx.DirDialog(parent=self, message="选择一个文件夹", defaultPath="", style=wx.DD_DEFAULT_STYLE)
         
        openDirDialog.ShowModal()
        self.path = openDirDialog.GetPath()        
        print(self.path)
        
        openDirDialog.Destroy()
        control.SetValue(self.path)#将路径显示在文本框1中
 
    def inputText(self,control):
        self.path = control.GetValue()
 
    def onButton_projection(self,event):
        inWorkspace = self.shp_text.GetValue()
        prjdir = self.prj_text.GetValue()
        prjWorkspace = createPrjFile(inWorkspace,add_str="prj_")#新建投影成果根目录prjWorkspace
        projection(inWorkspace,prjdir,prjWorkspace)
    
if __name__ == "__main__":
    # #创建窗口对象
    frm = MyFrame()
    # #显示窗口
    frm.Show()       
    
    #进入主事件循环
    app.MainLoop()

功能正确,但提示有冗余报错

平面投影代码

# coding=utf-8
# ---------------------------------------------------------------------------
#
#                 为文件夹内所有城市的经纬度shp生成对应的平面shp
#                   注意文件夹内所有路径须为英文路径,python2
#
# ---------------------------------------------------------------------------
#注意西安和香港
import arcpy
import os,re
import time
#os,arcpy文件覆盖写
arcpy.env.overwriteOutput = True  #启用覆盖地理处理操作的输出
 
inWorkspace = r'D:\PythonCode_E3DCM\01Data\04BackPoiProcess\02POI\POI_4'#待投影根目录【运行前确认修改!】
prjdir = r'D:\PythonCode_E3DCM\01Data\prjFile'#投影文件所在路径
 
 
##判断是否为shp文件
def isShapefile(file_name):
    if ".shp" in file_name and ".xml" not in file_name:
        flag = True
    else:
        flag = False
    return flag
 
##建立对应投影成果文件夹——绝对路径中【叶子节点】文件夹前加"add_str"
def createPrjFile(file_dir,add_str):
    dir_name,base_name = os.path.split(file_dir)#如果路径末有//,则输出路径和为空文件名
    #print dir_name
    #print base_name
    prj_file_dir = os.path.join(dir_name,add_str + base_name)
    if os.path.exists(prj_file_dir) == False:
        os.mkdir(prj_file_dir)
    print prj_file_dir + u" 文件夹新建成功!"
    return prj_file_dir
 
#返回一个文件在投影文件列表中匹配的投影文件
def prjMatch(shp_dir,prjdir):#shp_dir最好为绝对路径,1文件夹或2文件名匹配投影文件均可行
    #打印作为参数输入的shp路径
    print "\nshp_dir:\n" + shp_dir.lower()
    prjfile_ls = os.listdir(prjdir)
    #city_ls = [i.replace(suffix,"") for i in os.listdir(prjdir)]
    
    #检查城市名是否有包含的情况,如香港xinggang包含西安xian
    for prjfile in prjfile_ls:
 
        suffix = ".prj"
        city = prjfile.replace(suffix,"")
        
        if city.lower() in shp_dir.lower():
            print city          
            
            #排除特殊城市西安xian【有错误!】
            if ("xian" in shp_dir.lower()) and ("xianggang" not in shp_dir.lower()):
                print "xian branch prj"
                return os.path.join(prjdir,"xian.prj")
            
            elif "xianggang" in shp_dir.lower():
                print "xianggang branch prj"
                return os.path.join(prjdir,"xianggang.prj")
 
            else:#忽略shp_dir中城市名大小写
                prjfile_dir = os.path.join(prjdir,prjfile)
                print "Ordinary branch:\n" + prjfile_dir + "\n"
                return prjfile_dir
 
        #else:
            #print "prj match fail!"
        
#如果列表中的元素是字符串,判断任一元素不被包含在其他元素中
 
num_shp = 0
num_shp_ok = 0
num_shp_fail = 0
##针对文件夹内shp,建立对应所在投影文件夹、并投影
#参数:inWorkspace待投影成果根目录,ini_root(=inWorkspace)新建投影文件夹替换字符用
def projection(inWorkspace,prjdir,prjWorkspace):#递归函数的参数只能是变量参数
    
    global num_shp
    global num_shp_ok
    global num_shp_fail
 
    file_names = os.listdir(inWorkspace)
 
    for file_name in file_names:#文件或文件夹名,不是绝对路径
        file_dir = os.path.join(inWorkspace,file_name)#待投影文件的绝对路径
 
        if os.path.isdir(file_dir):#判断是否为文件夹
 
            #建立对应投影成果文件夹
            prjSubfolder= file_dir.replace(inWorkspace,prjWorkspace)
            if os.path.exists(prjSubfolder) == False:
                os.mkdir(prjSubfolder)
 
            #inWorkspace = file_dir#将当前文件夹当作根目录
 
            projection(file_dir,prjdir,prjSubfolder)#递归
 
        else:
            if isShapefile(file_name):
                print "file_name:"+file_name
                #投影成果shp的绝对路径
                prj_file_dir = file_dir.replace(inWorkspace,prjWorkspace)
                #print prj_file_dir
                
                #投影文件prj的绝对路径                
                prjfile_dir = prjMatch(file_dir,prjdir)
                #print prjfile_dir
                #如果投影成果不存在(6个文件),再投影
                try:
                    arcpy.Project_management(file_dir, prj_file_dir, prjfile_dir)
                    #prj_file_dir投影成果shp文件的路径,prjfile_dir投影文件的路径
                    num_shp_ok += 1
                    print file_dir + u"投影成功!"
                except:
                    num_shp_fail += 1
                    print file_dir + u"投影失败!"
 
            else:
                pass
                #print "Srange ERROR in: "+file_dir
 
    print inWorkspace + u" 文件夹投影完成!"#注意不是局部变量inWorkspace
    print str(num_shp_ok) + u"shp文件投影成功!"
    print str(num_shp_ok) + u"shp文件投影失败!"
 
##    return paths
if __name__ == '__main__':
    time_start=time.time()
    prjWorkspace = createPrjFile(inWorkspace,add_str="prj_")#新建投影成果根目录prjWorkspace
    projection(inWorkspace,prjdir,prjWorkspace)
    time_end=time.time()
    print u'投影耗时:{:.2f}min'.format((time_end-time_start)/60)

附录:在python2中调试wxpython,界面一闪而过的解决办法:

到此这篇关于python2利用wxpython生成投影界面工具的图文详解的文章就介绍到这了,更多相关python投影界面工具内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python3网络爬虫之使用User Agent和代理IP隐藏身份

    Python3网络爬虫之使用User Agent和代理IP隐藏身份

    这篇文章主要介绍了Python3网络爬虫之使用User Agent和代理IP隐藏身份,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • YOLOv5车牌识别实战教程(八)Web应用与API开发

    YOLOv5车牌识别实战教程(八)Web应用与API开发

    这篇文章主要介绍了YOLOv5车牌识别实战教程(八)Web应用与API开发,在这个教程中,我们将一步步教你如何使用YOLOv5进行车牌识别,帮助你快速掌握YOLOv5车牌识别技能,需要的朋友可以参考下
    2023-04-04
  • Python3多进程 multiprocessing 模块实例详解

    Python3多进程 multiprocessing 模块实例详解

    这篇文章主要介绍了Python3多进程 multiprocessing 模块,结合实例形式详细分析了Python3多进程 multiprocessing 模块的概念、原理、相关方法使用技巧与注意事项,需要的朋友可以参考下
    2018-06-06
  • 解决tensorboard多个events文件显示紊乱的问题

    解决tensorboard多个events文件显示紊乱的问题

    今天小编就为大家分享一篇解决tensorboard多个events文件显示紊乱的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python Django框架实现web端分页呈现数据

    python Django框架实现web端分页呈现数据

    这篇文章主要介绍了python Django框架实现web端分页呈现数据,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • python用户管理系统的实例讲解

    python用户管理系统的实例讲解

    下面小编就为大家分享一篇python用户管理系统的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • 使用matplotlib修改坐标轴,将y轴的间距设置为某一个值

    使用matplotlib修改坐标轴,将y轴的间距设置为某一个值

    这篇文章主要介绍了使用matplotlib修改坐标轴,将y轴的间距设置为某一个值方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • python虚拟环境迁移方法

    python虚拟环境迁移方法

    今天小编就为大家分享一篇python虚拟环境迁移方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python如何读写字节数据

    Python如何读写字节数据

    这篇文章主要介绍了Python如何读写字节数据,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • python 6行代码制作月历生成器

    python 6行代码制作月历生成器

    这篇文章主要介绍了python如何用6行代码制作月历生成器,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-09-09

最新评论