张世富
(菏泽学院, 山东 菏泽, 274000)
GIS(地理信息系统)不仅要完成管理大量复杂的地理数据的任务,更为重要的是完成地理分析评价预测和辅助决策的任务[1],空间分析是GIS最具特色的内容,建立空间分析模型的过程(空间分析建模)是综合分析处理和应用空间数据的有效手段,也是开发分析决策型GIS不可或缺的步骤[2]。
ArcGIS的Model Builder视窗提供了构建地理处理工作流和脚本的图形化建模环境[3],但是进行空间分析建模有其不足之处:首先,在进行数据批量化处理时操作复杂、处理速度缓慢而且运行不稳定。其次,在Model Builder中建模无法对空间分析结果进行统计以及进行必要的计算。
本文使用Python编程语言以及ArcGIS10.0中新添加的ArcPy工具包中的各种函数以函数式编程的方法[4]进行空间分析建模。以多边形矢量图层的矢量-栅格叠置分析并计算其吻合度为例阐述基于Python与ArcPy的GIS空间分析建模原理及其实现方法。
Python[5]是一种底层基于C语言实现的脚本语言,但其已从Linux平台上的一个脚本语言发展成为跨操作系统多种底层实现的通用语言,并且可以实现对既有的C/C++库调用,大大丰富了Python的功能[6]。Python 具有以下特点:1)简单易学、免费开源;2)跨平台的解释性高级语言,具有很强的健壮性[7];3)可扩展的面向对象编程语言;4)ArcGIS主要支持。
Arcpy是Arcgis10中新的Python库,包含有函数(Function)、类(Class)和模块(Module),可以实现的功能有:能访问所有GP工具;可以进行数据转换、数据管理;数据分析;并实现自动化制图。
基于Python与ArcPy的GIS空间分析建模是通过Python调用ArcPy中的各种函数、类和模块来实现各种空间分析功能,以函数式编程的方法[4]实现对数据的空间分析。本文使用该方法实现空间数据的矢量栅格叠置分析,以基于对象的影像最优分割结果选取为例来阐述基于Python与ArcPy的GIS空间分析建模的实现方法。
近年来,基于对象影像分析(OBIA)已经发展成为遥感影像处理领域中的一个新范式。基于对象影像分析处理的单元不再是单个的像元,而是通过影像分割产生的影像对象。因此,影像分割的质量对影像分类以及分类结果的精度有决定性的影响。差异性分析法是目前主要的影像分割质量评价方法,是将分割结果与已有样区数据进行对比,比较差异,主要度量方法有基于区域范围度量、基于边界位置度量和混合度量[8]。
本文将使用基于区域范围的度量方法以函数式编程的方法进行GIS空间分析建模,选择最优的分割结果。
根据以上需求,将空间分析模型设计为以下几个部分:
矢量叠置分析。由于模型需要计算分割多边形(分割结果)与参考多边形(已有样区数据)的面积差异,所以首先要选取匹配多边形(与参考多边相对应的分割多边形)。
矢量转栅格。由于分割多边形边界是由像元边界的合并而来,多为锯齿状;而参考多边形由数字化得到,边界较为平滑,为避免由于边界误差引起的面积差异而导致所计算出的评价指标产生偏差,我们将参考数据转换为与分割影像像元分辨率相同的栅格文件,再进行栅格叠置分析可以得到准确的面积参数。
栅格叠置分析。最终我们需要从空间分析结果中得到三个参数来计算评价指标,即重叠面积、过分割面积、欠分割面积[9],为便于数据分析,我们在矢量转栅格时将多边形所在区域栅格属性赋值为1,其余赋值为0,这样经过栅格叠置分析就可将三部分面积区别开来。
分析结果导入数据库。空间分析结束后我们将分析结果导入Geodatabase中以方便存储与管理。
空间数据属性读取与统计分析。空间分析结束后,我们需要读取分析结果属性表中的面积参数计算评价指标并写入Excel表格中,最终选取最优的分割结果作为函数返回值反馈给用户。具体流程如上图所示:
1.设定模型运行环境
以函数式编程的方法进行空间建模,最重要的就是模型中各函数的可运行性,在运行模型之前首先要设定其运行环境,包括:导入函数运行所需要的各种模块;检测ArcPy工具包中空间分析模块的可用性。
2.定义循环与临时文件存储路径
程序中需对空间数据进行批量处理,所以我们需要使用遍历函数对空间数据进行遍历并将结果返回到一个列表中,然后我只对列表进行操作即可。首先指定遍历函数的工作空间,然后使用ListFiles函数对空间数据进行遍历。
由于空间分析过程中产生大量的临时文件,使用tempfile模块在指定路径自动建立一个临时文件夹,存储空间分析过程中产生的临时文件存并在程序运行结束后删除。
3.空间分析建模
空间分析主要包括四个部分:矢量叠置分析、矢量转栅格、栅格叠置分析和将分析结果导入数据库。
(1)矢量叠置分析
在选择匹配多边形时使用面积比值方法,为减少不必要的计算首先选择与参考多边形具有相交关系的分割多边形,再使用面积比值进行二次选择。
使用SelectLayerByLocation函数对分割多边形进行初次选择,然后分别计算分割多边形与参考多边形的面积,最后采用面积比值使用Select_analysis函数选择匹配多边形,即相交部分面积大于自身面积50%或大于参考多边形面积50%的分割多边形为匹配多边形。
(2)矢量转栅格
在矢量转栅格前我们先定义一个“value”字段并赋值为1,以研究区范围作为栅格文件的边界,这样在边界范围内由多边形转换产生的栅格属性为1,其余栅格属性为0,以便于栅格叠置分析。
(3)栅格叠置分析
在矢量转栅格过程中已经将多边形区域赋值为1,匹配多边形与参考多边形进行相加运算后产生的栅格文件的重叠面积、过分割面积与欠分割面积属性值分别被赋值为2、1和1。然后将第一次运算结果与分割多边形转换为的栅格文件相加产生最终栅格结果,栅格文件重叠面积、过分割面积与欠分割面积属性值分别被赋值为3、1和2,从而可以将其区别开来。
(4)将分析结果导入数据库
空间分析结束后我们使用FeatureClassToGeo database_conversion函数将分析结果导入Geodata base中以方便存储与管理。
4.空间数据属性读取与统计分析
空间分析结束后,我们使用SearchCursor函数读取分析结果属性表中的面积参数计算评价指标。然后使用第三方模块pyExcelerator模块将计算的得到的评价指标写入Excel表格中。
5.设置返回值并删除临时文件
在循环结束后我们为前边所定义的函数设置一个返回值,返回通过比较产生的最优分割参数指标,另外所有分割结果通过分析所产生的评价指标都保存在Excel表中。
在进行批量处理过程中,由于产生大量临时文件,所以在每次循环结束后要将产生的临时文件删除,我们使用shutil模块中的rmtree函数将每次循环开始产生的临时文件夹删除。
Python作为ArcGIS主要支持的脚本语言,在GIS中已经得到广泛使用,特别是ArcGIS 10的Python脚本中引入新的ArcPy,使Python与ArcGIS结合得更紧密。Python可以直接调用ArcGIS中的各种分析工具与函数,大大提高系统的运行效率,另外,Python脚本语言简单易学、可移植性、扩展性强、而且具有极高的编程效率。相信Python会在空间分析建模中得到越来越广泛的应用。
[1]汤国安,赵牡丹.地理信息系统[M].北京:科学出版社,2000.
[2]程 满,梁 虹,等.基于空间问题建模概念过程的空间分析建模与实现[J].计算机工程与设计,2007,(16).
[3]方 芳,徐世武,万波.GIS空间分析建模技术进展研究[J].测绘科学,2010,(6).
[4]Wikipedia:Functional Programming.[EB/OL].2008-04-16.http://en.wikipedia.org/wiki/Functional_programming
[5]Python Official Documentations[EB/OL].2008-04-16.http://www.prthon.org/about/.
[6]孙 宇,蒲英霞.使用Python函数式编程进行空间回归分析[J].地理信息世界,2009,(6).
[7]Wesley J.Chun,宋广吉(译).核心编程(第二版)[M].北京:人民邮电出版社,2008.
[8]Y.J.ZHANG.A SURVEY ON EVALUATION METHODS FOR IMAGE SEGMENTATION.Pattern Rrcognition 1996,(8).
[9]张世富.宁夏中卫黄灌区耕地时空变化及其环境经济效应研究[D].兰州:兰州大学,2012.