ArcGIS 10 中引入了 ArcPy,这是一个 Python 站点包,它涵盖并进一步加强了 ArcGIS 9.2 中所采用的 arcgisscripting 模块的功能。 ArcPy 提供了一种用于开发 Python 脚本的功能丰富的动态环境,同时提供每个函数、模块和类的代码实现和集成文档。
使用以 ArcPy 编写的 ArcGIS 应用程序和脚本的优势在于,可以访问并使用由来自多种不同领域的 GIS 专业人员和程序员开发的大量 Python 模块。 使用 Python 中的 ArcPy 的另一个主要原因是,Python 是一种通用的编程语言,易于学习和使用。 通过这一解释型、动态型编程语言,用户可以在交互式环境中快速地创建脚本原型并进行测试,同时这种编程语言功能强大,支持编写大型应用程序。
# Importing arcpy
import arcpy
# Set the workspace environment and run Clip_analysis
arcpy.env.workspace = 'C:/Data/Tongass'
arcpy.Clip_analysis('standb4', 'clipcov', 'standby_clip', 1.25)
在导入 ArcPy 之后,可以运行随 ArcGIS 安装的标准工具箱中的所有地理处理工具。
导入模块
模块为通常包含函数和类的 Python 文件。ArcPy 由一系列模块支持,包括数据访问模块 (arcpy.da)、制图模块 (arcpy.mapping)、ArcGIS Spatial Analyst extension 模块 (arcpy.sa) 以及 ArcGIS Network Analyst extension 模块 (arcpy.na)。
要导入整个模块,请使用 import 模块:
# Import only arcpy.mapping
import arcpy.mapping
当然,Python 还具有很多其他核心模块和第三方模块。 如果还想使用 Python 的 os 和 sys 模块,可以使用相似的导入方式:
# Import arcpy, os and sys
import arcpy
import os
import sys
在很多情况下,用户可能不想使用整个模块或无需使用整个模块。 如果只导入某一模块的一部分,可以使用 from-import 语句。 在下例中,将导入 env 类(env 类包含所有地理处理环境)。 现在无需以 arcpy.env 的形式访问环境,而可以将其简化为 env。
# Import env from arcpy and set the workspace environment
from arcpy import env
env.workspace = 'c:/data'
遵循相同的思路,有时您可能需要注意:如何对模块或模块的一部分进行标识以使脚本更具可读性,或者对于首选项来说默认名称是否过长。 在上述任一情况下,均可以使用 from-import-as 的形式。 与先前的示例相同,下面的示例中也将导入 env 类,但会为其指定名称 ENV:
# Import env from arcpy as ENV and set the workspace environment
from arcpy import env as ENV
ENV.workspace = 'c:/data'
可以使用相同方式导入制图模块:
# Import the mapping module from arcpy as MAP and create a MapDocument
# object
from arcpy import mapping as MAP
mxd = MAP.MapDocument('C:/maps/basemap.mxd')
其他版本的导入操作使用 from-import-* 的形式。 模块的内容将被直接导入到命名空间中,这表示您随后可以直接使用所有这些内容,而无需为其添加前缀。 例如:
# Import management from arcpy as *
from arcpy.management import *
但是,使用此方法存在一些风险。 具有相同名称的其他对象、变量、模块等将被覆盖,另外在使用大型模块时,命名空间可能会变得异常拥挤和杂乱。 可以此方式考虑该问题:在以下示例中,管理模块和分析模块都将作为 * 导入。 这两个模块都具有裁剪工具。 如果现在尝试使用裁剪工具,那么实际使用的会是哪种裁剪工具? 答案是后者,但是此方法可能导致在阅读脚本时出现不确定或难以阅读的情况。
# Import the management and analysis modules from arcpy as *
from arcpy.management import *
from arcpy.analysis import *
# Which Clip is it?
Clip('standb4', 'clipcov', 'standby_clip', 1.25)
但是在某些情况下,from-import-* 可以简化代码,例如,在使用 ArcGIS Spatial Analyst extension 的 sa 模块的情况下。 sa 模块的优势之一在于,可以在一行中嵌套多个类和函数以生成输出栅格对象。
# Import arcpy and the sa module as *
import arcpy
from arcpy.sa import *
arcpy.CheckOutExtension('spatial')
# Get input parameters
inRaster1 = arcpy.GetParameterAsText(0)
inRaster2 = arcpy.GetParameterAsText(1)
inRaster3 = arcpy.GetParameterAsText(2)
outRaster = (Raster(inRaster1) + (Raster(inRaster2) - Raster(inRaster3)))
现在比较下一个代码块,此代码块使用常规 import-from 语句。 现在假设再向代码中添加一些类和函数 - 即使只为每个函数和类添加 sa.,代码的体积也将迅速增加,这将破坏可读性并且使代码行变得更加庞大。
# Import arcpy and the sa module
import arcpy
from arcpy import sa
arcpy.CheckOutExtension('spatial')
# Get input parameters
inRaster1 = arcpy.GetParameterAsText(0)
inRaster2 = arcpy.GetParameterAsText(1)
inRaster3 = arcpy.GetParameterAsText(2)
outRaster = (sa.Raster(inRaster1) + (sa.Raster(inRaster2) - sa.Raster(inRaster3)))
路径和导入
使用导入语句时,Python 将在以下位置中(并按以下顺序)查找匹配该名称的模块:
- 在 PYTHONPATH 系统环境变量中指定的路径
- 一组标准 Python 文件夹(当前文件夹、c:\python27\lib、c:\python27\Lib\site-packages 等)
- 在 1 和 2 中找到的任意 .pth 文件中所指定的路径
有关此内容的详细信息,请参阅以下链接:https://docs.python.org/install/index.html#modifying-python-s-search-path。
如果尚未安装 Python 2.7,则安装 ArcGIS 10.8.2 产品时将安装此程序。 该安装程序还会将文件 Desktop10.8.pth (或者 Engine10.3.pth 或 Server10.3.pth)添加到 python27\Lib\site-packages 中。 此文件中有两行的内容为系统中 ArcGIS 安装的 arcpy 和 bin 文件夹路径。 在 Python 2.7 版本中,要成功导入 ArcPy 需要这两个路径。
使用导入语句时,Python 将参照系统的 PYTHONPATH 环境变量来查找模块文件。 此变量将设置为目录列表。