在ArcGIS下基于Python的路网数据批处理方法
2018-08-13张小璞左小清
张小璞,左小清
在ArcGIS下基于Python的路网数据批处理方法
张小璞,左小清
(昆明理工大学国土资源工程学院,云南 昆明 650093)
以云南省地质环境信息化建设项目为背景,针对地名地址数据生产中路网数据区划代码字段在人工赋值过程中存在准确率与处理效率低的问题。在对比分析ArcGis二次开发方法的基础上,改进了一种新的面向ArcGis10.5的Python编程脚本。对该Python脚本地理空间分析原理、实验数据准备阶段的处理以及该Python脚本功能等作了详细叙述。最终通过对实验数据的验证来证明新脚本的可行性。
ArcGIS;Python;地理空间数据处理;路网数据;合并
0 引言
ArcGIS9引入了脚本处理技术,并支持多种脚本语言,包括Python、VBScritp、JavaScritp、JScritp和Perl[1-2]。由于ArcGIS是基于组件对象模型(COM)构建起来的,又因为脚本语言是面向对象的[3-5],所以脚本语言可以访问ArcGIS中所有获得许可的函数[6],也包括所有的扩展模块。因此,脚本语言才可以高效地实现任务自动化。
Python作为一门程序语言,也常被称为脚本语言。以Esri为例,他们主要使用C++语言开发ArcGIS软件[7]。在ArcGIS软件中,所有的组件或对象被称为ArcObjects[8]。利用C++既可以新建一个对象,也可以开发一个含有ArcObjects对象的应用程序。利用Python则既可以访问ArcGIS现有的功能,也可以通过组合相关函数来扩展ArcGIS的功能[9]。Python并不用于底层开发,而是用来完成一些相对简单的脚本编程或一些高级程序设计项目[10]。
ArcGIS10已经将Python进一步整合到ArcGIS的用户界面里,而且Esri已正式将Python作为ArcGIS首选的脚本工具,并对ArcGIS10.1进行了升级以包括Python2.7版本。Python虽然不是唯一一种可以在ArcGIS中使用的脚本语言,但是它一定是被最广泛使用的一种。
ArcPy是一个以成功的arcgisscripting模块为基础并继承了arcgisscripting功能进而构建而成的站点包。目的是为以实用高效的方式通过Python执行地理数据分析、数据转换、数据管理和地图自动化创建基础。该包提供了丰富纯正的Python体验,具有代码自动完成功能(输入关键字和点即可获得该关键字所支持的属性和方法的弹出列表;从中选择一个属性或方法即可将其插入),并针对每个函数、模块和类提供了参考文档。在Python中使用ArcPy的另一个主要原因是,Python是一种通用的编程语言。Python是一种支持动态输入的解释型语言,适用于交互式操作以及为称为脚本的一次性程序快速制作原型,同时其具有编写大型应用程序的强大功能[11]。用ArcPy编写的ArcGIS应用程序的优势在于,可以使用由来自多个不同领域的GIS专业人员和程序员组成的众多Python小群体开发的附加模块。
1 案例说明
为提升云南省地质环境管理工作的效率和信息化水平,实现全省地质环境信息化三级体系的互通互联,云南省启动了地质环境信息化建设项目。结合云南省第一次全国地理国情普查成果数据、最新电子地图导航数据,生产地质环境信息化的地名地址数据是云南省地质环境信息化的重要内容之一。
其中,在处理整个省级的路网数据时,需要判断整条道路数据跨越行政区的情况,最终确定所属行政区。行政区划面数据采集依据国情普查数据中的行政区划数据。参考国情普查数据,行政区划面状数据可以从省级采集到乡镇级。省级行政区填写2位代码,市级行政区使用4位代码,县级行政区使用6位代码,乡级行政区使用9位代码,具体要求如下:
① 同一道路数据,完全位于同一个乡级行政区,只需填写该乡级行政区代码;
② 同一道路数据,跨越多个乡级行政区,如果多个乡级行政区同属于一个县行政区,则填写该县级行政区代码即可;如果多个乡级行政区不属于同一个县级行政区,但同属同一个市行政区,则填写该市级行政区划代码;
③ 同一道路数据,跨越市级行政区,填写省级区划代码。
由于整个省级路网数据量大,全部人工赋值工作难度大、工作量巨大;因为路网数据的行政区划代码填写具有规律性,可以使用ArcGIS与Python结合进行处理。本文主要介绍判断路网是否跨行政区域并填写相应的行政区划代码。
2 方案设计
2.1 方案设计思路
道路数据行政区划代码填写主要涉及两个问题,一是判断同一条道路跨越几个行政区,二是同一条道路在跨越多个不同行政区时行政区划代码的填写。解决这两个问题,首先要确保数据无拓扑错误,包括道路数线据无伪节点、重叠、自相交,行政区划面数据无缝隙、重叠错误;其次是数据属性信息是否正确,包括道路数据名称是否正确,行政区划面数据行政区划代码是否正确。
2.2 方案具体操作
(1)道路数据融合
路网数据在道路连通处要处于打断状态,首先需要对同一条道路进行融合操作,确保同一条数据融合成一整条。在进行融合操作时,可能出现不同区域存在相同名称属性的道路数据,所以在融合处理步骤中,创建多部件要素选项不能勾选。操作完成后,初步的道路数据融合完成。
(2)数据预处理
在道路数据中,存在同一条道路数据被连接线打断的情况,但在赋值行政区划代码时需要对整条道路数据操作,对于这种情况,需要单独处理。具体处理方法如下:
① 融合后的道路数据,要素结点转点,类型选择both-end;
② 使用查找相同工具,字段选择“Shape”及“Name”,选择合适距离,XY容差选择合适距离;
③ 通过连接,合并名字相同的道路数据。
(3)唯一编码
道路数据处理完成后,添加字段,对每一条道路数据设置全局唯一值,为后续数据判断做准备。
(4)标识
数据唯一值设置完成后,用行政区划面数据标识道路线数据,同一道路数据被分成若干条小段。
(5)行政区划代码填写
采用Python处理道路数据的行政区划代码值,最终完成道路数据行政区划代码值的确认。
图1 数据预处理流程图
3 具体实现
(1)提取道路唯一值
在判读道路数据行政区划代码时,需要提取之前设置的全局唯一值,并存储在数组中,代码具体实现见下。
>>>layer=arcpy.MakeFeatureLayer_management('L_Merge_Identity')
...ss=arcpy.(layer,"unique")
...pca=[]
...foriinss:
...if i[0] not in pca:
...pca.append(i[0])
(2)行政区划代码判断
根据全局唯一值选择同一条道路的所有数据,根据每条记录中的行政区划代码值确定最终道路数据所属行政区划代码,实现代码如下:
...for j in pca:
ff=arcpy.SelectLayerByAttribute_management(layer,"NEW_SELECTION",""unique"='"+str(j)+"'")
... mm=arcpy.da.UpdateCursor(ff,"code")
... pac9=[]
... pac6=[]
... pac4=[]
...for m in mm:
...if m[0][0:9] not in pac9:
... pac9.append(m[0][0:9])
...if m[0][0:6] not in pac6:
... pac6.append(m[0][0:6])
...if m[0][0:4] not in pac4:
... pac4.append(m[0][0:4])
(3)数据更新
代码判断完成后,对应的值填写在“CODE”字段中,代码实现见下:
...mm=arcpy.da.UpdateCursor(ff,"ROADCODE")
...for m in mm:
... if len(pac9)==1:
... m[0]=pac9[0]
... mm.updateRow(m)
... elif len(pac9)!=1 and len(pac6)==1:
... m[0]=pac6[0]
... mm.updateRow(m)
... elif len(pac9)!=1 and len(pac6)!=1 and len(pac4)==1:
... m[0]=pac4[0]
... mm.updateRow(m)
... elif len(pac9)!=1 and len(pac6)!=1 and len(pac4)!=1:
... m[0]="53"
... mm.updateRow(m)
(4)结果
代码运行结束后,区划代码值填写完成,运行前后,数据对比如下。
图2 代码运行前数据展示图
图3 代码运行后数据展示图
4 结语
数据生产任务复杂而又繁琐。水数据、道路数据、楼址点数据、兴趣点数据;点数据、线数据、面数据等等都会因为数据量的庞大与特殊性给作业人员在地理处理中带来巨大的挑战。同时,重复性的操作如融合、拓扑、相交等地理操作也给工作带来不小的压力。显然,地理数据的批处理越来越成为地理处理操作中不可缺少的重要功能。
本文通过介绍Python脚本语言在地理处理中的应用,实现了一系列地理处理过程的批处理工具,包括,提取唯一值、行政区划代码判断、“CODE”字段更新等。在进行了大量对比测试后,实验表明本文所提到的路网数据批处理工具对提高数据处理和整合的速度与效率有很大作用。
在实际工作中,利用Python开发地理数据批处理脚本程序,配置简单、效率高效、方便实用,能够大大减少作业员在地理数据处理工作中的重复性劳动,减少手工操作工作量\7。Python与Arcgis的完美融合与集成对公共地理信息服务数据的生产和加工、地理国情监测与地理国情普查中涉及的地理统计分析工作都具有重要的应用价值\8。
[1] PaulA.Zandbergen, 赞德伯根, 李明巨, 等. 面向ArcGIS的Python脚本编程[M]. 人民邮电出版社, 2014.
[2] Joel.Lawhead, 莱哈德, 邓世超, 等. Python地理空间分析指南第2版[M]. 人民邮电出版社, 2017.
[3] 潘雪婷. 基于Python的控件分析模型的实现[D]. 中国地质大学(北京), 2010.
[4] 彭海波, 向洪普. 基于Python的空间数据批量处理方法[J].测绘与空间地理信息, 2011, 34(4): 81-82+85+87.
[5] 朱道强, 关海涛. Python在ArcGIS中的应用[J]. 测绘与空间地理信息, 2013, 36(7): 152-154.
[6] 巨擘. ArcGIS中应用Python脚本提高数据生产力的研究[J]. 测绘技术装备, 2017, 19(3): 12-14.
[7] 易嘉. 城市交通分区合理划分研究[D]. 同济大学, 2006.
[8] 赵永国, 谭建军. ArcObjects中各种版面要素的处理[C]// arcgis暨erdas中国用户大会. 2004.
[9] 包瑞清. ArcGIS下的Python编程[M]. 江苏凤凰科学技术出版社, 2015.
[10] 田学志. 基于Python的Arcgis地理处理应用研究[J]. 计算机光盘软件与应用, 2013(7): 46-46.
[11] 谢生锋. 基于Python的动态语言特点探讨[J]. 电脑知识与技术, 2017, 13(33): 131-132.
[12] 陈轩. 基于ArcGIS利用python脚本对地理数据库中指定同名图层的批量合并[A]. 云南省测绘地理信息局、云南省测绘地理信息学会. 云南省测绘地理信息学会2016年学术年会论文集[C]. 云南省测绘地理信息局、云南省测绘地理信息学会: 2016: 6.
Python-Based Road Network Data Batch Processing Method Under ArcGIS
ZHANG Xiao-pu, ZUO Xiao-qing
(Kunming University of Science and Technology, Land and Resources Engineering College, Kunming 650093,China)
Taking the geological environment informatization construction project in Yunnan as the background, there is a problem of accuracy and low processing efficiency in the manual assignment process of the road network data zoning code field for geographical name address data production. Based on a comparative analysis of ArcGis secondary development methods, a new Python programming script for ArcGis 10.5 is improved. The Python script geospatial analysis principle, the processing of the experimental data preparation phase, and the Python script function are described in detail. Finally through the verification of experimental data to prove the feasibility of the new script.
ArcGIS; Python; Geospatial data processing; Road network data; Merge
P208
A
10.3969/j.issn.1003-6970.2018.07.027
张小璞,(1992-),男,昆明理工大学硕士研究生,研究方向:地图学与地理信息系统空间数据挖掘与处理;左小清,男,教授,博士生导师,云南省中青年学术和技术带头人,研究方向:时空数据挖掘、雷达干涉测量(InSAR)。
本文著录格式:张小璞,左小清. 在ArcGIS下基于Python的路网数据批处理方法[J]. 软件,2018,39(7):130-133