準(zhǔn)備好.prj投影文件,將輸入文件夾內(nèi)的WGS84經(jīng)緯度坐標(biāo)shp文件,投影為平面文件,成果自動(dòng)命名為prj_***并新建在輸入文件夾同一路徑下。
利用pyinstaller或其他打包庫(kù)生成exe文件,目前停滯在python2語(yǔ)法、arcpy打包出錯(cuò)相關(guān)問(wèn)題上。
# -*- coding: utf-8 -*-
# =============================================================================
# 輸入文件——點(diǎn)選、復(fù)制、拖拽
# 選擇待投影的文件夾、投影文件所在文件夾
# =============================================================================
"""
Created on Thu Feb 4 16:12:00 2021
@author: zhutong
"""
import wx
from Def_Projection_common_E import createPrjFile,projection
#創(chuàng)建應(yīng)用程序?qū)ο?
app = wx.App()
#自定義窗口類(lèi)MyFrame
class 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 dialog
openDirDialog = 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_")#新建投影成果根目錄prjWorkspace
projection(inWorkspace,prjdir,prjWorkspace)
if __name__ == "__main__":
# #創(chuàng)建窗口對(duì)象
frm = MyFrame()
# #顯示窗口
frm.Show()
#進(jìn)入主事件循環(huán)
app.MainLoop()
# coding=utf-8
# ---------------------------------------------------------------------------
#
# 為文件夾內(nèi)所有城市的經(jīng)緯度shp生成對(duì)應(yīng)的平面shp
# 注意文件夾內(nèi)所有路徑須為英文路徑,python2
#
# ---------------------------------------------------------------------------
#注意西安和香港
import arcpy
import os,re
import time
#os,arcpy文件覆蓋寫(xiě)
arcpy.env.overwriteOutput = True #啟用覆蓋地理處理操作的輸出
inWorkspace = r'D:\PythonCode_E3DCM\01Data\04BackPoiProcess\02POI\POI_4'#待投影根目錄【運(yùn)行前確認(rèn)修改!】
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
##建立對(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 = 0
num_shp_ok = 0
num_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 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'投影耗時(shí):{:.2f}min'.format((time_end-time_start)/60)
到此這篇關(guān)于python2利用wxpython生成投影界面工具的圖文詳解的文章就介紹到這了,更多相關(guān)python投影界面工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!