刚发了【办公自动化】基于Arcpy建立GIS三调转换工具箱,23万图斑shp文件分分钟转换完成 ,来聊聊这个GIS工具箱是怎么制作的。
1、准备python文件
首先得有一个写好的python代码文件,俗称脚本文件。
ArcGIS自10.0以来抛弃了VBA,配上了高端大气的python(是2.7没有3.x版本好用),用起来Python确实比VBA好用多了,强烈推荐AutoCAD和Office也更新一下!
代码需要保存成一个py文件
看看代码:
#!/usr/bin/env python
# coding:utf-8
# 工具箱发布公众号:规划酱
# 有使用问题请至公众号反应
import arcpy
ly_name = arcpy.GetParameterAsText(0) #arcpy函数,获取GIS工具的参数,获取图层
bz_name = arcpy.GetParameterAsText(1) #arcpy函数,获取GIS工具的参数,获取用地标准的名称
arcpy.AddMessage(u'> 添加字段 ..') # arcpy函数,发送一个信息,提示进度
arcpy.AddField_management(ly_name,'layer',"TEXT") #arcpy函数,在shp文件的属性表里增加三个字段
arcpy.AddField_management(ly_name,'ydbm',"TEXT")
arcpy.AddField_management(ly_name,'ydmc',"TEXT")
#这里选择标准,用地标准采用字典形式,结构是{‘三调编码’:[‘用地编码’,‘用地名称’]},
#字典是通过代码在GIS中读取Excel对照表生成的,汉字在GIS里显示为Unicode代码
if bz_name == u'国家标准':
dzb_table = {u'0810A': [u'1103', u'\u5e7f\u573a\u7528\u5730'], ...} #字典有60个key太长了省略了
elif bz_name == u'江苏村庄标准':
dzb_table = {u'0810A': [u'1303', u'\u5e7f\u573a\u7528\u5730'],...}
elif bz_name == u'南京村庄标准':
dzb_table = {u'0810A': [u'1203', u'\u5e7f\u573a\u7528\u5730'],...}
n = 0.0 #python 2.7 要浮点运算得有小数
getcount = arcpy.GetCount_management(ly_name) #arcpy函数,获得属性表的统计数
count = int(getcount.getOutput(0)) #arcpy函数,把属性表的列长度输出
arcpy.AddMessage(u'> 转换'+ ly_name + u'数据 ..') #提示转换开始
table1 = arcpy.UpdateCursor(ly_name) #arcpy函数,获取并编辑属性表,函数会占用shp文件
for row in table1: #标准格式,遍历表
sd = row.DLBM
if 'K' in sd: #把带K的三调编码中的K去掉
sd = sd[:-1]
row.layer = dzb_table[sd][0]+dzb_table[sd][1] #编码+名称
row.ydbm = dzb_table[sd][0] #用地编码
row.ydmc = dzb_table[sd][1] #用地名称
table1.updateRow(row)
n += 1
if n/int(count/100) % 10 == 0: #把数量换算成百分比,每10%显示一次
arcpy.AddMessage('> '+str(int(n/int(count/100)))+'% ..')
arcpy.AddMessage('== ' +str(count)+u'个用地转换完成 ==') #提示完成
2、GIS中工具箱设置:
- 在工具箱中,右击我的工具箱 > 新建 > Python工具箱 / 工具箱(貌似没有区别)
- 给工具箱命名,然后右击工具箱 > 添加 > 脚本
-
弹出添加脚本提示框,输入名称、标签,建议勾选相对路径,点下一步
-
选择脚本文件,就是准备好的Python文件(.py文件)
-
设置需要输入的要素,第一个是 选择图层,数据类型选 要素图层,第二个是选择标准,数据类型选字符串,然后在下方过滤器中选值列表,可以自行编制下拉菜单内容,默认可以设置默认值。
-
双击打开就成了工具面板,第一个是选择图层,在GIS中选择要素图层,第二个是自己编的字符串,用来选择采用标准。这两个输入框与代码中开头的要素获取代码是对应的。
-
右击脚本工具> 项目描述 中进行项目描述编辑,显示在右侧帮助内容。
3、工具箱发布
- 右击脚本工具 >导入脚本,这样脚本就存入工具箱内部了,只能通过编辑菜单修改(文本编辑器)
- 右击工具箱> 另存为… 选择工具箱版本,选择存储位置,至此工具箱就生成了!
4、GIS中代码生成对照表
上面代码中每个用地标准都采用了一个字典来进行储存,里面全是Unicode编码,看着很复杂,怎么来的呢?
-
将对照表Excel放入GIS文件目录(GIS需保存一个.xls的老版本),将Excel的第一个table拖入图层中,我这里取名dzb,GIS自动加了个$,表中为了方便读取,把表头改成了英文xx_cord和xx_name。
-
打开GIS中的python窗口,工具箱后一个按钮。
-
输入以下代码:
import arcpy
nj_tb = {} #建立三个用地标准的字典
gb_tb ={}
js_tb = {}
table = arcpy.SearchCursor('dzb$') #读取这个excel表,表名字自己改
for row in table:
nj_tb[row.sd_cord] = [row.nj_cord,row.nj_name] #写入字典数据
js_tb[row.sd_cord] = [row.js_cord,row.js_name]
gb_tb[row.sd_cord] = [row.gb_cord,row.gb_name]
print('nanjin:', nj_tb) #显示结果
print('jiangsu:', js_tb)
print('guobiao:', gb_tb)
- 结果就出来了,确实很长,大括号{ }里的就是每个用地标准:
需要GIS工具箱的同学,
关注公众号回复“工具箱”,自动发送链接