代码改变世界

推荐:ESRI用户使用Python指南

2007-06-15 21:16  flyingfish  阅读(2348)  评论(0编辑  收藏  举报
作者:Howard Butler, Iowa州立大学
中国地质大学(北京)土地科学系 100029 叶宝莹,编译

ESRI软件中的脚本语言一直使用两种模式。第一种为AML宏语言,该模型显示了PrimOS系统特性。输出为文件格式,数据处理基于目录和文件系统,代码是线性的。

第二个模式是AVENUE语言,继承了Smalltalk的特性。对象响应是调用方法名称,处理事物不必是线性的,有时会引起I/O冲突,集成啦其他语言的混合包。两种语言都有各自的弊端。

随着ArcGIS 8的出现,基于地理视图的脚本语言开始引入,基于接口的编程要求用户使用“真正的”编程语言,如,C++,VB,访问ArcGIS 8的功能。没有脚本语言自动完成该系列任务。这用户必须写可执行程序,在复杂的接口树和对象里找到需要的工具,并汇编成DLLs动态库和类型库来使用自定义功能。

ArcGIS 9版本的面世,ESRI再次提供了访问该软件的新的脚本语言。ESRI意识到,许多用户并不想或不必是个开发者,但还想使用工具解决他们遇到的问题。这些工具包括,友好一致的界面,脚本对象,用于自定义功能所必须的细致入微的编程工具。

满足这些需要,ESRI提供了多种脚本语言-使用ArcObjects-开始空间处理框架。Python,ESRI支持的脚本语言之一,是一种开源的,编译性的,动态类型的,面相对象的脚本语言之一。Python包含在ArcGIS 9中,典型的安装与其他组件一起安装。本篇文章总体介绍如何利用Python的资源帮助大家的GIS编程以及集成ESRI工具。

1 Python简介

Python第一次公开发行是1991年,作者是CWI(阿姆斯特丹国家数学和计算机科学研究所)的研究员Guido van Rossum。名字来源于Guido喜欢的喜剧连续剧“Monty Python”,python继承了许多其他语言的特征,如ABC,Modula,LISP,以及Haskel,这些包括很高级的特征,如元类(metaclass),生成器,列表综合(list comprehension)。但更多的程序员需要的仅仅是python的基本类型,如,列表,字典,字符串。

虽然,已经有13年的发展,目前的版本是2.3。这反映了Guido慈善的独裁者设计哲学,以及开发组的精益求精。他们努力增加新的内容,并保持向后的兼容性,当必要时,重新设计在以前发现有问题的地方。

2 python设计

Python语言被设计成易于使用,易于学习的动态脚本语言,这意味着用户不需要编译,交互式的方式可以让用户学习到许多执行层次。

Python的设计哲学,Tim Peter在The Zen of Python描述的最清晰,python程序员遵照这些哲学指导他们学习这门语言,帮助他们编写代码,以保持python的一贯风格。

3 PythonGIS

Python提供了很多可能:与GIS系统集成、跨平台、容易与其他语言混合使用(C,C++,FORTRAN,Java)。这意味着,python在多语言开发的系统里是最容易成功的。因为各语言的设计,大规模应用的开发也是容易的。许多处理分析GIS数据的包和工具已经被开发出来。基本功能包括,操作shapefile,grid图像,以及更复杂的格式,如arcsde、web服务、数据库等。

矢量格式

一个调用开源库shapelib(shapelib.maptools.org)的python包—pyshapelib--,可以处理shapefile文件。可以从www.hobu.biz/software/pyshapelib上下载。该包提供了访问shape的单个坐标点,访问DBF文件,以及简单的shape索引,如何操作shapefile原始的几何形状,或者通过DBF文件获取专门的记录。

另个调用开源库的包为OGR(gdal.maptools.org/ogr/),可以用来处理多种矢量格式,包括MapInfo,ArcInfo coverage,PostGIS,Oracle Spatial,TIGER,SDTS,OPeNDAP,DGN(Microstation DGN)格式。OGR是空间数据提取库(GDAL)的一部分,可以下载GDAL整个包(hobu.stat.iastate.edu/gdal-1.2.0win32.exe)。

使用python处理GRID数据

GDAL可以处理arcinfo grid数据,还支持许多栅格数据,包括JPEG2000,BSP,USGS DEM,军事高程数据,ECW(经增强压缩小波处理的数据),GRASS(地理资源分析支持系统数据格式),TIFF/GeoTIFF,NetCDF(网络通用数据格式),ERDAS *.img,SDTS(空间数据转换标准数据)等。该包的window版本可以从hobu.stat.iastate.edu/gdal-1.2.0win32.exe网址下载。许多其他格式这里就不一一列出。

GDAL合成了Numeric包,可以灵活的处理各种格式的图形代数操作来满足你的需要。例如,可以写个程序驻留在一个WEB服务器上,下载OGC的数据,使用一些代数处理数据,发布图像道WEB浏览器。一旦你有能力从数据显示脱离出来到数据处理时,处理能力会大大提高。

如,你想发现一个GRID的所有行,列单元的平均值,数据格式是arcinfo二进制格式的整数。使用python的交互界面,首先输入GDAL库,然后定位arcinfo GRID(.adf)数据文件位置,用引号引上。将GRID的内容传到Numeric矩阵,使用Numeric包的方法处理,下面为该过程的python代码:
>>> import GDAL库
>>> gd = GDAL库.gdal.Open(r’E:\gis\US_Elevation\usdem_2k\w001001.adf’)
>>> . = gd.ReadAsArray()
>>> avg = Numeric.average(Numeric.ravel(array))
>>> avg
-0.0071967281963325313

投影

开源代码库Proj.4的python封装包――py-projection――用于数据投影,可以从Hobu GIS咨询网下载((hobu.biz/index_html/software/pyprojection/)。虽然该代码使用欧洲石油调查组织的代码系统,但用户可以定义自己的投影,使用原始参数简单的定义当前的投影,x,y坐标,调用一个方法变换到需要的投影,见下面代码。
import Projection
albers = [“proj=aea”,
“ellps=GRS80”,
“datum=NAD83”,
“lat_1=29.5”,
“lat_2=45.5”,
“lat_0=23.0”,
“lon_0=-96.0”,
“x_0=0.0”,
“y_0=0.0”]
p2 = Projection.Projection(albers)
print ‘----------Albers--------------‘
print ‘Location: -93.00W, 42.00N’
print “Forward: “, p2.Forward(-93.00, 42.00)
print “Inverse: “, p2.Inverse(0.0, 0.0)

访问ArcSDE的脚本

笔者开发了一个python包pySDE(hobu.stat.iastate.edu/pysde)用来调用ESRI SDE C API函数。几乎所有的SDE C API都能调用,pySDE是个开源代码,但需要一个SDE C API的许可,笔者开发pySDE的目的在于需要用脚本调用ARCSDE引擎,依赖脚本在UNIX平台上处理数据,而不需要ARCGIS。PySDE有个专门的几何代数引擎用于管理脚本(删除一个表,清除日志文件,复制数据),以及许多数据操作脚本。PySDE的另外一个优点在于python交互界面的直接性,可以实时看到命令的结果。当搜索复杂的层次时非常节省时间。当操作复杂的结构时,该工具能节省大量时间,如调用SDE C API。

Web GISPython

Python非常适合web开发,比java,.NET更节省时间。有许多python资源可以用作web开发,如zope(www.zope.org),一个应用web服务器;mapsever(mapserver.gis.umn.edu),一个地图显示服务器,twisted(twistedmatrix.com/products/download),一个网络协议层,其他web开发的GIS通用开源工具描述如下:

Web服务器

Web服务使用简单对象访问协议(SOAP),XML远端程序调用(RPC),以及REST客户端在现今都很盛行。WEB服务器容许你编码一个XML结构的请求到服务器,并将结果以XML格式传回。该构架允许你更容易的在系统中分离数据存储和管理比例从应用端。Python提供许多web服务的工具,XML-RPC构建在语言中,许多SOAP,和REST代码库可以使用。

pyTerra

一个很有用的WEB服务器是TerraService SOAP API,笔者开发一个软件包pyTerra(hobu.stat.iastate.edu/pyTerra),可以容易的访问Microsoft TerraServer,例如,如果你想查询一个专门经纬度的数字正射四角照片的日期,一个方法是使用FGDC的元数据,使用ArcCatalog读取,当使用该方法时,比较呆板,不使用,如果你要查询1万到1万五个点的图像日期。使用程序是唯一可行的办法。

幸运的是,TerraServer存储图像的获取时期到图像数据中,可以使用pyTerra调用WEB API可以快速的访问这些信息。例如下面的例子,获取TerraServer.上DRG地图或DOQ日期。

>>> from pyTS import TerraImage
>>> from pyTS import pyTerra
>>> apt = TerraImage.point(42.00, -93.00)
>>> drg = pyTerra.GetAreaFromPt(apt, ‘Topo’,’Scale64m’, 1,1)
>>> doq = pyTerra.GetAreaFromPt(apt, ‘Photo’,’Scale64m’,1, 1)
>>> drg.Center.TileMeta.Capture
‘1976-07-01T00:00:00.0000000-07:00’
>>> doq.Center.TileMeta.Capture
‘1994-04-18T00:00:00.0000000-07:00’

从python的交互式窗口,可以看到DRG以及DOQ数据的日期是在1976-1994,这些字符可以转换成日期格式并存入数据库中,日期信息可以被捕捉,并写到图像上,使用PIL包,python可以容易的与web结合,pyTerra工具可以完成你大部分的工作。

结论

Python可以为你的GIS工具箱提供你一个完全工具集,在ArcGis中,新技术是无止境的,如web服务已经广泛的被Python支持。网上有许多python脚本资源,与该文件一起的资源可以在笔者的网站(hobu.biz/software/python_guide_esri/.)上获取。

作者:Howard Butler, Iowa州立大学

中国地质大学(北京)土地科学系 100029 叶宝莹,编译