ArcGIS Python编程基础与应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4 利用ArcPy编写第一个程序

ArcPy是一个Python站点包,可通过Python高效地执行地学数据分析、数据转换、数据管理和地图自动化等操作。ESRI公司从ArcGIS 9.2开始就提供了ArcPy来编写地学数据处理代码。目前ArcPy已经是ArcGIS重点支持的二次开发语言了,其功能也越来越强大。ArcPy提供了丰富纯正的Python体验,并针对每个函数、模块和类提供了参考文档。

若要利用ArcPy提供的处理地学数据的功能,首先要在代码中导入ArcPy模块,这是在写代码时,应该在第一行写的语句。可以在ArcGISPython窗口中输入如下代码(注意大小写,每输入一行代码后需要按下Enter键):

img

这样就可以使用ArcPy站点包的所有功能了。ArcPy也提供了提示功能让用户更加方便地编程。由于ArcPy也是一种面向对象的语言,因此我们可以获取对象的属性和方法。比如在第二行输入“arcpy.env=”后,ArcPy会自动出现提示,如图2.11所示,可以通过上下键选择相应的命令并用Tab键完成选择。

img

图2.11 ArcPy语句自动提示功能

如果只想使用ArcPy的部分功能(如模块或者公开的类),则可以使用部分功能导入语句:from-import。如想使用ArcPy的Env类功能时,使用from-import语句即可以满足需求。

img

可以使用from-import-as语句进一步为导入的部分功能设置一个别名,如上面的例子,可以写成如下代码:

img

虽然使用用户设置的别名没有缩短程序,但是可以使程序的可读性大大增强。

from-import-as*语句可以直接使用模块的命名空间,也就是说,不需要再使用前缀(如“myEnv”)来引用特定的功能,而是直接可以写功能语句,如上例可以写成:

img

下面以做一个缓冲区的例子详细介绍利用ArcGISPython窗口实现的过程。

(1)启动ArcMap,打开地图文档,本书以包头地区地学数据为例;

(2)启动ArcGISPython窗口;

(3)导入ArcPy模块;

(4)设置工作空间,ArcGIS的环境设置可以使用Env类的属性来获取,该类属于ArcPy的一部分。通过该类的调用,我们可以设置输入数据和输出数据的默认工作目录。

img

(5)调用缓冲区分析工具,如图2.12所示,输入“arcPy.Buffer_analysis(”后,ArcGISPython窗口的右侧部分自动弹出关于该功能的使用帮助,主要介绍该功能的参数说明。如果已经有地图文档打开,则系统会自动出现地图文档中的图层名,让用户选择,用户只要知道各个参数的含义,就可以轻松设置Buffer_analysis需要的各个参数,输入完毕后,按下Enter键,系统就开始自动执行缓冲区分析。

img

图2.12 ArcPy函数参数的自动提示

例如,本例输入:

img

执行缓冲区后产生的结果如图2.13所示。也可以使用变量来存储相关的数据。

除了提供基本的工具、函数和类,ArcPy也提供了很多模块。模块实际是具有特定功能的Python库,包括不同的函数和类。ArcPy中的模块主要包括地图模块(ArcPy.mapping)、数据存取模块(ArcPy.da)、空间分析模块(ArcPy.sa)、网络分析模块(ArcPy.na)和时间模块(ArcPy.time)。如果要使用这些模块的功能,必须首先导入模块。

下面详细介绍一个使用地图模块的例子,用户可以通过这个例子了解使用不同模块的功能。

(1)在ArcMap中打开一个地图文档。

img

图2.13 执行缓冲区后产生的结果

(2)打开ArcGISPython窗口。

(3)在程序中写入导入地图模块的代码。

img

(4)获得一个当前地图文档,并赋值给一个变量。这里需要注意的是,ArcMap当前打开的地图文档用current表示,这是一个比较简便的方法,用户也可以写全文件名,同样也能打开这个地图文档。

img

(5)调用地图模块的ListLayers()函数,显示该地图文档所有的图层。

img

程序执行后,就会返回所有图层的图层名,并显示在该窗口。调用其他模块的方法与这个例子类似,因此用户可以非常方便地调用不同模块的功能。

在普通Python窗口的代码如下所示:

img

细心的读者会发现,这里在导入地图模块时使用的语句与导入ArcPy模块的语句略有不同。在Python编程时,模块导入常用的模式主要有直接整体导入(import)和部分导入(from...import)两种。from...import与import区别在于,import直接导入指定的库,而from....import则是从指定的库中导入指定的模块或类。

import...as的用法是import A as B的形式,表示给予A库一个B的别称,帮助记忆,提高程序的可读性。