ArcPy 是一个 Python 站点包,可提供以实用高效的方式通过 Python 执行地理数据分析、数据转换、数据管理和地图自动化。
使用以 ArcPy 编写的 ArcGIS 应用程序和脚本的优势在于,可以访问并使用由来自多种不同领域的 GIS 专业人员和程序员开发的大量 Python 模块。使用 Python 中的 ArcPy 的另一个主要原因是,Python 是一种通用的编程语言,易于学习和使用。通过这一解释和动态型编程语言,用户可以在交互式环境中快速地创建脚本原型并进行测试,同时这种编程语言功能强大,可编写大型应用程序。
通过 ArcPy 可访问地理处理工具以及其他函数、类和模块,从而创建简单或复杂工作流。一般来说,ArcPy 按工具、函数、类和模块进行组织。
从技术角度讲,地理处理工具是可通过 arcpy 访问的函数 - 也就是说,可以像其他任何 Python 函数那样访问这些工具。但是,为了避免引起混淆,总是会在工具函数和非工具函数之间加以区分(如实用程序函数 ListFeatureClasses())。
- 工具的记录方式与函数不同。每个工具在帮助系统中都有自己的工具参考页面。函数会记录在 ArcPy 文档中。
- 工具会返回 Result 对象;而函数不会。
- 工具会生成各类消息,可通过多种不同的函数(例如,GetMessages())进行访问。而函数不会生成消息。
运行工具
以下示例显示了如何执行缓冲区工具。当在 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", "FLOAT")
arcpy.CalculateField_management("c:/data/Portland.gdb/streets", "LENGTH_MILES", "!shape.length@miles!", "PYTHON3")
arcpy.FeatureClassToFeatureClass_conversion("c:/data/Portland.gdb/streets", "Database Connections/MySDE.sde/PortlandDataset", "streets")
从工具获取结果
执行地理处理工具时,工具的结果会返回到 Result 对象中。通常,该对象包括由工具生成或更新的输出数据集的路径。在其他情况下,它可能会包含其他值,如数值或布尔值。
以下代码示例显示了如何捕获返回值以及这些值的具体内容:
返回输出要素类的路径。该结果可用作其他函数的输入。
result = arcpy.Buffer_analysis("rivers", "riverBuf", "50 METERS")
# prints C:\Portland\Portland_OR.gdb\riverBuf
print(result)
arcpy.Clip_analysis("streets", result, "streets_50m_of_rivers")
返回要素数目。
result = arcpy.GetCount_management("streets_50m_of_rivers")
# prints 54
print(result[0])
使用环境设置
可将地理处理环境设置视为影响工具执行结果的附加参数。这些参数与正常的工具参数不同,因为它们是通过工具单独进行设置的,并且供工具在运行时查询和使用。诸如感兴趣区域、输出数据集的坐标系以及新栅格数据集的像元大小等环境设置均可通过工具进行指定和支持。
可通过 env 类来获得属性形式的环境设置。这些属性可用于检索和设置当前环境值。下面是如何使用环境值的示例:
设置工作空间环境。
arcpy.env.workspace = "c:/data/Portland.gdb"
arcpy.Buffer_analysis("streets", "streetBuf", "500 METERS")
将空间格网索引设置为工具的返回值。
arcpy.env.spatialGrid1 = arcpy.CalculateDefaultSpatialGridIndex_management("streets")[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)
使用类
ArcPy 类,如 SpatialReference 和 Extent 类,通常用作地理处理工具参数设置的快捷方式,否则的话,这些参数会使用更加复杂的字符串。类的作用类似于建筑设计蓝图。蓝图为如何创建事物提供了一个框架。而类则可用来创建对象,即通常所称的实例。
import arcpy
spatial_ref = arcpy.SpatialReference("Hawaii Albers Equal Area Conic")
使用模块
ArcPy 包含涉及其他 ArcGIS 领域的模块。ArcPy 由一系列模块提供支持,其中包括以下模块:
- 数据访问模块 (arcpy.da)
- 制图模块 (arcpy.mp)
- 元数据模块 (arcpy.metadata)
- 共享模块 (arcpy.sharing)
- Image Analyst 模块 (arcpy.ia)
- Spatial Analyst 模块 (arcpy.sa)
- Network Analyst 模块(arcpy.nax 和 arcpy.na)
- Workflow Manager (Classic) 模块 (arcpy.wmx)
例如,arcpy.sa 和 arcpy.ia 模块中的工具将使用 Spatial Analyst 和 Image Analyst 工具箱中的工具,但被配置为支持“地图代数”。因此,执行 arcpy.sa.Slope 与执行 Spatial Analyst 工具箱中的坡度工具的作用是相同的。