ArcGIS Python编程案例(2)-使用ArcPy编写脚本

第一章 Python语言基础 ||| 第三章 管理地图文档和图层


本章将涉及以下案例:

  • 使用ArcGIS Python窗体
  • 访问ArcPy
  • 从脚本中执行工具
  • 使用ArcGIS桌面软件帮助系统
  • 使用变量存储数据
  • 访问ArcPy中的模块

引言

地理处理任务往往是耗时且重复性的工作,通常又需要定期执行。地理处理任务需要频繁地涉及到诸多数据图层及功能。针对ArcGIS的ArcPy Python站点包提供了一系列工具及其执行环境用于将数据转换为有意义的结果。使用脚本可以自动化完成地理处理任务,而且可以安排在单位最为合适的时间内执行。
ArcGIS提供了一个地理处理框架,通过一系列工具及其执行环境来自动化完成那些重复性的GIS任务。所有的工具都是对提供的输入数据集执行一定的操作后生成一个新的输出数据集。在一个较大的工作流程中,新生成的输出数据集必要情况下会作为其他地处理工具的输入数据集。ArcGIS地理处理框架提供了大量工具,每一个工具可执行特定的功能。
尽管你可以在许多不同的开发环境中编写Python地理处理脚本,不过本书将关注于内置的ArcGIS Python窗口以及Python的IDLE编辑器。

使用ArcGIS Python窗口

在本案例中,你将了解到如何使用ArcGIS Python 窗口。在第一章《Python语言基础》中,你已经了解到了如何在使用IDLE开发环境,本章介绍另一种编写地理处理脚本的开发环境。两种开发环境都可以使用,不过通常来讲你们会从ArcGIS Python 窗口开始编写脚本,编写复杂脚本再转到IDLE中。我也注意到你可能会考虑像PythonWin,Wingware,Komodo等开发环境。选择开发环境因人而异。

Getting ready

新的Python窗口是ArcGIS10版本桌面软件中的一个嵌入式交互式窗体。它适合于测试小的代码块,学习Python基础知识,创建方便快捷的工作流以及执行地理处理工具等。不过,随着脚本内容变得越来越复杂,你很快就会发现需要一个更加强壮(鲁棒性更好)的开发环境。默认情况下IDLE会随着ArcGIS桌面软件一起安装,因此IDLE理所当然地成为许多人的选择。尽管如此,对应新人来讲ArcGIS Python窗口仍是学习Python的好选择。
ArcGIS Python窗口除了用于编写代码之外还有许多功能。你可以将窗口中的内容保存为Python脚本文件,也可以将已有的Python脚本文件加载到窗体中。窗体位置可以固定或浮动。当处于浮动窗口时,窗体大小可以随意扩大或缩小。窗口也可以固定在ArcGIS界面的多个位置。你还可以通过在窗口中右键选择格式来设置窗体中的字体和文本颜色。

How to do it...

点击ArcGIS桌面软件工具条上的Python窗体按钮打开Python窗口。
1.在ArcMap中打开c:\ArcpyBook\Ch2\Crime_Ch2.mxd文件。

你可以不用打开Crime_Ch2.mxd文件。任何地图文档文件都可以在Python窗口中使用

2.点击ArcMap工具条上的Python窗口按钮打开Python窗口,见下图。Python窗口是一个浮动窗口,因此你可以根据需要缩放同时也可以将该窗口停靠在ArcMap界面中的多个位置:

Python窗体实际上是一个shell窗口,你可以在每行的输入符号>>>后面输入一行语句。右边侧栏是一个帮助窗口。
3.在Python窗体中右键单击选择加载(Load),选择C:\ArcpyBook\Ch2目录下的ListFields.py文件加载该脚本。
你还可以在窗口中右键选择格式(Format)来设置窗体中的字体和文本颜色。窗体提供了黑白两个主题,可以分别选择字体和颜色:

点击设置黑色主题(Set Black Theme)来看一下效果。如果需要花费大量时间来编写代码,你会发现深色背景主题看起来更舒服:

访问ArcPy

你在使用ArcPy提供的所有地理处理功能之前,需要首先在脚本中导入ArcPy包。这通常是你编写地理处理脚本的第一行代码。

Getting ready

AryPy是一个Python站点包并作为ArcGIS10版本产品的一部分。ArcPy包全面包含了ArcGIS9.2中的arcgis scriping模块的功能并作了进一步的扩展。使用ArcPy包,你就可以访问地理处理工具,扩展,函数和类来处理ESRI支持的GIS数据。ArcPy包为模块,类和函数提供了代码补全功能及详尽文档。
ArcPy包还可以与其他的Python模块一起使用来扩展功能的适用范围。你在使用Python编写的所有的地理处理脚本前必须首先导入ArcPy包。

How to do it...

按照以下步骤在Python窗体中导入arcpy站点包:
1.在ArcMap中打开c:\ArcpyBook\Ch2\Crime_Ch2.mxd文件。
2.点击Python窗口按钮打开shell窗口。
3.在Python窗口中导入arcpy包后按键盘上的的回车键。你在Python窗体中敲完每条语句后都要按回车键。import arcpy语句会出现你编写的每一个脚本文件中。import arcpy语句允许你访问ArcPy提供的所有功能。

理论上,在ArcMap Python窗口中没有必要一定要包含import arcpy语句。这是Python窗口固有的属性。不过在使用IDLE,PythonWin或其他IDE来编写独立脚本时该语句就很有必要了。由于大部分代码最终是以独立脚本的形式执行,因此包含import arcpy语句也是一个良好的编程习惯。

4.ArcPy还提供了代码自动补全功能来使得程序员的工作变得简单些。ArcPy是支持面向对象的程序包,这也就意味着你可以使用点标注符来访问对象的属性和方法。第二行代码敲入了arcpy和点标注符(.)后,注意到点标注符后出现了所有可用元素的下拉列表。下拉列表中的元素都是当前对象可用的工具,函数,类和扩展。所有对象都有自己相关的元素项,因此下拉列表中的内容会因当前选择的对象不同而不同:

5.上面出现的下拉列表是一个可自动筛选的列表,也就说只要你开始输入工具,函数,类或者扩展的名称,列表内容会根据输入的内容进行筛选过滤。

6.你可以通过鼠标或键盘上的方向键来高亮选择要使用的元素项,然后使用Tab键来键入命令实现代码自动补全。代码自动补全功能能够让你成为更高效的程序员。这不仅为方便使用,而且还会大大降低代码中拼写错误。

How it works...

ArcPy模块导入后,你就可以访问地理处理工具,扩展,函数和类来处理ESRI支持的GIS数据。ArcPy一个最重要的方面就是提供了当前ArcGIS桌面产品许可等级下所有可用的地理处理工具。脚本中可用的工具数量会因当前桌面产品使用的许可等级(包括基础版,标准版和高级版)的不同而不同。基础版许可下可用工具数量最少而高级版许可则提供最完整的的工具集。

从脚本中执行工具

作为一名ArcGIS用户,你肯定已经使用过许多ArcToolbox中的工具来完成地理处理任务。比如裁剪(clip),缓冲区(buffer),要素类转要素类(feature class to feature class),添加字段(add field)等等。在脚本中你也可以执行ArcToolbox中的所有工具。作为一名程序员需要记住能够使用的工具取决于当前ArcGIS桌面软件的许可级别。创建一个Python脚本执行ArcToolbox中的工具可实现地理处理任务自动化。
按照以下步骤学习如何在脚本中执行地理处理工具:
1.在ArcMap中打开c:\ArcpyBook\Ch2\TravisCounty.mxd文件。
2.打开Python窗体。
3.导入arcpy包:

import arcpy

4.设置工作空间。我们之前还没介绍过env类。env类是arcpy中一部分,ArcGIS中的环境设置就是env类的属性。env类其中的一个属性就是工作空间(workspace),工作空间定义了数据输入和输出的当前工作目录。在该案例中工作空间则是输出数据集要写入的目录:

arcpy.env.workspace = "c:/ArcpyBook/data/"

5.我们接下来使用Analysis Tools(分析工具箱)中的Buffer(缓冲区工具)工具对ArcMap中的当前活动数据框中的Streams图层执行缓冲操作。如下图所示,打开ArcToolbox,找到相应工具:

6.双击Buffer工具出现下图的界面。大多数工具需提供一个或多个输入参数才能执行。不管通过用户界面还是通过Python脚本执行工具,都需要提供这些必选参数:

7.关闭Buffer工具。
8.在Python窗体中执行Buffer工具。使用Python窗体的代码自动补全功能以及右侧栏中的工具帮助来完成。

执行以下代码会以50米半径缓冲Srtreams图层,并创建了一个新的Stream_Buff多边形图层:

arcpy.Buffer_analysis("Streams","Stream_Buff","50 Meters")

9.使用ArcMap的zoom缩放工具)和pan平移)工具来查看输出要素,如下图所示:

How it works...

脚本中所有可用的地理处理工具都被定义为arcpy对象的动态函数(dynamic function)。脚本中执行的每一个工具都必须遵循特定的语法规则,首先需要定义工具名称,之后紧跟一个下划线(_)和工具箱的别名。在我们的示例中,Buffer工具位于Analysis Tools工具箱中,该工具箱的别名为analysis。使用别名是因为可能有多个工具的名称相同。使用<toolname>_<toolbox_alias>的语句规则实现对每个工具的唯一引用。
ArcGIS桌面软件中获取工具箱别名很容易。找到工具所处的工具箱,然后右键点击工具箱名称。选择属性Properties)。在属性对话框中找到别名(Alias)文本框。你就会看到在地理处理脚本中要引用的工具箱别名:

动态函数除了表示地理处理工具之外,arcpy类中还有许多函数并非地理处理工具。比如创建游标,列出数据集,描述数据集,设置环境变量,消息等等。本书将会介绍其中大部分内容。

There's more...

地理处理工作流程通常需要分多个步骤进行,也就是说需要使用一个或多个地理处理工具。你可以先勾勒出脚本的轮廓框架这样就可以更为高效地编写脚本。这些轮廓框架可以帮助你随时思考你的地理处理任务,了解需要使用的地理处理工具。轮廓框架不需要太复杂,你可以简单地画出一个流程图,然后在此基础上编写代码。关键是你真正开始编写代码前要做好计划和准备。

使用ArcGIS桌面软件帮助系统

ArcGIS桌面软件帮助系统是一个获取工具相关信息非常优秀的资源。每一个工具都有一个独立页面来详细说明。该帮助系统可通过桌面软件或在线形式访问。

Getting ready

帮助系统除了包含每个工具的基本描述信息,还包含了Python程序员感兴趣的信息,比如语法规则以及示例代码,这些示例代码展示了在脚本中使用工具的细节信息。在本案例中,你将学习如何使用ArcGIS桌面软件帮助系统来获取语法规则信息和示例代码。

How to do it...

按照以下步骤来学习如何使用ArcGIS桌面软件帮助系统来获得工具的语法规则及示例代码。
1.打开ArcMap,选择主菜单中的帮助(Help)|ArcGIS Desktop帮助(ArcGIS Desktop Help)。
2.选择目录(Contents)选项卡。
3.选择地理处理(Geoprocessing)|地理处理工具参考(Tool Reference)。这里工具的组织形式跟在ArcToolbox中一致。
4.选择分析工具箱(Analysis toolbox)下的邻域分析工具集(Proximity toolset)
5.点击缓冲区(Buffer)。你就会看到缓冲区工具的帮助内容。如下图所示:

6.滚动页面至语法(Syntax)部分,如下图所示:

7.语法部分定义了在脚本中调用该工具的语法。在本例中,语法规则如下:
Buffer_analysis(in_features,out_feature_class,buffer_distance_or_field,{line_side}, {line_end_type},{dissolve_option}, {dissolve_field})

8.滚动页面至代码示例(Code Sample)部分,你会找到一个或是多个代码示例来说明如何在脚本中使用工具。建议在编写脚本之前应该看一下这些代码示例。

How it works...

每个工具的帮助页面内容包含了几个部分,其中包括概况(summary),图示(illustration),用法(uage),语法(syntax),示例代码(code example),环境(enviroment),相关主题(related topic)以及许可信息(licensing information)。作为一名程序员,主要关注语法和示例代码部分。查看语法部分会注意到使用工具名后跟下划线和工具所处工具箱的别名的组合形式来调用工具。我们在本章前面的案例中简单讨论过这个问题。工具通常包含一个或多个参数,这些参数位于工具名称后面的括号内。参数分为必选参数和可选参数。在本案例中,Buffer工具包含了三个必选参数:输入要素,输出要素以及缓冲距离。语法中必选参数会首先列出来且参数前后没有其他特殊字符。可选参数则在处于必选参数后面且参数被花括号({})括起。Buffer工具包含了几个可选参数,其中包括侧类型(line side),末端类型(line end type),融合类型(dissolve option)以及融合字段(dissolve field)。注意语法中每一个可选参数都用花括号括起。你在调用工具时候不需要一定包含这些可选参数。
你应该仔细查看语法部分的信息来确定要传递给每个参数的数据类型。比如说,buffer_distance_or_field参数接受的数据类型可以是线性长度单位也可以是字段名称。你可以使用一个数值或者使用包含距离信息的字段传递给该参数。
通常情况下,你在使用工具前应该查看工具的语法,这样可以确保你以正确的顺序和适当的数据类型来使用工具。
查看示例代码部分内容往往会帮助你找到编写脚本的切入点。你通常会复制示例代码内容到自己的脚本中去,然后根据需要修改脚本代码。这将帮助你成为一个更为高效的程序员,同时查看其它脚本代码并逐行检查代码来确定脚本的工作流程,从学习的角度来讲也是很有帮助的。

使用变量存储数据

我们在第一章《Python语言基础》中介绍了变量的有关内容,你现在应该对变量有了一个基本的认识。变量在脚本中是通过给定一个名称并赋值来创建。这些变量占据计算机内存中的空间,脚本运行时变量值可以更改。脚本执行完成后,变量占据的内存空间将被释放以进行其他操作。

Getting ready

使用Python编写地理处理脚本时,通常需要创建变量来保存一个或多个类型的数据。在脚本中,这些变量保存的数据可以作为工具和函数的输入参数,也可以作为处理过程的中间数据,比如数据集的路径等,另外还可以用作其他方面。除此以外,脚本中的许多ArcPy的函数和工具返回的数据也可以保存在变量中以作进一步处理使用。在本案例中,你将了解到创建变量和变量赋值的基本操作。

How to do it...

按照以下步骤创建一个包含变量的脚本,变量既有通过硬编码方式赋值的也有使用函数返回值赋值的:
1.打开IDLE,创建一个新的脚本窗口。
2.脚本保存为c:\ArcpyBook\Ch2\WorkingWithVariables.py文件。
3.导入arcpy包:

import arcpy

4.创建一个path变量并赋值:

path = "c:/ArcpyBook/data"

5.使用新创建的变量来设置工作空间:

arcpy.env.workspace = path

6.调用ListFields()函数,并将返回值赋值给一个新变量fields

fields = arcpy.ListFields("Building_Permits.shp")

7.使用for循环语句来处理包含在fields变量中每一个字段对象:

for fld in fields:

8.打印每一个字段名称:

print fld.name

9.完整代码如下:

import arcpy
path = "c:/ArcpyBook/data"
arcpy.env.workspace = path
fileds = arcpy.ListFields("Building_Permits.shp")
for fld in fields:
    print fld.name

10.保存脚本。

How it works...

我们在脚本中使用了三个变量。第一个变量path赋了一个包含路径内容的硬编码值。这是一个字面量参数,也就是说字面上的值就是它的参数值。字面量参数与那些参数值能由参数值本身直接决定的参数是有区别的。第二个参数fields是由ListFields()函数的返回值创建的,该参数是一个包含了一个或多个Field对象的Python列表对象。每一个Field对象代表一个要素类或者表数据中的属性表中的一个字段。最后一个参数fld是一个动态参数。当for循环语句遍历ListFields()函数返回的列表内容时,每一个Field对象会依次赋值给fld参数。每一个字段名称会打印到屏幕上。

访问ArcPy中的模块

到目前为止,我们介绍了一些与ArcPy有关的基本概念。除了使用基本的ArcPy站点包,你还可以使用许多其他模块来获取特定的功能。使用这些模块提供的功能之前必须首先明确地在脚本中导入这些模块。在本案例中你将学习如何导入这些模块。

Getting ready

ArcPy包除了提供了工具,函数和类之外,还提供了一些模块。模块(Module)是包含了针对特定用途的函数和类的Python库文件。ArcPy提供的模块包括制图模块(arcpy.mapping),数据访问模块(arcpy.da),空间分析模块(arcpy.sa),地统计模块(arcpy.ga),网络分析模块(arcpy.na)以及时间模块(arcpy.time)。使用每一个模块的函数和类之前必须明确地导入相关的库文件。

How to do it...

按照以下步骤来学习如何使用arcpy.mapping模块中的函数和类:
1.在ArcMap中打开c:\ArcpyBook\Ch2\Crime_Ch2.mxd文件。
2.打开Python窗体。
3.导入arcpy.mapping模块:

import arcpy.mapping as mapping

4.获取当前地图文档的引用(Crime_Ch2.mxd):

mxd = mapping.MapDocument("CURRENT")

5.调用arcpy.mapping.ListLayers函数:

print mapping.ListLayers(mxd)

将会返回地图文档文件中的所有图层列表并打印到shell窗口中:

[<map layer u'All Crimes in 2009'>, <map layer u'Burglaries in 2009'>, 
<map layer u'streams_buff'>, <map layer u'Crime Density by School District'>, 
<map layer u'Bexar County Boundary'>, <map layer u'Test Performance by School District'>, 
<map layer u'Bexar County Boundary'>, <map layer u'Bexar County Boundary'>, 
<map layer u'Texas Counties'>, <map layer u'School_Districts'>, 
<map layer u'Crime Surface'>, <map layer u'Bexar County Boundary'>]

按照同样的方式就可以访问制图模块中所有可用的函数和类

How it works...

ArcPy的每一个模块提供的功能针对一个特定的用途。比如说,制图模块提供了管理地图文档和图层文件的功能。该模块中的函数和类都在某种程度上与管理这类文件有关。


第一章 Python语言基础 ||| 第三章 管理地图文档和图层

推荐阅读更多精彩内容