基于Python的营造林数据验收方法
2016-11-21曹霸陈兴亚黄冰清王洪波卢鹏
曹霸,陈兴亚,黄冰清,王洪波,卢鹏*
(1.贵州林业勘察设计有限公司,贵州 贵阳 550003;2.贵州省林业调查规划院)
基于Python的营造林数据验收方法
曹霸1,陈兴亚2,黄冰清2,王洪波1,卢鹏2*
(1.贵州林业勘察设计有限公司,贵州贵阳550003;2.贵州省林业调查规划院)
本文简要介绍了Python语言,并对贵州省营造林数据验收流程中使用到的ArcGIS图形检查工具利用Python语言进行集成,生成自定义工具,利用这个工具对营造林数据进行检查验收,在一定程度上提高了数据检查验收的工作效率。
Python;ArcGIS;脚本工具;营造林数据;验收方法
Python是一种面向对象、语法清晰、开源的脚本语言,从简单的到复杂的脚本任务,从独立的到复杂的应用程序都可以实现。地理信息系统经过30多年的发展,其应用领域已经深入到各行各业。地理信息系统的快速发展推动了相关软件的进步,作为地理信息系统软件中比较有代表性的软件ArcGIS被广泛应用[1]。贵州省2015年营造林数据验收检查内容多,需要利用ArcGIS多个工具对数据进行处理,检查工作非常繁琐。为此,本文利用Python进行开发,对营造林数据验收所用的ArcGIS工具进行集成,生成脚本工具,在营造林数据检查验收时利用该工具,在一定程度上提高了工作效率。
1 Python语言
Python于1991年第一次公开发行,从而是一门优秀的脚本语言[2]。图1展示了Python的优点。
2 营造林数据验收流程
营造林数据验收主要包括两个部分:属性检查和图形检查。其中属性检查主要在Access里检查,本文不详细叙述。图形检查是在ArcGIS中进行检查,检查的内容包括数据库字段结构比较、拓扑检查、多部件检查、重号检查和缝隙检查,见图2。
图1 Python优点
其中,字段比较是对每个县的检查数据和模板数据的数据库结构进行比较,以保证后期对全省数据进行合库时每个县的库结构相同;拓扑检查是对营造林数据进行拓扑分析,防止小班图层存在自身重叠和相互重叠;多部件检查是为了防止小班图层存在多部件;重号检查是为了保证小班图层无重号;缝隙检查是为了保证小班与小班之间不存在缝隙,缝隙最小为100m2。
3 检查工具实现
根据图形检查的内容,利用ArcGIS自带的Python脚本编辑器,实现字段比较、拓扑检查、多部件检查、重号检查和缝隙检查。
3.1字段比较
字段比较工具包括9个参数:模板表、数据表、排序字段、比较类型、忽略类型、属性容差、忽略字段、是否连续比较、比较结果输出文件。具体参数设置如下所示:
base_table=path_base+"/"+"YZL_PY_ZLYSXB"
图2 图形检查内容图
test_table=path_test+"/"+"YZL_PY_ZLYSXB"
sort_field="OBJECTID"
compare_type="SCHEMA_ONLY"
ignore_option="IGNORE_EXTENSION_PROPERTIES;IGNORE_SUBTYPES;IGNORE_RELATIONSHIPCLASSES"
attribute_tolerance=""
omit_field="OBJECTID;SHAPE;SHAPE_Length;SHAPE_Area;aa;aaa"
continue_compare="NO_CONTINUE_COMPARE"
compare_file=path+"/"+"zl.txt"
其中path_base,path_test分别为模板数据路径和检查数据路径。
工具运行语句如下:
compare_result=arcpy.TableCompare_management(base_table,test_table,sort_field,compare_type,ignore_option,attribute_tolerance,omit_field,continue_compare,compare_file)
3.2拓扑检查
拓扑检查包括两个内容:小班图层自身重叠和小班图层之间的相互重叠。主要为创建拓扑、添加要素到拓扑、添加属性到拓扑和验证拓扑。具体语句如下:
arcpy.CreateTopology_management(path_test," topology")
arcpy.AddFeatureClassToTopology_management(" topology","YZL_PY_ZLYSXB",1,1)arcpy.AddFeatureClassToTopology_management("topology","YZL _PY_FYYSXB",1,1)
arcpy.AddRuleToTopology_management("topology","Must Not Overlap(Area)","YZL_PY_ ZLYSXB","","","")
arcpy.AddRuleToTopology_management("topology","Must Not Overlap(Area)","YZL_PY_ FYYSXB","","","")
arcpy.AddRuleToTopology_management("topology","Must NotOverlap With(Area-Area)","YZL_PY _FYYSXB","","YZL_PY_ZLYSXB","")
arcpy.ValidateTopology_management("topology")
3.3多部件检查
多部件检查步骤包括三步:首先,创建一个新的字段,然后把OBJECT字段的值赋给这个字段;其次,对小班图层使用MultipartToSinglepart工具炸开多部件;最后,对炸开后的图层属性表统计第一步新建的字段,如果有数量大于等于2的记录,则说明图层中存在多部件。具体语句如下:
arcpy.AddField_management("YZL_PY_ ZLYSXB","aa","TEXT","","",100)arcpy.Calculate-
Field_management("YZL_PY_ZLYSXB","aa","!OBJECTID!","PYTHON")
arcpy.MultipartToSinglepart_management("YZL _PY_ZLYSXB","YZL_PY_ZLYSXB_multi")
arcpy.Frequency_analysis("YZL_PY_ZLYSXB _multi",path+"/"+"zl_multi_frequency","aa")
3.4重号检查
本次营造林数据验收中重号检查用的字段为上报年度、项目名称、村代码和内业小班号。在重号检查时先对这四个字段进行运算生成唯一编号,然后再对唯一编号进行统计。如果唯一编号数量大于等于2则说明小班图层中有重号,就需要对重号小班重新编号,直到属性表中每个记录都是唯一。具体语句如下所示:
arcpy.AddField_management("YZL_PY_ ZLYSXB","aa","TEXT","","",100)arcpy.Calculate-Field_management("YZL_PY_ZLYSXB","WYBH","!CUN!"+"!NYJCXBH!","PYTHON")arcpy.CalculateField_management("YZL_PY_ZLYSXB","aa","!ZCSBND!"+"!XMMC!"+"!WYBH!","PYTHON")
arcpy.Frequency_analysis("YZL_PY_ZLYSXB",path+"/"+"zl_重号_frequency","aa")
3.5缝隙检查
缝隙检查首先利用县面图层对小班图层进行擦除,然后利用工具Multipart to Singlepart炸开擦除后的图层,最后计算炸开图层中每个小班的面积。如果小班的面积小于100m2,则这个小班就是缝隙,就要排查产生缝隙的原因并进行修改。具体语句如下所示:
arcpy.Erase_analysis("县面","YZL_PY_ ZLYSXB","YZL_PY_ZLYSXB_Era","")
arcpy.MultipartToSinglepart_management("YZL_ PY_ZLYSXB_Era","YZL_PY_ZLYSXB_Era_Mul")arcpy.CalculateAreas_stats(path_dir+"/"+" YZL_PY_ZLYSXB_Era_Mul_reproject",path_dir+"/" +"YZL_PY_ZLYSXB_Era_Mul_reproject_mj")
完成了字段比较、拓扑查询、多部件检查、重号查询和缝隙查询功能后,进一步把这些功能集成为一个工具。
4 Python脚本工具应用
在ArcGIS的脚本编辑器完成代码编写后,在ArcGIS中进一步把代码集成为一个工具,方便检查人员的使用。具体流程如下:
(1)在Catalog中,选择Toolboxes,新建一个Toolbox。
(2)选择Toolbox,单击右键,选择add→script,设置合适的工具名字和标准,点击下一步,选择script file,即上面编写的Python脚本,点击下一步,输入display name和data type,这里选择数据验收数据库和模板数据库,data type为 workspace or Feature,点击Finish即可生成新的工具。
(3)双击生成的工具,如图3所示,选择验收数据库和模板数据库,点击OK。
运行过程如图4所示,运行时间为70 s左右。如果直接利用ArcGIS,涉及到多个工具,输入参数多,根据实际情况,检查一个县的营造林数据需要40min左右;通过应用脚本工具,仅需要15min左右,这样就在一定程度上提高了工作效率。
生成的结果如图5所示,具体结果包括字段比较结果、拓扑检查结果、多部件检查结果、重号检查结果、缝隙检查结果以及每项检查的中间结果,通过分析即可得到数据检查验收的结果,判断数据是否合格。
5 结语
本文根据贵州省营造林数据验收遇到的问题,结合Python和ArcGIS进行脚本语言的编写,自定义了图形数据检查工具,在一定程度上降低了工作量,提高了检查效率。但是也存在不足之处,后续可以在本文的基础上继续改进,使它对于复杂的数据结构也可以进行检查验收。
图3 数据验收工具
图4 脚本工具运行过程图
图5 Python运行生成的结果
[1]潘雪婷.基于Python的控件分析模型的实现[D].北京:中国地质大学,2010.
[2]Wesley J.Chun著,宋吉广译.Python核心编程 (第二版)[M].北京:人民邮电出版社,2008.
(责任编辑:杨婷婷)
S711
A
2095-0152(2016)05-0053-03
2016-07-26
2016-08-29
贵州省林业科研课题(黔林科合[2016](03)号)、云南省教育厅项目(2014J100)、贵州省林业科研课题(黔林科合J字[2013](4)号)。
曹霸(1989-),男,硕士,主要从事林业3S技术与应用研究工作。E-mail:cl98904@163.com
卢鹏(1983-),男,高级工程师,主要从事林业信息技术应用方向工作。E-mail:158263077@qq.com