使用arcpy批量刪除shp數據字段和添加字段


ArcPy

1.1 ArcPy介紹

ArcPy 是一個以成功的 arcgisscripting 模塊為基礎並繼承了 arcgisscripting 功能進而構建而成的站點包。目的是為以實用高效的方式通過 Python 執行地理數據分析、數據轉換、數據管理和地圖自動化創建基礎。

該包提供了豐富純正的 Python 體驗,具有代碼自動完成功能(輸入關鍵字和點即可獲得該關鍵字所支持的屬性和方法的彈出列表;從中選擇一個屬性或方法即可將其插入),並針對每個函數、模塊和類提供了參考文檔。

在 Python 中使用 ArcPy 的另一個主要原因是,Python 是一種通用的編程語言。Python 是一種支持動態輸入的解釋型語言,適用於交互式操作以及為稱為腳本的一次性程序快速制作原型,同時其具有編寫大型應用程序的強大功能。用 ArcPy 編寫的 ArcGIS 應用程序的優勢在於,可以使用由來自多個不同領域的 GIS 專業人員和程序員組成的眾多 Python 小群體開發的附加模塊。

推薦學習資料

1.2 ArcPy基本詞匯

術語 定義
Python Python 是由 Guido van Rossum 在上世紀八十年代末構想並於 1991 年推出的一種開源編程語言。Python 得到了不斷壯大的多元化用戶群體的支持,具備簡潔易讀、語法清晰、支持動態定型等特點,並且具有大量標准庫和第三方庫。
ArcPy ArcPy(通常稱為 ArcPy 站點包)為用戶提供了使用 Python 語言操作所有地理處理工具(包括擴展模塊)的接口,並提供了多種有用的函數和類,以用於處理和查詢 GIS 數據。使用 Python 和 ArcPy,可以開發出大量的用於處理地理數據的實用程序。
ArcPy 模塊 模塊為通常包含函數和類的 Python 文件。ArcPy 由一系列模塊支持,包括數據訪問模塊 (arcpy.da)、制圖模塊 (arcpy.mp)、ArcGIS Spatial Analyst extension 模塊 (arcpy.sa)、ArcGIS Image Analyst extension 模塊以及 ArcGIS Network Analyst extension 模塊 (arcpy.na)。
ArcPy 類 類的作用類似於建築設計藍圖。藍圖為如何創建事物提供了一個框架。類可用於創建對象,即通常所說的實例。ArcPy 類,如 SpatialReference 和 Extent 類,通常用作地理處理工具參數設置的快捷方式,否則的話,這些參數會使用更加復雜的字符串。
ArcPy 函數 函數是用於執行某項特定任務並能夠納入更大的程序的已定義功能。在 ArcPy 中,所有地理處理工具均以函數形式提供,但並非所有函數都是地理處理工具。除工具之外,ArcPy 還提供多種函數來更好地支持 Python 地理處理工作流。函數(通常稱為方法)可用於列出某些數據集、檢索數據集的屬性、在將表添加到地理數據庫之前驗證表名稱,或執行其他許多有用的腳本任務。
獨立 Python 腳本 獨立 Python 腳本是一種 .py 文件,可通過兩種方式執行:通過操作系統提示符,或 Python 集成開發環境 (IDE)。
Python 腳本工具 Python 腳本工具是已添加到地理處理工具箱的 Python 腳本。添加為腳本工具后,便可以像使用其他地理處理工具一樣使用此腳本工具 - 可以從工具對話框打開和執行、可以在 Python 窗口和 ModelBuilder 中使用,也可以從其他腳本和腳本工具中調用。
Python 窗口 通過 Python 窗口,用戶可以快捷地在 ArcGIS 內部使用 Python,從而以交互方式運行地理處理工具和功能以及充分利用其他 Python 模塊和庫。此窗口還為您學習 Python 提供了一個途徑。Python 窗口可用於執行單行 Python 代碼,並會將由此生成的消息輸出到窗口。借助此窗口,您可以對語法進行試驗和處理短代碼,並可以在大型腳本范圍之外對您的想法進行檢驗。
Python 工具箱 Python 工具箱是完全使用 Python 語言創建的地理處理工具箱。Python 工具箱及其所包含工具的外觀、操作和運行方式與任何以其他方式創建的工具箱和工具類似。Python 工具箱是一個具有 .pyt 擴展名的 Python 文件,用於定義工具箱以及一個或多個工具。

ArcGIS介紹及代碼分析

2.1 ArcGIS介紹

ArcGIS產品線為用戶提供一個可伸縮的,全面的GIS平台。ArcObjects包含了許多的可編程組件,從細粒度的對象(例如單個的幾何對象)到粗粒度的對象(例如與現有ArcMap文檔交互的地圖對象)涉及面極廣,這些對象為開發者集成了全面的GIS功能。

ArcGIS官網

2.2 主要涉及工具與方法

本程序主要使用如下工具

工具名稱 方法
DeleteFileds【刪除字段】 arcpy.DeleteField_management(input_data,delete_fields)
AddFileds【添加字段】 arcpy.AddField_management(input_data,field_Name,fields_Type,field_Length)方法介紹:['輸入數據','字段名稱','字段類型','字段長度']以上為TEXT字段輸入形式。arcpy.AddField_management(input_data,field_Name,fields_Type,field_Precision,field_Scale)以上為”FLOAT“或”DOUBLE“輸入形式,新的參數表示 [數據精度,小數點后位數]
DefineProjection【定義投影】 arcpy.DefineProjection_management(in_data,project)project參數為投影坐標系統

2.3 設計思路

首先調用制圖模塊arcpy.mapping讀取當前地圖文檔,然后將當前地圖文檔的Layers圖層轉化為Python List;我們要篩選不符合要求的字段,及要求建立的字段創建列表,通過循環分別調用工具即可實現批量生成標准字段的工作任務。

2.4 代碼展示

#生成標准國標字段 Version1.0 CopyRight by Mr Heisenberg
import arcpy
#打開地圖文檔
mymxd =arcpy.mapping.MapDocument("current")
ary =arcpy.mapping.ListLayers(mymxd)
'''
坐標系統解析
地理坐標系統:CGCS2000國家質心坐標系統
橢球體參數:
長半軸a:6378137.0,扁率α:1/298.257222101
投影坐標系統:Gauss_Kruger高斯克里格3°帶投影坐標
中央經線:117°
起始緯線:0°
單位:m
'''
cgcs2000_39="PROJCS['CGCS2000_3_Degree_GK_Zone_39',\
GEOGCS['GCS_China_Geodetic_Coordinate_System_2000',\
DATUM['D_China_2000',SPHEROID['CGCS2000',6378137.0,298.257222101]],\
PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]],\
PROJECTION['Gauss_Kruger'],PARAMETER['False_Easting',39500000.0],\
PARAMETER['False_Northing',0.0],PARAMETER['Central_Meridian',117.0],\
PARAMETER['Scale_Factor',1.0],PARAMETER['Latitude_Of_Origin',0.0],UNIT['Meter',1.0]]"
#刪除字段列表
delete_list=["YBZDDM","QSXZ","ZDSYQLX","PZMJ","TDJB","SBDJ","QDJG",\
"SFGY","BLC","PZYT","SJYT","QLSLQK","GMJJHYFLDM","JZZDMJ","JZZMJ","SYQSRQ",\
"SYQX","SYZZRQ","QTSM","QLXZ"]
#添加字段列表屬性
fields=[["ZL","TEXT",200],["ZDMJ","FLOAT",15,4],["MJDW","TEXT",2],["DJ","TEXT",2],\
		["JG","FLOAT",15,4],["YT","TEXT",4],["ZDT","TEXT",200],["QLSDFS","TEXT",2],\
        ["RJL","TEXT",20],["JZXG","FLOAT",5,2],["ZDSZD","TEXT",200],["ZDSZN","TEXT",200],\
		["ZDSZX","TEXT",200],["ZDSZB","TEXT",200],["DAH","TEXT",254],["BZ","TEXT",254],\
		["TFH","TEXT",50],["DJH","TEXT",20],["ZT","TEXT",2],["YTMC","TEXT",254],\
		["QXDM","TEXT",6],["QLXZ","TEXT",4]] 
#給特殊字段賦值
special_fields=["ZDBZ","ZDDZ","ZDNZ","ZDXZ","SZTFH","JZRJL","SCMJ","TDZL"]
#固定字段
fixed_fields=[["QLLX","5"],["QLXZ","200"],["QLSDFS","2"],["MJDW","1"],["YT","072"],["ZT","1"],\
["YTMC","農村宅基地"],["QXDM","131124"]]
#新生成字段
New_fields=["ZDSZB","ZDSZD","ZDSZN","ZDSZX","TFH","RJL","ZDMJ","ZL"]
#生成刪除集
delete_txt=""
for delete in delete_list:
	delete_txt+=delete+";"
for lyr in ary:
	in_table=lyr.dataSource
	if in_table.find(".shp")>0:
		arcpy.DeleteField_management(in_table,delete_txt)
		print("多余字段刪除完成!")
		for count in fields:
			if count[1]=="TEXT":
				print("名稱:{0}———— 類形:{1}———— 長度:{2}".format(count[0],count[1],count[2]))
arcpy.AddField_management(in_table,count[0],count[1],field_length=count[2])
			else:
				print("名稱:{0}———— 類形:{1}———— 精度:{2}———— 小數點位數:{3}".format(count[0],count[1],count[2],count[3]))
				arcpy.AddField_management(in_table,count[0],count[1],count[2],count[3])
		print("創建字段完成!")
		for field in fixed_fields:
			field_="\""+field[1]+"\""
			arcpy.CalculateField_management(in_table,field[0],field_, "VB")
		print("賦予字段固定值完成!")
		for i in range(len(special_fields)):
			field="["+special_fields[i]+"]"
			arcpy.CalculateField_management(in_table,New_fields[i],field,"VB")
			arcpy.DeleteField_management(in_table,special_fields[i])
		print("數據交換完成!")
		arcpy.DefineProjection_management(in_table,cgcs2000_39) 
		print("定義國家2000坐標系統完成!")
	else:
		next
del mymxd
arcpy.RefreshActiveView()
print("------標准字段完成------")

歡迎大家積極評論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM