本次Arcpy脚本工具用的是ArcGisPro2.8版本,尽量使用同一版本,其它版本可以参照。
工具介绍
城规专业一般都使用湘源软件画规划用地图。现在很多工作都转入ArcGIS中,但是传统画的用地图想要完美转成数据库文件是比较麻烦的,比如:
1、有地块内线的用地怎么导入?
2、规划用地中的各种指标,如【容积率、建筑密度、绿地率、建筑限高……】,如何保留?
第2点是最难的。比较笨的办法是把这些指标编辑成文字,然后通过【空间连接】工具连接到地块上,但是这样明显太笨了,于是就有了这个工具。
这个工具不是简单用脚本就能解决的,需要用到ArcGIS Pro安装包全家桶里的【Data_Interoperability】。
这里分享一下我使用的ArcGIS Pro 2.8.6的安装包,里面有Data_Interoperability。安装好后,就相当于给ArcGIS Pro安装了一个FME组件。FME有的人可能知道,是数据处理的超级软件,有兴趣的可以上网学习一下。
ArcGIS_Pro_2.8.6安装包https://pan.baidu.com/s/1H_j_incqFLjghN5UQLHZWQ?pwd=rkeu
工具结构
工具主要是用FME写的,FME工具怎么写的这里就不多做介绍,只说明一下主要思路。有FME基础的人听得懂就行,没用FME的人,直接调用这个写好的工具,也不必深究。后面有机会专门讲一讲FME的用法。
这里最主要的工具是【AttributeExposer】,暴露地块的隐藏属性,可以把指标等各种属性暴露出来。后续就是字段整理,以及计算各类指标。
FME工具写好后,可以在ArcGIS Pro新建一个空间ETL工具。
在工具属性里,设置【工作空间】为你刚写好的FME工具。这相当于直接调用了这个FME工具。
但是由于FME工具在参数方面有些小问题,比如参数标签不能用中文,输出参数必须先指定数据库,再指定要素名称等等....用起来不太习惯。于是我新建了一个脚本工具,然后在脚本里调用FME工具,一切就变得熟悉了起来。
最后要调用的工具是这个:
其它文件也是有用的,不要删掉(测试用的cad可删)。
最终参数有3个。
1、【输入用地CAD】——湘源画的规划用地。这里需要重点说明的一点是。不管是ArcGIS还是FME,都是按【面】来认用地要素的。FME更优秀的一点是可以认【填充图案】。但是湘源画的用地是一种特殊的自定义块,正常情况下不管是ArcGIS还是FME都不能读取。所以我们需要把用地炸开,只取填充图案。
炸开后,我们会发现指标等隐藏属性已经不见了。这没关系,其实是还在的,进了FME就可以看到了。
最后一件重要的事情:用来输入的规划地块,即【填充图案】一定要干净,如果含有其它无关的要素导入进处理,是大概率会出错的。这里推荐一种方法,隔离用地图层,选择炸开后的用地,用【w】命令,写块写出一个新文件,用这个新文件作为输入地块。
2、【输入人均居住面积】——这是用来计算人口、停车位数量的参数。默认是45,这个可以根据当地实际情况调整,或者在输出结果后再修改指标,都可以,不重要。
3、【输出用地要素】——输出结果的用地要素。
脚本编写
主要思路
由于主要工具是FME写的,所以脚本里的代码只是基本的一些框架代码。
完整代码如下:
import arcpy
import os
# 获取文档位置
default_path = os.path.dirname(__file__)
arcpy.ImportToolbox(default_path + r"\cc工具箱.tbx") # 加载cc工具箱
input_cad = arcpy.GetParameterAsText(0) # 输入用地cad文件
pp_area = arcpy.GetParameter(1) # 输入人均居住面积
output_fc = arcpy.GetParameterAsText(2) # 输出用地要素
# 获取参数
gdb_FME = default_path + r'\FME导出.gdb' # 临时FME导出gdb
# cad用地导入gdb
def cad2gdb():
arcpy.AddMessage(r'——————————cad用地导入gdb——————————' )
# 判断数据库里是否已经有存在同名要素【如果有则清除】
fc = gdb_FME + r'\FME导出用地' # 设置一个中间数据
if arcpy.Exists(fc):
arcpy.Delete_management(fc)
# 使用FME工具【FMEcad2gdb】
arcpy.cc.FMEcad2gdb(input_cad, gdb_FME, r'FME导出用地', pp_area)
arcpy.AddMessage(r'——————————复制到目标gdb——————————')
# 复制到目标gdb
arcpy.CopyFeatures_management(fc, output_fc)
if __name__ == '__main__':
cad2gdb()
结果展示
最终生成结果如下:
这里我对一些指标结果作了一些修正,比如绿地率有上下限,结果就是【10-20】这样的,如果是工业用地,建筑密度结果就是【建筑系数≥40%】之类的。如果想修改结果表达也没问题,我把原始的指标也按字段保留了下来,可以自己修正。
工具下载
最后,贴上工具下载地址:
工具下载:CAD用地带指标导入ArcGIS数据库https://pan.baidu.com/s/1SJpl31KfLU5z6mlKrL2DAw?pwd=p55o