ESRI用户使用Python指南zz作者:HowardButler,Iowa州立大学中国地质大学(北京)土地科学系100029叶宝莹,编译ESRI软件中的脚本语言一直使用两种模式。第一种为AML宏语言,该模型显示了PrimOS系统特性。输出为文件格式,数据处理基于目录和文件系统,代码是线性的。第二个模式是AVENUE语言,继承了Smalltalk的特性。对象响应是调用方法名称,处理事物不必是线性的,有时会引起I/O冲突,集成啦其他语言的混合包。两种语言都有各自的弊端。随着ArcGIS8的出现,基于地理视图的脚本语言开始引入,基于接口的编程要求用户使用“真正的”编程语言,如,C++,VB,访问ArcGIS8的功能。没有脚本语言自动完成该系列任务。这用户必须写可执行程序,在复杂的接口树和对象里找到需要的工具,并汇编成DLLs动态库和类型库来使用自定义功能。ArcGIS9版本的面世,ESRI再次提供了访问该软件的新的脚本语言。ESRI意识到,许多用户并不想或不必是个开发者,但还想使用工具解决他们遇到的问题。这些工具包括,友好一致的界面,脚本对象,用于自定义功能所必须的细致入微的编程工具。满足这些需要,ESRI提供了多种脚本语言-使用ArcObjects-开始空间处理框架。Python,ESRI支持的脚本语言之一,是一种开源的,编译性的,动态类型的,面相对象的脚本语言之一。Python包含在ArcGIS9中,典型的安装与其他组件一起安装。本篇文章总体介绍如何利用Python的资源帮助大家的GIS编程以及集成ESRI工具。1Python简介Python第一次公开发行是1991年,作者是CWI(阿姆斯特丹国家数学和计算机科学研究所)的研究员GuidovanRossum。名字来源于Guido喜欢的喜剧连续剧“MontyPython”,python继承了许多其他语言的特征,如ABC,Modula,LISP,以及Haskel,这些包括很高级的特征,如元类(metaclass),生成器,列表综合(listcomprehension)。但更多的程序员需要的仅仅是python的基本类型,如,列表,字典,字符串。虽然,已经有13年的发展,目前的版本是2.3。这反映了Guido慈善的独裁者设计哲学,以及开发组的精益求精。他们努力增加新的内容,并保持向后的兼容性,当必要时,重新设计在以前发现有问题的地方。2python设计Python语言被设计成易于使用,易于学习的动态脚本语言,这意味着用户不需要编译,交互式的方式可以让用户学习到许多执行层次。Python的设计哲学,TimPeter在TheZenofPython描述的最清晰,python程序员遵照这些哲学指导他们学习这门语言,帮助他们编写代码,以保持python的一贯风格。3Python与GISPython提供了很多可能:与GIS系统集成、跨平台、容易与其他语言混合使用(C,C++,FORTRAN,Java)。这意味着,python在多语言开发的系统里是最容易成功的。因为各语言的设计,大规模应用的开发也是容易的。许多处理分析GIS数据的包和工具已经被开发出来。基本功能包括,操作shapefile,grid图像,以及更复杂的格式,如arcsde、web服务、数据库等。矢量格式一个调用开源库shapelib(shapelib.maptools.org)的python包—pyshapelib–,可以处理shapefile文件。可以从上下载。该包提供了访问shape的单个坐标点,访问DBF文件,以及简单的shape索引,如何操作shapefile原始的几何形状,或者通过DBF文件获取专门的记录。另个调用开源库的包为OGR(gdal.maptools.org/ogr/),可以用来处理多种矢量格式,包括MapInfo,ArcInfocoverage,PostGIS,OracleSpatial,TIGER,SDTS,OPeNDAP,DGN(MicrostationDGN)格式。OGR是空间数据提取库(GDAL)的一部分,可以下载GDAL整个包(hobu.stat.iastate.edu/gdal-1.2.0win32.exe)。使用python处理GRID数据GDAL可以处理arcinfogrid数据,还支持许多栅格数据,包括JPEG2000,BSP,USGSDEM,军事高程数据,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库,然后定位arcinfoGRID(.adf)数据文件位置,用引号引上。将GRID的内容传到Numeric矩阵,使用Numeric包的方法处理,下面为该过程的python代码:importGDAL库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――用于数据投影,可以从HobuGIS咨询网下载((hobu.biz/index_html/software/pyprojection/)。虽然该代码使用欧洲石油调查组织的代码系统,但用户可以定义自己的投影,使用原始参数简单的定义当前的投影,x,y坐标,调用一个方法变换到需要的投影,见下面代码。importProjectionalbers=[“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)用来调用ESRISDECAPI函数。几乎所有的SDECAPI都能调用,pySDE是个开源代码,但需要一个SDECAPI的许可,笔者开发pySDE的目的在于需要用脚本调用ARCSDE引擎,依赖脚本在UNIX平台上处理数据,而不需要ARCGIS。PySDE有个专门的几何代数引擎用于管理脚本(删除一个表,清除日志文件,复制数据),以及许多数据操作脚本。PySDE的另外一个优点在于python交互界面的直接性,可以实时看到命令的结果。当搜索复杂的层次时非常节省时间。当操作复杂的结构时,该工具能节省大量时间,如调用SDECAPI。WebGIS与PythonPython非常适合web开发,比java,.NET更节省时间。有许多python资源可以用作web开发,如zope(),一个应用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服务器是TerraServiceSOAPAPI,笔者开发一个软件包pyTerra(hobu.stat.iastate.edu/pyTerra),可以容易的访问MicrosoftTerraServer,例如,如果你想查询一个专门经纬度的数字正射四角照片的日期,一个方法是使用FGDC的元数据,使用ArcCatalog读取,当使用该方法时,比较呆板,不使用,如果你要查询1万到1万五个点的图像日期。使用程序是唯一可行的办法。幸运的是,TerraServer存储图像的获取时期到图像数据中,可以使用pyTerra调用WEBAPI可以快速的访问这些信息。例如下面的例子,获取TerraServer.上DRG地图或DOQ日期。frompyTSimportTerraImagefrompyTSimportpyTerraapt=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/.)上获取。作者:HowardButler,Iowa州立大学中国地质大学(北京)土地科学系100029叶宝莹,编译