Arcgis中基于Python的地理数据库批量合并方法研究
2018-08-13刘翔宇朱大明
刘翔宇,朱大明
Arcgis中基于Python的地理数据库批量合并方法研究
刘翔宇,朱大明
(昆明理工大学 国土资源工程学院,云南 昆明 650093)
为了实现Arcgis不同地理数据库中大量相同图层批量合并的操作。本文基于云南省地质环境信息化建设项目,在对比分析Arcgis二次开发方法的基础上,提出了一种新的面向ArcGis10.5的Python编程脚本。本文对Python地理空间分析原理、Python脚本功能以及实验数据处理流程等作了详细叙述。实验结果证明了该脚本的可行性。得出结论:本文中基于ArcPy人工开发出的脚本,相比手动操作效率大大提高,不易出错,实现了地理数据库中指定同名图层的批量合并。
Arcgis;地理数据库处理;python;脚本编辑;合并
0 引言
ArcGIS是由美国ESRI公司研发生产的一款地理信息系统(GIS)软件,其可以用与地理数据的采集,编辑,处理及多种形式的空间分析,同时可以为人们的生产提供决策。该软件目前已广泛应用于自然资源管理、自动制图、设施管理、城市和区域规划、交通管理等领域[1]。作为目前主流的GIS软件,是一套完整的、可无缝扩展的平台软件,具有管理和分析空间数据的功能,可以通过二次开发语言对桌面功能进行扩展。常用的ArcGIS二次开发语言有Python,VBA,VB,.net等。其中Python作为一种简单而且功能强大的开放性编程语言而备受瞩目,它具有简单易学、不受局限、可跨平台使用等诸多优点[2]。在ArcGIS10.1版本中已经将Python进一步整合到ArcGIS的用户界面里,供用户编程以开发出大量用于处理地理数据的实用程序,而这些由用户编写的程序可以进行地理数据的自动化批量处理,从而大大提高了工作效率。
GIS软件功能中的一个重要组成部分就是地理数据的处理,地理数据处理的本质其实就是多种空间数据进行处理,专业名词即为空间分析。地理数据处理最终的目标为使用户能够根据自己的需求去执行模型的建立,各种空间分析功能。在大量地理数据需要处理的时候,需要进行多次数,长周期的处理模式。因此我们就需要可以自动进行多次数循环处理数据流的功能,基于python脚本加Arcgis的模式可以提供一组丰富的工具和机制来实现数据流的自动化批量操作,这些工具和脚本能够将一系列的工具按照用户自己的意愿相衔接,用以有序的进行地理数据的处理。
Arcgis软件中自带的典型数据处理工具会在ArcGIS数据集(如要素类、栅格或表)的框架中进行操作,最终的结果即生成一个新的要素类集。又因为数据变换的框架为地理处理的基础。所以每个地理处理工具都对应一个数据处理的微操作。典型的例如向表中添加字段、要素的几何变换、数据投影(即将一个要素数据集投影到另一个要素数据集中)。所有的数据处理工具都集合在ArcGIS软件里的ArcToolbox中,其数量高达数百个。对于用户或者专业处理数据的人员来说,在利用ArcGIS地理处理工具时,根据不同的情况就会出现不同的问题,例如如何将几个简单的小工具串联起来,用于自动化地完成一个简单工作流。此时就可以利用Python脚本来使得人工操作转换为自动化的程序批处理过程用于进行数据处理[3]。下面我们就俩简单介绍下基于Arcgis的python脚本。
1 ArcPy简介
本文首先对ArcGIS的脚本语言Python的使用方法做一个简单介绍,对比Python脚本与Arcgis中自带工具的优劣,然后利用已经编写好的Python脚本来说明其在地理数数据处理中的应用。
1.1 什么是Arcpy
1991年,程序员Guido van Rossum推出了一种跨平台并且不受局限的开源式编程语言。在当时由于Python具有处理速度快、功能强大等特点获得了大众的广泛认可。目前Python已延伸到ArcGIS中,成为了一种用于进行数据分析、数据转换、数据管理和地图自动化的语言[4]。ArcPy则是一个包含了各种python的原生程序包。ArcGIS 9.2版本中所采用的arcgisscripting 模块的功能是它的雏形,ArcPy则是其进一步的衍生,提供了多种有用的函数和类并且为用户提供了使用Python语言操作时所需要的所有地理处理工具的入口,以用于处理和询问GIS数据[5]。后续的Arcgis的每个版本都进一步加强了用户的Python体验,直至今日的版本ESRI公司已将Python完全纳入ArcGIS中,并将其视为可满足用户需求的语言[6]。可以使用来自不同领域的GIS人员和程序员组成的众多Python小群体开发的附加模块是用ArcPy编写的ArcGIS应用程序的一大优势。
1.2 Python语言优势
(1)Python 语言是一种解释型的开源计算机语言,具有面向对象且可扩展的特征,包含丰富的库。简单易学,功能强大。
(2)相对于C、C++、Java等其他计算机语言,python的开发效率要大大提高。Python代码的长度往往只有C++或Java代码的四分之一左右,并且Python语言编写的程序可以立即执行,不需要编译链接等步骤,从而提高了开发效率。
(3)可转变为ArcGIS工具
编辑好的Python脚本程序可以直接作为自定义工具使用并且添加到ArcToolBox中作为自定义工具,与系统提供的工具使用方法一致。简化了操作过程,简单易用。
(4)跨平台,可移植性高
绝大多数Python程序不需要人工更改即可在当前主流的计算机系统平台上使用。
(5)具有可嵌入性
Python程序可以作为插件嵌入到其他语言开发的应用程序中(例如Arcgis),提高了程序的重用性。
(6)地理处理自动化
Python脚本的执行过程实际上就是一个自动化的数据流处理过程。地理处理的过程按照程序设计的步骤依次完成相应的地理处理过程,中途无需人工干预。并且地理处理的过程可以实现批处理,大大简化工作量[7]。
1.3 ArcPy的使用方法
(1)在命令行窗口中使用ArcPy
在用户成功安装ArcGIS软件之后可以选择安装包括Python的安装包,安装以后用户需要先运行Python IDLE。在使用数据处理工具之前需要先导入Arcpy站点包。
(2)在Python脚本文件中使用ArcPy
其人性化的设计之一是Python窗口中具有代码提示功能,使用ArcPy的方式有很多种其中最方便的是利用脚本文件,常用的方法是利用记事本编辑我们所需要的程序。另一种方法则是在Python IDLE中创建脚本文件,在Python IDLE中打开脚本文件后,点击Run->Run Module将运行脚本文件,可以显示相应的提示信息。
(3)利用ArcPy创建地理处理工具
利用ArcPy创建用户需要的地理处理工具也是常用的功能,该工具可以作为ArcCatalog中的自定义工具使用,其使用方法与ArcToolbox中工具的使用方法类似用户可以通过对话框进行参数输入并且根据不同的参数显示不同的结果。
2 Arcgis中常规的数据库合并处理方法
2.1 Arcgis中图层合并的方法
2.1.1 直接导入法
如图1所示,这种方法能够选取自己想要合并的表格属性。首先是在arccatalog工具栏中定位到我们需要合并的图层,然后右键选择导入(part2合并入part1图层中,选择part1右键选择加载),需要注意的是加载图层必须是在一个数据库空间下(gdb或者是mdb目录下)。
图1 直接导入法
2.1.2 利用toolbox下的合并工具
如图2所示,此方法我们需要注意各要素间的表格属性。如果表格中的字段名称或者是类型不一致,就会造成数据丢失。所以当图层数较少时,我们可以采取加载的方式进行,如果要合并多个图层时,合并工具就会更加有效,但是前提条件是我们预先处理好各表格中字段类型及名称。(合并工具在ArcToolBox——Data Management Tools—— General——Merge中)。
但是上述两种方法只适用于少量图层的合并。由于本文中所处理的数据是包含多个图层的地质公园数据库数据,各个地质公园的数据分别存储在数据库中,分为水域,水系,注记等图层,存储位置太过分散,手动合并各个数据库相同图层工作量庞大且容易出错,本文基于ArcGIS使用python对大量数据库中的指定图层进行批量合并,形成整个测区范围的指定图层数据,质检员只需对合并后的数据进行一次检查,极大的提高质检效率,减轻质检工作强度和避免逐幅检查时易出现的图幅漏查情况。以下是数据批量处理流程及具体实现。
图2 利用工具合并
3 ArcPy数据处理实例
3.1 研究背景
在数据生产过程中,通常一个数据库中包含很多图层,点、线、面图层同时存在,多个数据库中基本包含相同图层,例如此文中不同的地质公园数据库中都包含水系,注记,山峰,地质遗迹等同名图层。数据处理过程中由各个作业员生产的N个独立的地理数据库(gdb)最终将汇交至质检人员,当质检员应用GIS软件对这些gdb格式的数据库中某类要素(比如“水系”层)进行检查时,由于每个水系图层都存储于一个独立的地理数据库(gdb)中,质检员只能选择将这N个数据库中每个的水系图层逐一检查,这种检查方式非常之耗时且由于繁琐的操作而致使检查工作易出现遗漏,若不想逐个检查就必须对分散于多个数据库中的图层进行合并后再从整体上进行检查[8]。
3.2 首先介绍数据库存储方式(以洞穴公园,恐龙巩公园,山谷公园为例)
每个公园数据包含4个数据库(gdb)如图3所示,分别为边界图,地质图,规划总图,科学导游图,每个数据库中都含有同名图层水系,水域,注记,村庄等。
图3 数据库存储方式
3.3 添加路径识别代码
由于数据存储在中文路径,首先在代码前添加中文路径识别代码,便于python脚本识别数据库。
否则数据不能被识别导致脚本出现错误,无法进行。
import arcpy
import sys
reload(sys)
sys.setdefaultencoding(‘utf8‘)
3.4 利用python脚本进行合并操作(数据库合并主要代码如下图所示,以“边界图”数据库为例)
这一步是利用脚本将三个公园的边界图数据库,即三个不同公园的边界图.gdb中的所有同名图层合并到一个新的数据库BJ.gdb中。得到的新的数据库中包含原来三个数据库中的所有同名图层,完成了批量合并操作,方便检查错位及遗漏。
arcpy.env.workspace=r’F:DZ’ #路径设置
s1=arcpy.ListWorkspaces() #列出所有的文件夹
for i in s1: #对文件夹进行循环
arcpy.env.workspace=i #设置文件夹下的路径
print I #把路径打印出来
s2=arcpy.ListWorkspaces() #列出文件夹下路径
for j in s2: #对当前路径下的文件夹进行循环
arcpy.env.workspace=j #设置路径
print j #把路径打印出来
s3=arcpy.ListWorkspaces(“*边界图.gdb”)
#列出包含边界图.gdb的文件夹
for a in s3: #对当前路径下的文件循环
arcpy.env.workspace=a #设置路径
print a #打印路径
ff=arcpy.ListFeatureClasses()
#列出当前路径下的所有要素类
for f in ff: #对当前要素类进行循环
if not arcpy.Exists(r’F:DZ BJ. gdb’+ ”\”+f): #判断某一要素是否存在
arcpy.CopyFeatures_management(str(a)+”\”+f,r’F: DZBJ.gdb’+”\”+f) #若不存在则直接复制
else:
print f
arcpy.Append_management (str(a)+”\”+f,r’F:DZBJ.gdb’+”\”+f ,”NO_TEST”,””,””) #如果存在,打印
print ”BJ” #程序完成,显示“BJ”
3.5 处理结果以及汇总统计(汇总代码如下所示)
arcpy.env.workspace=r’F:DZBJ.gdb’
ss=arcpy.ListFeatureClasses()
for s in ss:
count=arcpy.GetCount_management(s)
print s+” ”+str(count)
arcpy.env.workspace=r’F:DZ公园‘
s1=arcpy.ListWorkspaces()
for i in s1:
cnt=0
arcpy.env.workspace=i
s2= arcpy.ListWorkspaces()
for j in s2:
arcpy.env.workspace=j
s3=arcpy.ListWorkspaces(”*边界图.gdb”)
for a in s3:
arcpy.env.workspace=a
ff=arcpy.ListFeatureClasses(s)
for f in ff:
d=str(arcpy.GetCount_managment(f))
cnt=cnt+int(d)
print s+” ”+str(cnt)
此代码主要是对合并前各个边界图数据库中所有相同图层的数量相加之和与合并后数据库BJ.gdb中总图层数量的比较,如数量一致,说明合并前后数量一致,所有相同图层都被合并到新的数据库中,没有遗漏。处理结果如表1所示,根据图中显示的结果,前后数量一致,代码完美运行。
表1 最终对比处理结果
Tab.1 Final contrast
3.6 实验过程中存在的主要问题
在整个数据处理过程中主要存在合并数据类型不一致所引起的错误。主要原因是字符串类型不能存放在数值型字段中,如图4所示。解决方法:查看原始数据,把数据类型改成一致。
图4 处理过程中出现的错误
4 结语
本文以云南省地质环境信息化建设项目中的地质公园数据库数据为例,探讨了ArcPy在地理数据库合并处理中的方法与应用,实现了对地理数据库中的指定图层的自动、批量合并,杜绝了大量地理数据库图层人工合并时人为遗漏的情况,极大的提高了工作效率。当采用ArcGIS Engine或是其他数据处理开发包实现此功能时,有着较高的编程门槛,主要面向的人群是专业的开发人员。此文中的方法则降低了编程的门槛,非专业人员也可以轻松上手并且在空间数据批量自动化处理和地理小工具的开发方面具有显著的优势[9],利用脚本可以简化手工操作的步骤,减少误操作概率,对用户的日常数据处理工作有很大的帮助[10],Arcgis中提供的种类丰富的数据处理工具并不适用与所有的情况,在具体的工作任务中,合适且方便的地理数据工具往往更加实用,此时就需要个性化的工具去针对不同的工作内容,恰恰Arcpy可以实现这一点。由此可见Python在Arcgis地理处理框架中占据非常重要的位置[11]。在GIS行业今后的发展中,越来越多的开发人员,用户,数据处理人员将更好的完善python脚本在数据处理方面的应用,工作效率也会也来越高。
[1] 何丽娴, 甘淑, 陈应跃. 基于Python语言的空间数据处理[J]. 价值工程, 2014(36): 207-209.
[2] 卜丽静, 郑新杰, 张正鹏, 等. 基于Python的矿山遥感监测系统开发研究[J]. 测绘工程, 2015(6): 43-47.
[3] 柳琳. 基于工作流的地理处理建模技术[J]. 地理空间信息, 2011, 9(1): 39-42.
[4] 林璐, 王爽, 李海泉, 等. 在ArcGIS下基于Python的矢量数据处理方法[J]. 测绘技术装备, 2016, 18(4): 63-65.
[5] 曹斌. 基于ArcPy的矢量数据批处理方法研究[J]. 科技创新与应用, 2017(21): 90-90.
[6] 邵保华, 田学志. 谈Python在Arcgis地理处理中的应用[J]. 林业勘查设计, 2012(2): 99-100.
[7] 巨擘. ArcGIS中应用Python脚本提高数据生产力的研究[J]. 测绘技术装备, 2017, 19(3): 12-14.
[8] 陈轩. 基于ArcGIS利用python脚本对地理数据库中指定同名图层的批量合并[J].
[9] 张桥平, 李德仁, 龚健雅. 城市地图数据库图形合并技术[J]. 测绘通报, 2003(9): 27-29.
[10] 刘小华. 基于Python的地理信息数据处理研究[J]. 中国化工贸易, 2015, 7(32).
[11] 田学志. 基于Python的Arcgis地理处理应用研究[J]. 计算机光盘软件与应用, 2013(7): 46-46.
Research on Batch Consolidation Method Based on Python in ArcGIS
LIU Xiang-yu, ZHU Da-ming
(Faculty of Land and Resource Engineering, Kunming University of Science and Technology, Kunming 650093, China)
In order to achieve the bulk consolidation of a large number of identical layers in different geodatabases in ArcGIS, This article is based on the geological environment information construction project in Yunnan Province, Based on a comparative analysis of Arcgis secondary development methods, A new Python programming script for ArcGis 10.5 is proposed. This article gives a detailed description of the principles of Python geospatial analysis, Python scripting capabilities, and experimental data processing flow. Experimental results prove the feasibility of the script. Conclusion: In this article, the scripts developed manually based on ArcPy are significantly more error-prone than manual operations, Achieve batch consolidation of layers with the same name in the geodatabase.
Arcgis; Geodatabase processing; Python; Script editing; Merge
TP79
A
10.3969/j.issn.1003-6970.2018.07.034
刘翔宇(1993-),男,昆明理工大学国土资源工程学院硕士研究生,研究方向为3S技术集成及应用。
本文著录格式:刘翔宇,朱大明. Arcgis中基于Python的地理数据库批量合并方法研究[J]. 软件,2018,39(7):161-165