1.导入ArcPy
在使用ArcPy之前,需要先导入ArcPy站点包。因此,在常见的地理处理脚本中,第一行代码会是:
import arcpy
在导入ArcPy之后,可以运行ArcGIS标准工具箱中的所有地理处理工具。ArcPy包含很多模块,其中有两个专业模块,分别是自动化制图模块(arcpy.mapping)和地图代数模块(arcpy.sa)。可以使用以下语句导入这些模块:
import arcpy.mapping
在编写ArcGIS脚本时,一般要先设置当前工作空间。例如,下面的代码会将C:/Data设置为当前工作空间。
import arcpy
arcpy.env.workspace=r’C:\Data’
在ArcPy中,地理处理环境参数可以通过env类的属性进行设置。
2.使用地理处理工具
ArcPy可以访问ArcGIS for Desktop中的地理处理工具。在Python脚本里,可以通过工具的名称来调用工具。利用Python调用工具的方法有两种。最早是通过调用函数的形式调用工具,所有工具在ArcPy中均已函数的形式提供。一个ArcPy函数针对某一个特定的任务完成相应的功能。
2.1通过函数调用工具
语法如下:
arcpy.<toolname_tool_boxalias>(<parameters>)
下面是运行Clip工具的代码:
import arcpy
arcpy.env = r'C:/Data'
arc.Clip_analysis("streams.shp", "study.shp", "result.shp")
2.2通过匹配工具箱别名的形式调用工具
以这种方式调用工具首先要引用工具箱的别名,随后是工具名,最后是工具参数。具体语法如下:
arcpy.<toolboxalias>.<toolname>(<parameters>)
下面是运行Clip工具的代码:
import arcpy
arcpy.env = r'C:/Data'
arc.analysis.Clip("streams.shp", "study.shp", "result.shp")
两种方法具有同样的效果。
2.3指定可选参数
可选参数在参数列表中总是位于必选参数的后面,但是有时一些可选参数也是需要设置的,有可能需要跳过一些可选参数。
下面以Buffer工具的语法为例:
Buffer_analysis(in_feature, out_feature, buffer_distance_or_field, {line_side}, {line_end_type}, {dissolve_option}, {dissolve_field})
我们可以通过设置参数为空字符串(”“)或井号(”#“)以及明确指定要使用的参数名称及其参数值来进行设置。
方法1:设置空字符
arcpy.Buffer_analysis("roads", "buffer", "100METERS", "", "","LIST","Code")
方法二:井号
arcpy.Buffer_analysis("roads", "buffer", "100METERS", "#", "#","LIST","Code")
方法三:明确参数名
arcpy.Buffer_analysis("roads", "buffer", "100METERS", dissolve_option="LIST",dissolve_field="Code")
4.getOuput
尽管很多工具都只有一个输出,但是也有一部分工具有多个输出。结果对象中getOutput方法可以通过索引值来获得指定的输出。获取地理处理结果的通用方法如下:
import arcpy
arcpy.env.workspace = "C:/Data/study.gdb"
buffer = arcpy.Buffer_analysis("str", ''str_buf", "100 METERS")
count = arcpy.GetCOunt_mangement(buffer).getOutput(0)
print str(count)
5.使用地理处理工具箱
ArcPy站点包被导入Python后,就可以使用ArcGIS所有的系统工具。在Python中导入自定义工具箱,也可以使用其中的自定义工具,所以即使自定义工具箱被添加到ArcToolbox中,如果没有使用import语句导入,那么也无法使用Python访问这些工具。
5.1导入工具箱
import arcpy
arcpy.ImportToolbox(path)
ImportToolbox函数引用的是磁盘上实际的工具箱文件(.tbx),而不是仅仅引用工具名称。
5.2获取工具
在导入工具箱后,利用Python获取工具的语法如下:
arcpy._
如果一个工具箱没有别名,则可以通过ImportToolbox函数的第二个参数,设置一个临时别名,具体的代码如下:
arcpy.ImportToolbox("sampletools.tbx", mytools)
一旦设置了别名,就可以通过Python访问工具箱的工具。假如文件sampletools.tbx包含一个叫做MyModel的工具,访问这个工具的代码如下:
arcpy.MyModel_mytools(<parameters>)
或者
arcpy.mytools.MyModel(<parameters>)
ImportToolbox函数还可以用于从网络或者本地服务器上加载地理处理服务。
6访问语法
6.1 Usage
在Python中,可以通过Usage函数获取工具的语法。例如,下面的代码输出了Editing Tools工具箱中所有的语法:
import arcpy
tools = arcpy.ListTools("*_analysis")
for tool in tools:
print arcpy.Usage(tool)
6.2 help
另一种在Python中访问语法的方法就是使用Python内置的help函数。例如,下面的代码将输出Clip工具的语法:
print help(arcpy.Clip_analysis)
7环境设置
环境设置是控制地理处理工具流的重要基础。env类的属性包含了一系列的地理处理环境,属性可以写入和读取具体值。访问env类属性的代码如下:
arcpy.env.<environmentName>
7.1工作空间
例如,可以使用以下代码设置当前工作空间:
import arcpy
arcpy.env.workspace = "C:/Data"
7.2类属性
env类中还有很多其他的属性。在ArcPy帮助文档中可以找到完整的列表,例如长度、输出坐标系,临时工作空间和XY域。下面将栅格大小设置为30:
import arcpy
arcpy.env.cellSize = 30
env类属性不仅可以进行环境的设置,也可以读取现有的环境的设置值。例如下面的代码读取了XY容差。
import arcpy
print env.XYTolerance
可以使用ArcPy ListEnvironments函数获得一个包含所有地理处理环境的列表:
import arcpy
print arcpy.ListEnvironments()
此外,ArcGIS中的地理处理选项也可以实现某些特定环境设置,例如覆盖地理处理操作的输出.
import arcpy
from arcpy import env
env.overwriteOutput = True
8 工具消息
工具运行时,相关信息会被记录下来。从ArcToolbox中运行运行工具时,如果没有启用后台处理,那么地理处理信息就会显示在进度对话框中;从Python窗口中运行工具时,只会显示错误消息。
当运行一个独立的脚本时,这些消息不回在窗口中显示,但是可以通过Python脚本获取这些消息,并对其进行查询,打印或将其写入文件。
所有消息都具有严重性属性,即信息性、警告或错误。其中0表示信息性,1表示警告,2表示错误。
8.1GetMessage
最近一次执行工具所生成的消息由ArcPy进行保存,并且可以使用GetMessage函数进行查询。
例如,当运行一个Clip工具时,获取其消息的代码如下:
import arcpy
arcpy.env.workspace = "C:/Data"
infc = "streams.shp"
clipfc = "study.shp"
outfc = "result.shp"
arcpy.Clip_analysis(infc, clipfc, outfc)
print arcpy.GetMessages()
代码运行的结果如下:
8.2GetMessageCount
GetMessageCount函数会返回最近一次执行工具时所生成的消息数。
arcpy.GetMessageCount()
8.3GetMaxSverity
此外,还可以使用GetMaxSeverity函数查询最严重的消息。
print arcpy.GetMaxSeverity()
8.4getMessage
结果类中很多属性和函数,getMessage返回特定的消息。例如运行下面代码可以查看消息,并打印最后一条消息。
import arcpy
arcpy.env.workspace = "C:/Data"
result = arcpy.GetCount_manage("streams.shp")
count = result.messageCount
print result.getMessage(count-1)
当使用arcpy.GetMessage()时,是在调用一个函数;而使用.getMessag()时,是在查询一个对象的属性。使用结果类比直接调用函数更具有优势,最为显著的一点就是在运行多个工具之后,仍然可以保留结果对象上的消息。