python2利用wxpython生成投影界面工具的圖文詳解
本投影界面工具的功能:
準(zhǔn)備好.prj投影文件,將輸入文件夾內(nèi)的WGS84經(jīng)緯度坐標(biāo)shp文件,投影為平面文件,成果自動(dòng)命名為prj_***并新建在輸入文件夾同一路徑下。
下一步目標(biāo):
利用pyinstaller或其他打包庫(kù)生成exe文件,目前停滯在python2語(yǔ)法、arcpy打包出錯(cuò)相關(guān)問(wèn)題上。
參考文獻(xiàn):
《Using Py2exe with Arcpy- It can be done easily!》
《如何使用py2exe打包arcpy腳本?》
GUI界面示意圖
投影文件所在文件夾結(jié)構(gòu)如下:
GUI代碼
# -*- coding: utf-8 -*-# =============================================================================# 輸入文件——點(diǎn)選、復(fù)制、拖拽# 選擇待投影的文件夾、投影文件所在文件夾# ============================================================================='''Created on Thu Feb 4 16:12:00 2021@author: zhutong''' import wxfrom Def_Projection_common_E import createPrjFile,projection#創(chuàng)建應(yīng)用程序?qū)ο骯pp = wx.App() #自定義窗口類MyFrameclass MyFrame(wx.Frame):def __init__(self):super(MyFrame,self).__init__(None,title='通用經(jīng)緯度轉(zhuǎn)平面坐標(biāo)工具',pos=(600,500),size=(600,300))#Python2語(yǔ)法panel = wx.Panel(parent=self)#創(chuàng)建面板對(duì)象self.statictext_shp = wx.StaticText(parent=panel,label='待投影數(shù)據(jù)所在文件夾',pos=(60,30))#創(chuàng)建靜態(tài)文本對(duì)象self.statictext_shp = wx.StaticText(parent=panel,label='投影文件所在文件夾',pos=(60,80))#創(chuàng)建靜態(tài)文本對(duì)象 self.shp_text = wx.TextCtrl(parent=panel,value='',pos=(60,50),size=(350,25))#【文本控件1】open_shp_button = wx.Button(parent=panel, label=’打開(kāi)’,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=’打開(kāi)’,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——打開(kāi)文件夾self.Bind(wx.EVT_BUTTON, self.onButton_opendir, open_prj_button)#綁定事件2——打開(kāi)文件夾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):#在事件源(控件)上產(chǎn)生特定事件(左鍵單擊)后的處理程序# Create open file dialogopenDirDialog = wx.DirDialog(parent=self, message='選擇一個(gè)文件夾', 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_')#新建投影成果根目錄prjWorkspaceprojection(inWorkspace,prjdir,prjWorkspace) if __name__ == '__main__': # #創(chuàng)建窗口對(duì)象 frm = MyFrame() # #顯示窗口 frm.Show() #進(jìn)入主事件循環(huán) app.MainLoop()
功能正確,但提示有冗余報(bào)錯(cuò)
平面投影代碼
# coding=utf-8# ---------------------------------------------------------------------------## 為文件夾內(nèi)所有城市的經(jīng)緯度shp生成對(duì)應(yīng)的平面shp# 注意文件夾內(nèi)所有路徑須為英文路徑,python2## ---------------------------------------------------------------------------#注意西安和香港import arcpyimport os,reimport time#os,arcpy文件覆蓋寫(xiě)arcpy.env.overwriteOutput = True #啟用覆蓋地理處理操作的輸出 inWorkspace = r’D:PythonCode_E3DCM01Data04BackPoiProcess02POIPOI_4’#待投影根目錄【運(yùn)行前確認(rèn)修改!】prjdir = r’D:PythonCode_E3DCM01DataprjFile’#投影文件所在路徑 ##判斷是否為shp文件def isShapefile(file_name): if '.shp' in file_name and '.xml' not in file_name:flag = True else:flag = False return flag ##建立對(duì)應(yīng)投影成果文件夾——絕對(duì)路徑中【葉子節(jié)點(diǎn)】文件夾前加'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 #返回一個(gè)文件在投影文件列表中匹配的投影文件def prjMatch(shp_dir,prjdir):#shp_dir最好為絕對(duì)路徑,1文件夾或2文件名匹配投影文件均可行 #打印作為參數(shù)輸入的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【有錯(cuò)誤!】 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中城市名大小寫(xiě)prjfile_dir = os.path.join(prjdir,prjfile)print 'Ordinary branch:n' + prjfile_dir + 'n'return prjfile_dir #else: #print 'prj match fail!'#如果列表中的元素是字符串,判斷任一元素不被包含在其他元素中 num_shp = 0num_shp_ok = 0num_shp_fail = 0##針對(duì)文件夾內(nèi)shp,建立對(duì)應(yīng)所在投影文件夾、并投影#參數(shù):inWorkspace待投影成果根目錄,ini_root(=inWorkspace)新建投影文件夾替換字符用def projection(inWorkspace,prjdir,prjWorkspace):#遞歸函數(shù)的參數(shù)只能是變量參數(shù)global num_shp global num_shp_ok global num_shp_fail file_names = os.listdir(inWorkspace) for file_name in file_names:#文件或文件夾名,不是絕對(duì)路徑file_dir = os.path.join(inWorkspace,file_name)#待投影文件的絕對(duì)路徑 if os.path.isdir(file_dir):#判斷是否為文件夾 #建立對(duì)應(yīng)投影成果文件夾 prjSubfolder= file_dir.replace(inWorkspace,prjWorkspace) if os.path.exists(prjSubfolder) == False:os.mkdir(prjSubfolder) #inWorkspace = file_dir#將當(dāng)前文件夾當(dāng)作根目錄 projection(file_dir,prjdir,prjSubfolder)#遞歸 else: if isShapefile(file_name):print 'file_name:'+file_name#投影成果shp的絕對(duì)路徑prj_file_dir = file_dir.replace(inWorkspace,prjWorkspace)#print prj_file_dir#投影文件prj的絕對(duì)路徑prjfile_dir = prjMatch(file_dir,prjdir)#print prjfile_dir#如果投影成果不存在(6個(gè)文件),再投影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 pathsif __name__ == ’__main__’: time_start=time.time() prjWorkspace = createPrjFile(inWorkspace,add_str='prj_')#新建投影成果根目錄prjWorkspace projection(inWorkspace,prjdir,prjWorkspace) time_end=time.time() print u’投影耗時(shí):{:.2f}min’.format((time_end-time_start)/60)
附錄:在python2中調(diào)試wxpython,界面一閃而過(guò)的解決辦法:
到此這篇關(guān)于python2利用wxpython生成投影界面工具的圖文詳解的文章就介紹到這了,更多相關(guān)python投影界面工具內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. Android 實(shí)現(xiàn)徹底退出自己APP 并殺掉所有相關(guān)的進(jìn)程2. Vue實(shí)現(xiàn)仿iPhone懸浮球的示例代碼3. vue使用moment如何將時(shí)間戳轉(zhuǎn)為標(biāo)準(zhǔn)日期時(shí)間格式4. 一個(gè) 2 年 Android 開(kāi)發(fā)者的 18 條忠告5. js select支持手動(dòng)輸入功能實(shí)現(xiàn)代碼6. Spring的異常重試框架Spring Retry簡(jiǎn)單配置操作7. Android studio 解決logcat無(wú)過(guò)濾工具欄的操作8. 什么是Python變量作用域9. PHP正則表達(dá)式函數(shù)preg_replace用法實(shí)例分析10. vue-drag-chart 拖動(dòng)/縮放圖表組件的實(shí)例代碼
