ArcPy 是一个以成功的 arcgisscripting 模块为基础并继承了 arcgisscripting 功能进而构建而成的站点包。目的是为以实用高效的方式通过 Python 执行地理数据分析、数据转换、数据管理和地图自动化创建基础。
通过 ArcPy 可访问地理处理工具和其他函数、类和模块,从而快速轻松地创建各种简单或复杂工作流。
使用以 ArcPy 编写的 ArcGIS 应用程序和脚本的优势在于,可以访问并使用由来自多种不同领域的 GIS 专业人员和程序员开发的大量 Python 模块。使用 Python 中的 ArcPy 的另一个主要原因是,Python 是一种通用的编程语言,易于学习和使用。通过这一解释和动态型编程语言,用户可以在交互式环境中快速地创建脚本原型并进行测试,同时这种编程语言功能强大,可编写大型应用程序。
通过 ArcPy 可访问地理处理工具以及其他函数、类和模块,从而创建简单或复杂工作流。一般来说,ArcPy 按工具、函数、类和模块进行组织。
从技术角度讲,地理处理工具是可通过 arcpy 访问的函数 - 也就是说,可以像其他任何 Python 函数那样访问这些工具。但是,为了避免引起混淆,总是会在工具函数和非工具函数之间加以区分(如实用程序函数 ListFeatureClasses())。
- 工具的记录方式与函数不同。每个工具在 ArcGIS Desktop 帮助系统中都有自己的工具参考页面。函数则记录在 ArcPy 文档中。
- 工具会返回 Result 对象;而函数不会。
- 工具会生成可通过各种函数(如 GetMessages())进行访问的消息。函数不会生成消息。
- 工具按产品级别(ArcGIS Desktop Basic、Desktop Standard 或 Desktop Advanced)和扩展模块(ArcGIS Network Analyst、ArcGIS Spatial Analyst 等)进行授权。您可以在工具参考页面上查找所需的许可等级。不对函数进行授权 - 它们随 ArcPy 一起安装。
运行工具
以下示例显示了如何执行缓冲区工具。执行该工具时,消息将默认显示在帮助部分中 Python 窗口的右侧。
>>> arcpy.Buffer_analysis("c:/data/Portland.gdb/streets", "c:/data/Portland.gdb/steets_buffer", "500 METERS")
以下是另一个有关运行工具的示例。该示例使用的是数据管理工具箱和转换工具箱中的工具。向输入 streets 要素类添加一个字段并计算该字段,然后将要素类加载到企业级地理数据库中。
>>> import arcpy
>>> arcpy.AddField_management("c:/data/Portland.gdb/streets", "LENGTH_MILES", "TEXT")
>>> arcpy.CalculateField_management("c:/data/Portland.gdb/streets", "LENGTH_MILES", "!shape.length@miles!", "PYTHON_9.3")
>>> arcpy.FeatureClassToFeatureClass_conversion("c:/data/Portland.gdb/streets", "Database Connections/MySDE.sde/PortlandDataset", "streets")
从工具获取结果
执行地理处理工具时,工具的结果会返回到 Result 对象中。通常,该对象是由工具生成或更新的输出数据集的路径。在其他情况下,它可能会包含其他类型的值,如数值或布尔值。如果工具的输出是多值参数,则这些值可在列表中以列表的形式返回。
以下代码示例显示了如何捕获返回值以及这些值的具体内容:
返回输出要素类的路径。该结果可用作其他函数的输入。
>>> result = arcpy.Buffer_analysis("rivers", "riverBuf", "50 METERS")
>>> print result
C:\Portland\Portland_OR.gdb\riverBuf
>>> arcpy.Clip_analysis("streets", result, "streets_50m_of_rivers")
返回要素数目。
>>> result = arcpy.GetCount_management("streets_50m_of_rivers")
>>> print result.getOutput(0)
54
返回要素类的默认空间格网索引列表。
>>> result = arcpy.CalculateDefaultGridIndex_management("streets_50m_of_rivers")
>>> for i in range(0, result.outputCount):
... print result.getOutput(i)
...
560
200
0
使用环境设置
可将地理处理环境设置视为影响工具执行结果的附加参数。这些参数与正常的工具参数不同,因为它们是通过工具单独进行设置的,并且供工具在运行时查询和使用。诸如感兴趣区域、输出数据集的坐标系以及新栅格数据集的像元大小等环境设置均可通过工具进行指定和支持。
可通过 env 类来获得属性形式的环境设置。这些属性可用于检索和设置当前环境值。下面是如何使用环境值的示例:
设置工作空间环境。
>>> arcpy.env.workspace = "c:/data/Portland.gdb"
>>> arcpy.Buffer_analysis("streets", "streetBuf", "500 METERS")
将空间格网索引设置为工具的返回值。
>>> arcpy.env.spatialGrid1 = arcpy.CalculateDefaultSpatialGridIndex_management("streets").getOutput(0)
获取当前栅格像元大小设置并确保其为标准输出的指定大小。
if arcpy.env.cellSize != 30:
arcpy.env.cellSize = 30
使用函数
函数是用于执行某项特定任务并能够纳入更大的程序的已定义功能。除工具之外,ArcPy 还提供了多种函数,用来更好地支持地理处理工作流。函数可用于列出某些数据集、检索数据集的属性、检查数据是否存在、在将表添加到地理数据库之前验证表名称,或执行其他许多有用的脚本任务。
以下示例代码显示的是获得数据的属性并检出扩展模块:
import arcpy
# prints True
print arcpy.Exists("c:/data/Portland.gdb/streets")
# prints NAD_1983_StatePlane_Oregon_North_FIPS_3601_Feet
sr = arcpy.Describe("c:/data/Portland.gdb/streets").spatialReference
print sr.name
# prints Available
print arcpy.CheckExtension("spatial")
arcpy.CheckOutExtension("spatial")
使用类
ArcPy 类,如 SpatialReference 和 Extent 类,通常用作地理处理工具参数设置的快捷方式,否则的话,这些参数会使用更加复杂的字符串。类的作用类似于建筑设计蓝图。蓝图为如何创建事物提供了一个框架,而类则可用来创建对象,即通常所称的实例。
import arcpy
spatial_ref = arcpy.SpatialReference("Hawaii Albers Equal Area Conic")
使用模块
ArcPy 包含涉及其他 ArcGIS 领域的模块。ArcPy 由一系列模块支持,包括数据访问模块 (arcpy.da)、制图模块 (arcpy.mapping)、ArcGIS Spatial Analyst 模块 (arcpy.sa) 以及 ArcGIS Network Analyst 模块 (arcpy.na)。
例如,arcpy.sa 模块中的工具将使用 Spatial Analyst 工具箱中的工具,但被配置为支持“地图代数”。因此,执行 arcpy.sa.Slope 与执行 Spatial Analyst 工具箱中的坡度工具的作用是相同的。