ArcGIS+Python實現矢量圖層批量字段添加
本方法解決按規定標准批量添加相應字段
一、代碼實現設想
只要通過添加原文件以及該文件對應的屬性結構表,就可以自動新建數據庫標准字段。
二、問題分析
以行政區為例,行政區屬性結構描述表:
序號 |
字段名稱 |
字段代碼 |
字段類型 |
字段長度 |
小數位數 |
值域 |
約束條件 |
備注 |
1 |
標識碼 |
BSM |
Int |
10 |
|
>0 |
M |
|
2 |
要素代碼 |
YSDM |
Char |
10 |
|
見表1 |
M |
|
3 |
行政區代碼 |
XZQDM |
Char |
12 |
|
見GB/T 2260 |
M |
見本表注1 |
4 |
行政區名稱 |
XZQMC |
Char |
100 |
|
非空 |
M |
|
5 |
行政區面積 |
XZQMJ |
Float |
15 |
2 |
>0 |
C |
見本表注2 |
該圖層要添加5個字段,主要設置參數有字段代碼、字段類型、字段長度,如果是浮點型,那么還會有一個小數位數。
接下來就是分析arcgis的AddField函數及其參數(工具幫助查看)
AddField_management(in_table,field_name,field_type,{field_precision},{field_scale}, {field_length},{field_alias},{field_is_nullable},{field_is_required},{field_domain})
可看到該方法有三個必須參數(in_table, field_name, field_type)及七個對應默認參數,我們用到的主要是五個參數(in_table, field_name, field_type,field_precision, field_scale),各個參數對應的詳細介紹參考Arcgis工具幫助:
觀察調整我們需要的字段及屬性,如int改為LONG,char改為TEXT,float改為FLOAT,調整后如下表:

(注:此表最好不要有空值,用NULL替代空缺)
三、代碼實現
reload(sys)
sys.setdefaultencoding("utf-8")
import xlrd
import xlwt
import arcpy
# 設置參數(pthon腳本導入arcgis中的兩個參數)
xlspath = arcpy.GetParameterAsText(1) #標准化后屬性結構表excel格式路徑
data = xlrd.open_workbook(xlspath)
table = data.sheets()[0]
for i in range(1,table.nrows):
row_content = [] # 初始化一個列表,用於后面存儲讀取的excel值
for j in range(table.ncols): # 遍歷excel每行中的各個值
ctype = table.cell(i, j).ctype # 定義每個值類型用於下面判斷
cell = table.cell_value(i, j) # 定義每個值用於下面判斷
if ctype == 1:
row_content.append(cell) # 如果值類型為字符型,將值加入讓面的列表
if ctype ==2 and cell%1 == 0:
cell = int(cell) # 如果值類型為浮點型,且除以1余數為0,轉為整數
row_content.append(cell) # 加入列表
# 將參數賦值給AddField工具所需的必要參數
field_name = str(row_content[1]) # 字段名:該行的第二個(列表索引從0開始)
field_type = str(row_content[2]) # 字段類型:該行第三個
fieldalias = str(row_content[5])
if field_type == 'FLOAT': # 如果字段類型為FLOAT,執行下面代碼,其他elif同理
fieldprecision = row_content[3] # 字段長度,該行第4個
fieldscale = row_content[4] # 小數位數,該行第五個
arcpy.AddField_management(in_table, field_name, field_type, field_precision = fieldprecision, field_scale = fieldscale, field_alias = fieldalias)
elif field_type == 'TEXT':
fieldlength = row_content[3]
arcpy.AddField_management(in_table, field_name, field_type, field_length = fieldlength, field_alias = fieldalias)
elif field_type == 'LONG':
fieldprecision = row_content[3]
arcpy.AddField_management(in_table, field_name, field_type, field_precision = fieldprecision, field_alias = fieldalias)
四:腳本工具展示
在arcgis中導入代碼並配置好腳本參數后,工具效果如下:
工具運行,目標文件字段如下所示:
只要if判斷的所有條件包含所有建庫字段標准,那么所有文件添加字段僅要點幾下即可完成,大大提升了工作效率。
說明:該腳本針對arcgis10版本,運用Python的arcpy模塊進行批量添加字段。
注:文中一些方法細節,如讀取excel文件模塊安裝及讀取excel方法、python腳本導入arcgis並設置參數等,沒作出詳細介紹,網絡上有很多方法,比如:http://www.cnblogs.com/lhj588/archive/2012/01/06/2314181.html關於python讀取excel的介紹,以及http://www.cnblogs.com/liweis/p/4252596.html關於arcgis添加python腳本方法,作者參考以上文章完善該過程。讀者如有興趣,亦可聯系QQ:961478034一起交流,希望更多相同愛好者共同進步。