第五章 自动化地图生产和打印 ||| 第七章 创建自定义地理处理工具
我们将在本章介绍以下案例:
- 查找地理处理工具
- 查找工具箱别名
- 使用脚本执行地理处理工具
- 使用地理处理工具结果作为其他工具的输入参数
- 设置环境变量
引言
ArcGIS桌面软件提供了800多个地理处理工具,这些工具都可以在Python脚本中使用。在本章中,你将学习如何在脚本中使用这些工具。每一个工具都有自己的特点。由于各个工具对输入参数的要求不同,执行每个工具的语法也有区别。我们会介绍如何使用ArcGIS桌面软件帮助系统来了解某一工具输入参数要求。脚本运行过程除了会生成一个或多个数据集,还会生成一组消息。我们还将了解如何使用这些消息。最后,我们会了解如何通过脚本获取并设置环境变量。
查找地理处理工具
地理处理脚本调用工具前,你需要先确认当前运行或者最终用户运行的ArcGIS桌面产品的许可级别下是否能够使用这些工具。这类许可级别的信息在ArcGIS桌面产品的帮助系统中可以找到。
Getting ready
你编写的脚本中调用的地理处理工具是否可用取决于当前使用的ArcGIS的许可级别。ArcGIS 10.1版本有三种许可级别,分别为基础版(Basic),标准版(Standard)以及高级版(Advanced)。三种许可级别分别对应于大家熟知的ArcView,ArcEditor以及ArcInfo。对于脚本编写人员来讲,想要在脚本中使用工具,那么理解许可级别是很重要的。除了许可级别之外,ArcGIS产品中的扩展模块也会影响工具的可用性。ArcGIS桌面产品提供了两种主要的查找工具方式。第一个是使用搜索窗口,第二个是浏览ArcToolbox工具箱中的内容。在本案例中,你将学习如何在搜索窗口查找在脚本中可使用的地理处理工具。
How to do it...
1.在ArcMap中打开C:\ArcpyBook\Ch6\Crime_Ch6.mxd
文件。
2.点击地理处理(Geoprocessing)菜单下的搜索工具(Search For Tools)。如下图所示弹出搜索窗口。通常情况下,你会用来查找工具:
3.在搜索文本框中输入Clip
。开始输入内容后,搜索文本框会根据输入的字符筛选结果。你会看到三个最有可能包含Clip
字符的工具,分别为
clip(analysis)
,clip(coverage)
,clip(data_management)
。ArcGIS中有一些具有相同名称的地理处理工具。为了能够唯一识别工具,工具名称后面紧跟所在工具箱的别名。我们会在下一个案例中来进一步了解工具箱别名的细节。
4.如下图所示,输入完成后点击搜索按钮生成一个匹配的工具列表。在搜索结果中工具会用锤子的图标来标识。你还会在搜索结果看到其他两种图标。一种是卷轴图标表示这是一个Python脚本工具,另一个就是包含多个颜色框的图标来表示这是一个模型:
5.选择Clip(Analysis)工具。之后会出现Clip(Analysis)工具的对话框。对于程序员来讲,仅仅这些并没有太多帮助。ArcGIS桌面软件帮助系统中工具帮助信息会更加详细。
6.点击工具对话框底部的工具帮助(Tool Help)按钮查看该工具的详细帮助信息。
7.滚动Clip工具帮助页面的底部来查看该工具的语法信息。
How it works...
帮助系统中包含了每一个工具有关的摘要,说明,用法,语法,代码示例,可用的环境变量,相关主题以及许可信息等内容。作为一名地理处理脚本程序员,你将主要关注处于页面底部的语法,代码示例以及许可信息部分的内容。
你应该查看位于工具帮助页面底部的许可信息部分以确保当前许可级别下可以使用该工具。
语法部分包含了如何在Python脚本中调用工具的相关信息,这些信息包括工具名称以及必选参数和可选参数。所有的参数都用括号括起。Clip
工具的必选参数包括in_feature,clip_feature
以及out_feature_class
。在脚本中调用该工具的时候,你必须向工具提供这些参数才能正确执行工具。第四个参数是一个叫做cluster_tolerance
的可选参数。可选参数使用花括号括起。下图就展示了一个可选参数的例子。不过这并不意味着当你调用该工具的时候也要使用花括号。帮助系统中只是通过花括号来指明该参数为可选参数:
查找工具箱别名
所有的工具箱都有自己的一个别名,在ArcGIS桌面产品中,工具箱别名与工具名称一起使用能够为每个工具提供唯一的引用。由于许多工具的名称相同,因此在脚本中调用某个工具时同时引用工具名称和工具箱别名就很有必要。
Getting ready
在上一个查找Clip工具的案例中,Clip工具出现在Analysis,Coverage以及Data Management工具箱中。每个工具箱中Clip工具执行不同的功能。举个例子,Analysis工具箱下的Clip工具使用某个输入要素来裁剪一个矢量要素类,而Data Management工具箱下的Clip工具则用于创建一个栅格的空间子集。由于存在多个工具同名的情况,因此我们应该同时使用工具名称和该工具所在的工具箱别名来标识该工具。在本案例中,你将学习如何查找工具箱的别名。
How to do it...
1.在ArcMap中打开C:\ArcpyBook\Ch6\Crime_Ch6.mxd
文件。
2.ArcToolBox若未显示,则打开ArcToolBox。
3.如下图所示找到Analysis Tools工具箱:
4.右键单击Analysis Tools工具箱选择属性(Properties)。如下图所示将弹出Analysis Tools Properties对话框。别名(Alias)文本框中则是工具箱别名:
How it works...
你可以按照以上的步骤来查找所有工具箱的别名。在Python脚本中,使用<工具名称>_<工具箱别名>的语法格式来引用工具。举个例子,如果你想调用Buffer
工具,你就可以使用buffer_analysis
语法来实现。工具箱别名都很简单。别名通常是一个不包含点划线和特殊字符的单词。在下一个案例中,我们将编写一个简单的脚本根据工具别名的语法格式来执行工具。
使用脚本执行地理处理工具
获取工具箱别名并核实了当前许可级别下工具的可用性之后,你就可以在脚本中执行该地理处理工具了。
Getting ready
现在你已经了解如何查找可用的工具以及如何准确引用这些工具,那么下一步就是整合这些知识来编写脚本执行工具。在本案例中,你将通过脚本来执行地理处理工具。
How to do it...
1.在ArcMap中打开C:\ArcpyBook\Ch6\Crime_Ch6.mxd
文件。
2.点击添加数据(Add Data)按钮,添加EdgewoodSD.shp
文件。
3.关闭Crime Density by School District图层以及Burglaries in 2009图层。目前该地图文档中只有一个多边形要素。EdgewoodSD图层表示Edgewood学区范围。现在我们编写一个脚本使用该图层来裁剪Burglaries in 2009要素。
4.打开ArcMap中的Python窗口。
5.导入arcpy
模块:
import arcpy
6.创建一个变量并引用要裁剪的输入要素类:
in_feature ="C:/ArcpyBook/data/CityOfSanAntonio.gdb/Burglary"
7.创建一个变量并引用用于裁剪的要素类:
clip_feature = "C:/ArcpyBook/Ch6/EdgewoodSD.shp"
8.创建一个变量并引用输出的要素类:
out_feature_class = "C:/ArcpyBook/Ch6/ClpBurglary.shp"
9.执行Analysis Tools工具箱下的Clip
工具:
arcpy.Clip_analysis(in_feature,clip_feature,out_feature_class)
10.运行脚本。如下图所示,结果中仅包括添加到数据框中Edgewood学区范围内的发生盗窃案的点数据:
How it works...
本案例中重要的一行代码就是最后执行Clip
工具。我们通过Clip_analysis
的语法来调用工具,该语句指定了我们引用的是Analysis Tools工具箱(别名为analysis
)下的Clip
工具。我们还向该工具传递了三个参数,分别为输入要素类,裁剪要素类以及输出的要素类。这里还需要指明一点每个数据集的路径采用了硬编码的方式。这其实并不是一个好的编程习惯,在这里只是用来说明如何执行工具。后面的章节中,我们还会阐述如何移除脚本中的硬编码,使脚本更加灵活。
你使用的大部分工具都会要求提供数据源的路径。路径必须与ArcCatalog中位置(Location)工具栏中的一致,如下图所示:
工具使用ArcCatalog中的路径来查找地理数据。该路径是一个字符串且每一个数据集的路径都是唯一的。路径中可以包括文件夹位置,数据库链接或者是URL地址。因此你在编写脚本处理数据前,使用ArcCatalog来查看路径是很重要的。ArcSDE路径需要特别注意。许多ArcSDE用户并没有有一个标准化的连接名称,这会在运行模型或脚本的时候出现问题。
There's more...
地理处理工具有两种组织管理方式。你可以以arcpy
中函数的形式来访问工具,也可以以工具箱别名命名的模块中的函数的形式来访问工具。第一种情况,即工具作为arcpy
中的函数,工具会以本案例中的格式来调用。工具名后紧跟下划线以及工具箱别名。第二种情况,即工具作为使用工具箱别名的模块中的函数。按照如下的方式来调用:
arcpy.analysis.Clip(in_feature,clip_feature,out_feature_class)
其中工具箱别名analysis
作为一个模块,Clip
作为该模块中的函数。
使用哪一种方式是个人偏好。两种方式都可以执行地理处理工具。
使用地理处理工具结果作为其他工具的输入参数
使用某个工具的输出结果作为其他工具的输入参数的情况会经常碰到。这种情况称为工具链。举个例子,对一个河流的图层执行缓冲区操作后再查找所有落在缓冲区范围内的居民点。在这种情况下Buffer
工具会先生成一个新的图层,之后新生成的图层会作为按位置选择图层工具或其他叠加工具的输入参数。在本案例中你将学习如何获取工具的输出结果并将其作为其他工具的输入参数。
Getting ready
Buffer
工具会从一个输入要素图层中按照指定的距离参数生成一个输出要素类。该输出结果保存在一个变量中,之后该变量可作为按位置选择工具图层的输入参数。在本案例中,你将学习如何将Buffer
工具的输出结果作为按位置选择工具的输入参数以查找所有位于河流0.5英里范围内的学校。
How to do it...
1.打开ArcMap,创建一个新的地图文档。
2.点击添加数据(Add Data)按钮,添加C:\ArcpyBook\data\TravisCounty
中的Streams.shp
和Schools.shp
文件。
3.点击Python窗口按钮。
4.导入arcpy
模块
import arcpy
5.设置工作空间:
arcpy.env.workspace = "C:/ArcpyBook/data/TravisCounty"
6.使用try
语句,创建分别保存河流图层,河流缓冲区图层,缓冲距离值以及学校图层的变量:
try:
streams = "Sream.shp"
streamsBuffer = "StreamsBuffer.shp"
distance = "2640 Feet"
school2mile = "Schools.shp"
7.调用Buffer
工具,并将保存河流图层,缓冲区图层,距离的变量以及用于控制缓冲区外观的几个参数传递给该工具:
arcpy.Buffer_analysis(streams,streamsBuffer,distance,"FULL","ROUND","ALL")
8.调用Make Feature Layer
工具创建一个引用Schools.shp
文件的临时图层:
arcpy.MakeFeatureLayer_management(schools2mile,"School2Mile_lyr")
9.调用Select Layer by Location
工具选择位于学习0.5英里范围内的所有的学校:
arcpy.SelectLayerByLocation_management("School2Mile_lyr","intersect",streamsBuffer)
10.添加except
语句用于捕获错误信息:
except:
print "Error in script"
11.完整代码如下:
import arcpy
arcpy.env.workspace = "C:/ArcpyBook/data/TravisCounty"
try:
streams = "Streams.shp"
streamsBuffer = "StreamsBuffer.shp"
distance = "2640 Feet"
schools2mile = "Schools.shp"
arcpy.Buffer_analysis(streams,streamsBuffer,distance,"FULL","ROUND","ALL")
arcpy.MakeFeatureLayer_management(schools2mile,"Schools2Mile_lyr")
arcpy.SelectLayerByLocation_management("Schools2Mile_lyr","intersect",streamsBuffer)
except:
print "Error in script"
How it works...
Buffer
工具生成了一个StreamsBuffer.shp
的文件并保存在streamsBuffer
变量中。之后该变量作为按位置选择图层工具的第三个参数。只要简单地将某工具的结果赋给一个变量后,再在其他工具中调用该变量即可。
设置环境变量并查看工具消息
环境变量提供了可设置的额外参数,这些环境变量可在多个环境级别中作为全局变量来获取。你可以在脚本中获取环境变量并设置变量值。你需要了解环境变量在脚本中的可用性以及获取方式。除此以外,工具在执行过程中会返回消息文本。这些消息也有不同类型。
Getting ready
环境变量设置在工具执行过程中可在脚本中使用的附加参数。你可以通过点击地理处理(Geoprocessing)-环境变量(Environment)菜单打开一个对话框,这就在ArcGIS桌面软件应用程序级别下一次性设置这些环境变量的值,如下图所示,环境变量是以目录形式来进行组织:
这些设置与操作系统的环境变量设置非常类似,只不过这些环境变量仅针对于ArcGIS地理处理框架。应用程序级别环境设置是最高级别,也是应用于所有工具的默认设置。除了应用程序级别环境设置,你还可以应用工具级别的环境设置。工具级别环境设置会直接继承来自应用程序级别的环境设置。不过,工具级别设置仅应用于当前工具且会覆盖应用程序级别的环境设置。Python脚本中可以通过arcpy
中的env
类来获取并设置环境变量,这些变量都是读/写属性。应用程序级别和工具级别环境设置都可以在脚本中调用且都可以应用于通过脚本运行的所有工具。你还可以覆盖脚本中即将在工具执行过程中使用的环境设置。需要注意的是,在脚本中的环境设置仅应用于当前执行的脚本。不过,有两种情况下环境设置不能在脚本中调用。脚本在ArcGIS应用程序以外的环境下运行,比如通过操作系统的命令行模式执行脚本,以及脚本调用其他脚本的情况下不能在脚本中调用环境设置。在本案例中,你会学习如何在脚本中设置环境变量以及查看工具执行过程中返回的消息文本。
How to do it...
1.在IDLE中创建一个新的脚本并保存为C:\ArcpyBook\Ch6\SetEnvVariables.py
文件。
2.导入arcpy
模块:
import arcpy
3.使用环境变量来设置工作空间路径:
arcpy.env.workspace = "C:/ArcpyBook/Ch6"
4.调用Buffer
工具:
arcpy.Buffer_analysis("Streams.shp","Streams_Buffer.shp","200 Feet")
5.打印工具执行过程中返回的消息文本:
print arcpy.getMessages()
6.保存脚本。
How it works...
环境变量可以在应用程序级别以及工具级别下进行设置。应用程序级别环境设置类似于全局环境设置,将会影响所有的工具。而工具级别环境设置则仅影响当前运行的工具。这两种环境级别设置都可以在ArcGIS软件中设置。你也可以在脚本中设置环境变量,不过这仅作用于当前执行的脚本。这与工具级别下的情况类似。脚本中最为常用的环境变量设置就是env.workspace
变量,该变量用于定义当前脚本的工作目录。由于在脚本的顶部设置了当前工作空间,脚本的其他位置也就不需要引用数据集的完整路径,这会让代码更为简洁,不过还是需要引用工作空间下的数据集名称。