ArcPy 是一个 Python 站点包,可提供以实用高效的方式通过 Python 执行地理数据分析、数据转换、数据管理和地图自动化。
当您使用 ArcGIS 应用程序和通过 ArcPy 编写的脚本时,可以访问和使用由来自多个不同领域的 GIS 专业人员和程序员开发的大量 Python 模块。 在 Python 中使用 ArcPy 的优点是,Python 是一种易于学习和使用的通用编程语言。 通过这一解释型、动态型编程语言,您可以在交互式环境中快速地创建脚本原型并进行测试,同时这种编程语言功能强大,支持编写大型应用程序。
通过 ArcPy 可访问地理处理工具以及其他函数、类和模块,从而创建简单或复杂工作流。 ArcPy 由工具、函数、类和模块组成。
地理处理工具是 arcpy 中提供的函数,也就是说,它们的访问方式与任何其他 Python 函数相同。 但是,为了避免引起混淆,总是会在工具函数和非工具函数之间加以区分(例如,实用程序函数 ListFeatureClasses())。
- 工具的记录方式与函数不同。 每个工具在帮助系统中都有一个参考页面。 函数会记录在 ArcPy 文档中。
- 工具会返回 Result 对象;而函数不会。
- 工具会生成各类消息,可通过多种不同的函数(例如,GetMessages())进行访问。 而函数不会生成消息。
工具使用
下面的示例显示如何运行缓冲区工具。 当在 Python 窗口中运行时,代码将和结果一同传输到该窗口的脚本部分。
arcpy.analysis.Buffer("c:/data/Portland.gdb/streets", "c:/data/Portland.gdb/steets_buffer", "500 METERS")
下面是运行工具的另一个示例。 它使用数据管理和转换工具箱中的工具。 将字段添加到输入街道要素类中,计算该字段,并将要素类加载到企业级地理数据库中。
import arcpy
arcpy.management.AddField("c:/data/Portland.gdb/streets", "LENGTH_MILES", "FLOAT")
arcpy.management.CalculateField("c:/data/Portland.gdb/streets", "LENGTH_MILES", "!shape.length@miles!", "PYTHON3")
arcpy.conversion.FeatureClassToFeatureClass("c:/data/Portland.gdb/streets", "Database Connections/MySDE.sde/PortlandDataset", "streets")
工具结果
运行地理处理工具时,工具的结果会返回到 Result 对象中。 通常,该对象包括由工具生成或更新的输出数据集的路径。 在其他情况下,其中可能包含其他值,如数字或布尔值。
下面的代码示例显示如何捕获返回值以及它们的值可能是什么:
返回输出要素类的路径。 结果可以用作另一个函数的输入。
result = arcpy.analysis.Buffer("rivers", "riverBuf", "50 METERS")
# Prints C:\Portland\Portland_OR.gdb\riverBuf
print(result)
arcpy.analysis.Clip("streets", result, "streets_50m_of_rivers")
返回要素的数量。
result = arcpy.management.GetCount("streets_50m_of_rivers")
# Prints 54
print(result[0])
环境设置
可将地理处理环境设置视为影响工具执行结果的附加参数。 这些参数与常规工具参数不同,因为它们独立于工具,并且供工具在运行时查询和使用。 诸如感兴趣区域、输出数据集的坐标系以及新栅格数据集的像元大小等环境设置均可通过工具进行指定和支持。
可通过 env 类来获得属性形式的环境设置。 这些属性可用于检索和设置当前环境值。 以下是如何使用环境值的示例:
设置工作空间环境。
arcpy.env.workspace = "c:/data/Portland.gdb"
arcpy.analysis.Buffer("streets", "streetBuf", "500 METERS")
获取当前栅格像元大小设置,并确保它是标准输出的特定大小。
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.charts)
- 数据访问 (arcpy.da)
- 地理编码 (arcpy.geocoding)
- 影像分析 (arcpy.ia)
- 制图 (arcpy.mp)
- 元数据 (arcpy.metadata)
- Network Analyst(arcpy.nax 和 arcpy.na)
- 共享 (arcpy.sharing)
- Spatial Analyst (arcpy.sa)
- 公共设施网络 (arcpy.un)
例如,arcpy.sa 和 arcpy.ia 模块中的工具将使用 Spatial Analyst 和 Image Analyst 工具箱中的工具,但被配置为支持“地图代数”。 例如,运行 arcpy.sa.Slope 与运行 Spatial Analyst 工具箱中的坡度工具相同。