免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 11104|回复: 69
收起左侧

[二次开发] Arcgis 的python二次开发 三调国土空间规划一键转换工具箱

    [复制链接]

2

主题

1120

铜板

6

好友

技术员

Rank: 3Rank: 3

积分
83
发表于 2021-6-3 09:51 | 显示全部楼层 |阅读模式
本帖最后由 William4251 于 2021-6-3 09:57 编辑

之前每次三调转国土都要手动通过字段计算器去一个一个修改,就很低效率,所以学了一下python,然后基于自然资源局的用地用海分类指南写的这个代码,主要有以下几个步骤,首先是新建字段,然后是对应的把三调里的DLTB图层的DLMC和DLBM字段内容转换到国土空间规划二级类和二级类代码,然后再推导出一级类代码。每次运行下来差不多15-30分钟,中间切忌不能碰它,一碰就容易出错误(Arcgis就是这么脆弱)。有一些国标里没有明确转换标准(例如城镇村道路用地)或者三调不会调的很细的就直接转到一级类大类(例如特殊用地、设施农用地、科教文卫用地、公用设施用地)。还有对于像铁路用地转换过去铁路用地和交通场站用地这个怎么分这种很主观的问题,现在我默认都是转换到铁路用地,希望大家用的时候提出宝贵意见,我就好建立一些细分的规则再改一版.

在使用代码之前要先确定一下ARCgis的版本,我的是目前破解的很完善的10.2。然后再检查一下DLTB图层的名称,转换前只能是DLTB,不能是"地类图斑"或者别的什么,转换后就可以随意改了。

评分

参与人数 3铜板 +12 收起 理由
wzq9812741 + 5 赞!
春江烟雨楼 + 2
dyxah + 5 好贴好报!

查看全部评分

20

主题

2万

铜板

23

好友

至尊VIP

Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24

积分
490
发表于 2021-6-23 08:05 手机频道 | 显示全部楼层
William4251 发表于 2021-6-4 09:58
总结一下这两天大家的问题:

1、由于工具箱本身已经有 import arcpy 那一行了,所以大家拷贝代码的时候 ...

好久没接触过三调还有这些东东了,我看这个主要工作基本都是添加字段和计算字段,其实用模型构建器会不会更简单一点,用python字典的键值对不行的话,感觉也可以考虑用Zip生成元组或列表嵌套。
回复 支持 1 反对 0

使用道具 举报

2

主题

1120

铜板

6

好友

技术员

Rank: 3Rank: 3

积分
83
 楼主| 发表于 2021-6-3 09:55 | 显示全部楼层
第一部分 添加字段

import arcpy
arcpy.AddField_management("DLTB","国土空间规划一级类代码","TEXT")
arcpy.AddField_management("DLTB","国土空间规划一级类","TEXT")
arcpy.AddField_management("DLTB","国土空间规划二级类代码","TEXT")
arcpy.AddField_management("DLTB","国土空间规划二级类","TEXT")

现在默认的这几个都是选的文本类型,如果有其他需求就改括号里的TEXT,例如双精度是改成 "Double"
回复 支持 反对

使用道具 举报

324

主题

56万

铜板

1172

好友

等待验证会员

Rank: 1

积分
349368

宣传勋章爱心勋章组织勋章官方团队冰雪节勋章

发表于 2021-6-3 09:57 | 显示全部楼层
欢迎论坛的高手解答,会奖励相应的威望和铜板哦
回复 支持 反对

使用道具 举报

2

主题

1120

铜板

6

好友

技术员

Rank: 3Rank: 3

积分
83
 楼主| 发表于 2021-6-3 10:02 | 显示全部楼层
本帖最后由 William4251 于 2021-6-3 10:15 编辑

第二部分 二级类转换
#编码转换
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

#转换一对一内容
import arcpy
arcpy.CalculateField_management("DLTB","国土空间规划二级类","!DLMC!","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类","!国土空间规划二级类!.replace('沼泽地','其他沼泽地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类","!国土空间规划二级类!.replace('机关团体新闻出版用地','机关团体用地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类","!国土空间规划二级类!.replace('高教用地','教育用地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类","!国土空间规划二级类!.replace('轨道交通用地','城市轨道交通用地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类","!国土空间规划二级类!.replace('养殖坑塘','坑塘水面')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类","!国土空间规划二级类!.replace('交通服务站场用地','交通场站用地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类","!国土空间规划二级类!.replace('村庄','')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类","!国土空间规划二级类!.replace('建制镇','')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类","!国土空间规划二级类!.replace('农村宅基地','')","PYTHON_9.3")

编码转换那3行的作用是统一用utf-8编码,因为老旧的Arcgis默认使用的是Python 2.X版本的形式,得加入这个才能像Python 3.X对中文的支持,不然感叹号里面的字段它就不认,就会报错。这部分本来是要写个字典的,但是像有的三调会把农村宅基地和村庄这类调到DLMC这个字段,所以都要对应改到空值,这个就不满足字典一一对应的要求了,不能两个键都对应空值。
回复 支持 反对

使用道具 举报

2

主题

1120

铜板

6

好友

技术员

Rank: 3Rank: 3

积分
83
 楼主| 发表于 2021-6-3 10:19 | 显示全部楼层
第三部分 二级类代码、一级类代码和一级类转换

#编码转换
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

#二级类地类编码转换

arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!DLBM!","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('0303','0507')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('0304','0501')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('0306','0502')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('0402','0503')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('0603','1003')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1105','0505')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1106','0506')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1108','0504')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('0305','0303')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('0307','0304')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('0403','0402')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('0404','0403')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('0601','1001')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('0602','1002')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('0702','0703')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('08H1','0801')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('08H2A','0804')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('0801A','1403')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1002','1206')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1003','1202')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1007','1203')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1009','1205')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1101','1701')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1102','1702')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1103','1703')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1104','1704')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1104A','1704')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1109','1312')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1107','1705')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1107A','1311')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1110','1706')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1201','2301')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1203','2302')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1204','2304')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1205','2305')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1206','2306')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1207','2307')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('0508','1101')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1001','1201')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('1005','1208')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('09','1500')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划二级类代码","!国土空间规划二级类代码!.replace('0809','1300')","PYTHON_9.3")

#国土空间一级类编码转换
arcpy.CalculateField_management("DLTB","国土空间规划一级类代码","!国土空间规划二级类代码![0:2]","PYTHON_9.3")

#国土空间一级类转换
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类代码!","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('01','耕地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('02','园地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('03','林地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('04','草地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('05','湿地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('06','农业设施建设用地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('07','居住用地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('08','公共管理与公共服务用地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('09','商业服务业用地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('10','工矿用地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('11','仓储用地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('12','交通运输用地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('13','公用设施用地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('14','绿地与开敞空间用地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('15','特殊用地')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('17','陆地水域')","PYTHON_9.3")
arcpy.CalculateField_management("DLTB","国土空间规划一级类","!国土空间规划一级类!.replace('23','其他土地')","PYTHON_9.3")

这里如果和之前的二级类转换是分开工具箱做,就必须再加一次 utf-8,不然憨憨的Arcgis又不认了。另外现在这里写的是常用的1-17和23这几个类,像什么18渔业用海这种三调本身就没有的,自然就没有包括在里面
回复 支持 反对

使用道具 举报

0

主题

751

铜板

2

好友

技术员

Rank: 3Rank: 3

积分
21
发表于 2021-6-3 10:30 | 显示全部楼层
我的妈呀,简直是雪中送炭
回复 支持 反对

使用道具 举报

2

主题

2万

铜板

17

好友

地信名人堂

Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19

积分
2930

精华勋章宣传勋章爱心勋章组织勋章地信元老灌水勋章荣誉会员勋章活跃勋章地信专家组VIP勋章贡献勋章名人堂勋章冰雪节勋章成就学员勋章10周年纪念勋章

发表于 2021-6-3 10:32 | 显示全部楼层
没有什么附件a !
有点荒凉的地
回复 支持 反对

使用道具 举报

2

主题

1120

铜板

6

好友

技术员

Rank: 3Rank: 3

积分
83
 楼主| 发表于 2021-6-3 10:37 | 显示全部楼层

后面我都用了回复在这个帖子下的形式,回复还在审核中
回复 支持 反对

使用道具 举报

2

主题

1120

铜板

6

好友

技术员

Rank: 3Rank: 3

积分
83
 楼主| 发表于 2021-6-3 11:03 | 显示全部楼层
最后是把他们制作进Arcgis的自定义工具箱,就在 我的工具箱-新建-python工具箱 这里新建。然后右键点编辑把代码拷贝进去我这里是分了四个,因为都写在一个里太长了,遇到数据量非常大的时候,就会超过运行上限会报错,4个就很适宜。另外默认设置是自动运行,就是点他刷新就运行了。如果不想它运行平常把 我的工具箱这部分折叠就可以了,或者把DLTB图层改名,它找不到目标也就不会运行了
回复 支持 反对

使用道具 举报

1

主题

1万

铜板

0

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
767
发表于 2021-6-3 11:12 | 显示全部楼层
:zt:zt:zt:zt:zt
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表