第1章 ArcPy简介
1.1什么是ArcPy?
ArcPy 是一个以成功的 arcgisscripting 模块为基础并继承了arcgisscripting 功能进而构建而成的站点包。目的是为以实用高效的方式通过Python 执行地理数据分析、数据转换、数据管理和地图自动化创建基础。
该包提供了丰富纯正的 Python 体验,具有代码自动完成功能(输入关键字和点即可获得该关键字所支持的属性和方法的弹出列表;从中选择一个属性或方法即可将其插入),并针对每个函数、模块和类提供了参考文档。
在 Python 中使用 ArcPy的另一个主要原因是,Python是一种通用的编程语言。Python是一种支持动态输入的解释型语言,适用于交互式操作以及为称为脚本的一次性程序快速制作原型,同时其具有编写大型应用程序的强大功能。用ArcPy 编写的ArcGIS 应用程序的优势在于,可以使用由来自多个不同领域的GIS 专业人员和程序员组成的众多Python 小群体开发的附加模块。
1.2 ArcPy 快速浏览
利用 ArcPy 可访问地理处理工具和其他函数、类和模块,使用它们可快速轻松地创建简单或复杂工作流。使用以ArcPy 编写的ArcGIS 应用程序和脚本的优势在于,可以访问并使用由来自多个不同领域的GIS 专业人员和程序员开发的大量Python 模块。
一般来说,ArcPy按工具、环境、函数、类和模块进行组织。
1、运行工具
以下示例显示了如何执行缓冲区工具。执行该工具时,消息将默认显示在帮助部分中Python 窗口的右侧。
例1.1执行缓冲区工具
>>> arcpy.Buffer_analysis("c:/data/Portland.gdb/streets","c:/data/Portland.gdb/steets_buffer", "500 METERS")
以下是另一个运行工具的示例。该示例使用的是数据管理工具箱和转换工具箱中的工具。向输入streets 要素类添加一个字段并计算该字段,然后将要素类加载到ArcSDE 企业级地理数据库中。
例1.2 执行多个工具
>>> 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 对象中。通常,该对象是由工具生成或更新的输出数据集的路径。在其他情况下,它可能会包含其他类型的值,如数值或布尔值。如果工具的输出是多值参数,则这些值可在列表中以列表的形式返回。
以下代码示例显示了如何捕获返回值以及这些值的具体内容:
返回输出要素类的路径,该结果可用作其他函数的输入;返回要素数目。
例1.3 从工具获取结果
>>> 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
2、使用环境设置
可将地理处理环境设置视为影响工具执行结果的附加参数。这些参数与正常的工具参数不同,因为它们是通过工具单独进行设置的,并且供工具在运行时查询和使用。诸如感兴趣区域、输出数据集的坐标系以及新栅格数据集的像元大小等环境设置均可通过工具进行指定和支持。
可通过 env 类来获得属性形式的环境设置。这些属性可用于检索和设置当前环境值。下面是如何使用环境值的示例:
例1.4设置工作空间环境
>>> 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
3、使用函数
函数是用于执行某项特定任务并能够纳入更大的程序的已定义功能。除工具之外,ArcPy还提供了多种函数,用来更好地支持地理处理工作流。函数可用于列出某些数据集、检索数据集的属性、检查数据是否存在、在将表添加到地理数据库之前验证表名称,或执行其他许多有用的脚本任务。
以下示例代码显示的是获得数据的属性:
例1.5使用函数
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
4、使用类
ArcPy 类,如SpatialReference 和Extent 类,通常用作地理处理工具参数设置的快捷方式,否则的话,这些参数会使用更加复杂的字符串。类的作用类似于建筑设计蓝图。蓝图为如何创建事物提供了一个框架,而类则可用来创建对象,即通常所称的实例。
例1.6使用类
import arcpy
spatial_ref = arcpy.SpatialReference("Hawaii Albers Equal Area Conic")
5、使用模块
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工具箱中的坡度工具的作用是相同的。
第2章 使用ArcPy准备工作
2.1 导入ArcPy
在导入 ArcPy 之后,可以运行随 ArcGIS安装的标准工具箱中的所有地理处理工具。
例2.1导入ArcPy
# Importing arcpy
import arcpy
模块为通常包含函数和类的 Python 文件。有一系列模块支持 ArcPy,包括制图模块(arcpy.mapping)、Spatial Analyst 模块 (arcpy.sa)和Geostatistical Analyst模块 (arcpy.ga)。
要导入整个模块,请使用导入模块:
例2.2 导入模块
# Import only arcpy.mapping
import arcpy.mapping
在很多情况下,用户可能不想使用整个模块或无需使用整个模块。如果只导入某一模块的一部分,可以使用from-import 语句。在下例中,将导入env 类(env类包含所有地理处理环境)。现在无需以 arcpy.env的形式访问环境,而可以将其简化为 env。
例2.3 导入部分模块
# Import env from arcpy and set the workspace environment
from arcpy import env
env.workspace = "c:/data"
遵循相同的思路,有时用户可能需要注意:如何对模块或模块的一部分进行标识以使脚本更具可读性,以及对于首选项来说默认名称可能过长。在上述任一情况下,均可以使用from-import-as 的形式。与先前的示例相同,下面的示例中也将导入env 类,但会指定ENV 作为env 类的名称:
例2.4 使用别名
# Import env from arcpy as ENV and set the workspace environment
from arcpy import envas ENV
ENV.workspace = "c:/data"
模块的内容将被直接导入到命名空间中,这表示用户随后可以直接使用所有这些内容,而无需为它们添加前缀。使用此方法存在一些风险。具有相同名称的其他对象、变量、模块等将被覆盖,另外在使用大型模块时,命名空间可能会变得异常拥挤和杂乱。此方法可能导致在阅读脚本时出现不确定或难以阅读的情况。
但是在某些情况下,from-import-*可以简化代码,例如,在使用 ArcGIS Spatial Analyst扩展模块的 sa模块的情况下。sa模块的优势之一在于,可以在一行中嵌套多个类和函数以生成输出栅格对象。
例2.5 直接导入
# 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)))
2.2 地理处理环境设置(env)
每个工具都含有一组用于执行操作的参数。其中一些参数在所有工具中通用,如容差或输出位置。这些参数可从所有工具在运行期间使用的地理处理环境中获得默认值。执行某一工具时,当前环境设置也可用作全局输入参数值。诸如感兴趣区域、输出数据集的空间参考以及新栅格数据集的栅格像元大小等设置都可以使用地理处理环境指定。
1、获取和设置环境设置
环境设置以env 类的属性的方式公开。这些属性可用于检索或设置当前值。每个环境设置都有一个名称和一个标注。标注显示在ArcGIS 中的环境设置对话框上。名称用在脚本或ArcGIS 应用程序的命令行中。下面是如何使用环境值的示例:
环境可作为环境类中的读/写属性进行访问,方法为arcpy.env.<环境名称>。还可以利用Python 的from-import 语句简化代码,而不必为每个环境名称都添加arcpy.env 前缀。
例2.6设置环境值
import arcpy
from arcpy import env
# Set the workspace environment setting#
env.workspace = "c:/St_Johns/data.gdb"
# Set the XYTolerance environment setting#
env.XYTolerance = 2.5
# Calculate the default spatial grid index, divide in half, then
# set the spatial grid 1 environment setting#
result = arcpy.CalculateDefaultGridIndex_management("roads")
env.spatialGrid1 = float(result.getOutput(0)) / 2
# Clip the roads by the urban area feature class#
arcpy.Clip_analysis("roads","urban_area","urban_roads")
例2.7获取和设置环境值
import arcpy
from arcpy import env
# Check the current raster cell size and make sure it is a certain size
# for standard output#
env.workspace = "c:/avalon/data"
if env.cellSize < 10:
env.cellSize = 10
elif env.cellSize > 20:
env.cellSize = 20
arcpy.HillShade_3d("island_dem","island_shade", 300)
设置环境值时要注意拼写和大小写。将值指定给arcpy.env.Workspace 与设置arcpy.env.workspace(注:arcpy.env.workspace是正确的格式)是不同的。
2、使用环境设置处理临时数据
临时地理数据库和临时文件夹是提供保证存在的地理数据库和文件夹位置的只读环境。这意味着,您可以随时可靠地使用地理数据库或文件夹,而不必创建或管理一个。
例2.8处理临时数据
import arcpy
inputFC = arcpy.GetParameterAsText(0)
clipFC = arcpy.GetParameterAsText(1)
outputFC = arcpy.GetParameterAsText(2)
# Use scratchGDB environment to write intermediate data#
tempData = arcpy.CreateScratchName(workspace=arcpy.env.scratchGDB)
bufferResult = arcpy.Buffer_analysis(inputFC, tempData,"50 METERS")
arcpy.Clip_analysis(clipFC, bufferResult, outputFC)
3、重新设置环境
由于地理处理环境对工具操作和输出有着很大的影响,因此需要保证能够追踪环境设置并在必要时将其重置为默认状态。
可使用ResetEnvironments 函数恢复默认环境值,或者可以使用ClearEnvironment 函数重置特定环境。
例2.9重新设置环境
# Reset geoprocessing environment settings
arcpy.ResetEnvironments()
# Reset a specific environment setting
arcpy.ClearEnvironment("workspace")
4、env常用设置
环境设置以 ArcPy env 类的属性的方式公开。这些属性可用于检索或设置当前值。可将地理处理环境设置视为影响工具执行结果的附加参数。
表2-1 env常用属性
属性 |
说明 |
数据类型 |
cellSize (读写) |
支持“像元大小”环境设置的工具可以设置在操作时使用的输出栅格像元大小或分辨率。默认输出分辨率由最粗糙的输入栅格数据集决定。 |
String |
extent (读写) |
支持“输出范围”环境的工具只会处理落入此设置中所指定范围内的要素或栅格。 |
String |
mask (读写) |
支持“掩膜”环境的工具只会考虑运行过程中落入分析掩膜范围内的像元。 |
String |
nodata (读写) |
支持 NoData 环境设置的工具将仅处理其中 NoData有效的栅格 |
String |
spatialGrid1 spatialGrid2 spatialGrid3 (读写) |
遵循“输出空间格网1、2和 3”环境的工具将创建具有指定空间索引格网的要素类(如果要素类支持空间索引格网)。 |
Double |
tileSize (读写) |
支持“分块大小”环境的工具用于为存储在数据块中的栅格设置分块大小。 |
String |
workspace (读写) |
支持“当前工作空间”环境设置的工具将指定的工作空间用作地理处理工具输入和输出的默认位置。 |
String |
XYDomain (读写) |
支持“输出XY 属性域”环境的工具可为输出地理数据集的x,y 属性域设置特定范围。 |
String |
XYResolution (读写) |
支持此环境的工具可将 x,y 分辨率应用到输出地理数据集中。 |
String |
XYTolerance (读写) |
支持此环境的工具会覆盖在地理数据库内创建的地理数据集上的默认x,y 容差。 |
String |
2.3 访问许可和扩展模块
每当在脚本中执行工具时,都会需要 ArcGIS 许可。此外,运行 ArcGIS扩展模块中的工具,如 ArcGIS Spatial Analyst扩展模块,也需要针对该模块的许可。如果无法获得必要的许可,工具将运行失败并返回错误消息。例如,如果您安装有ArcGIS for Desktop Basic 的许可,并试图运行需要 Standard或 Advanced的许可,则工具将运行失败。
使用 ArcGIS for Desktop Basic 或 Standard许可时,脚本应将产品设置为 Basic或 Standard。同样,使用Engine 或EngineGeoDB 许可时,脚本应将产品设置为Engine 或EngineGeoDB。如果未明确设置许可,将根据首次访问ArcPy 工具、函数或类时的最高可用许可等级初始化许可。
每种工具都将执行检查以确保具有相应的许可。如果不具有所需的许可,工具将运行失败。为避免脚本在执行到一半时失败,可以在脚本开头执行检查,以尽早发现失败。
注意:只有在独立脚本中才必须设置产品和扩展模块。如果从Python 窗口运行工具或者使用脚本工具,产品已在应用程序内进行设置,激活的扩展模块取决于“扩展模块”对话框。
1、Desktop、Engine/Server许可
产品模块会在导入 arcpy 前导入,以定义脚本使用的 Desktop许可。CheckProduct 函数可用于检查Desktop 许可的可用性,而ProductInfo 函数能报告当前的产品许可。
例2.10检查ArcGIS for Desktop Advanced许可。
import sys
import arcpy
arcpy.env.workspace ="c:/data/world.gdb"
if arcpy.CheckProduct("ArcInfo") =="Available":
arcpy.PolygonToLine_management("Lakes","LakeLines")
else:
msg = 'ArcGIS for Desktop Advanced license not available'
print(msg)
sys.exit(msg)
2、扩展模块许可
可以从许可管理器中获取扩展模块许可,并在不再需要时将其归还。CheckExtension 函数用于查看是否存在可为特定类型的扩展模块检出的许可,而CheckOutExtension 会真正获取许可。脚本获取到扩展模块许可后,即可执行扩展模块工具。脚本使用完特定扩展模块中的工具后,应使用CheckInExtension 函数将许可归还给许可管理器,以便其他应用程序使用。当脚本完成时,所有检出的扩展模块许可和设置的产品许可都将归还给许可管理器。
下面的示例将执行一些 ArcGIS 3D Analyst 工具,并将 Desktop产品许可设置为 ArcGIS for Desktop Basic,因为执行扩展模块中的工具时不需要ArcGIS for Desktop Advanced 的许可。如果未明确设置 ArcGIS for Desktop Basic的许可,并且无可用的 ArcGIS for Desktop Advanced许可,则脚本将失败,因为运行扩展模块工具需要 Desktop许可。
例2.11检查ArcGIS 3D Analyst扩展模块许可
class LicenseError(Exception):
pass
# Set desktop license used to ArcGIS for Desktop Basic#
import arcview
import arcpy
from arcpy import env
try:
if arcpy.CheckExtension("3D") =="Available":
arcpy.CheckOutExtension("3D")
else:
# Raise a custom exception #
raise LicenseError
env.workspace = "D:/GrosMorne"
arcpy.HillShade_3d("Western*","west*_hill", 300)
arcpy.Aspect_3d("Western*","west*_aspect")
except LicenseError:
print "3D Analyst license is unavailable"
except:
print arcpy.GetMessages(2)
finally:
# Check in the ArcGIS 3D Analyst扩展模块 #
arcpy.CheckInExtension("3D")
第3章Python调用地理处理工具
3.1 地理处理工具
1、地理处理
地理处理适合于各类使用 ArcGIS 的用户。无论是初学者还是高级用户,地理处理都可能是日常使用 ArcGIS的重要组成部分。地理处理的基本目的是提供用于执行分析和管理地理数据的工具和框架。地理处理所提供的建模和分析功能使得ArcGIS 成为一个完整的地理信息系统。
地理处理提供了大量成套工具,用于执行从简单的缓冲区和面叠加到复杂的回归分析和影像分类等各项GIS 任务。执行自动操作的任务可以是普通任务- 例如,将大量数据从一种格式转换为另一种格式。也可以是很有创造性的任务,这些任务使用一序列操作对复杂的空间关系进行建模和分析- 例如,通过交通网络计算最佳路径、预测火势路径、分析和寻找犯罪地点的模式、预测哪些地区容易发生山体滑坡或预测暴雨事件造成的洪水影响。
2、常用地理处理工具
可将地理处理视为一种语言,其中名词是地理数据(例如要素、表和栅格),而工具是动词(例如复制、裁剪和连接)。与任何语言一样,需要知道一些名词和动词才能进行交流,而本部分(及后续内容)向您介绍这些常见的地理处理动词(工具)。如果您不熟悉要素类和栅格等名词,则地理信息元素概述可作为一份很好的入门材料。
最常用的 GIS 工具可自动执行一些以往手动完成的任务,例如,通过在一张地图上方叠加另一张地图来编译新地图,或者以物理方式将地图剪切成表示特定研究区域的各个部分,然后更改其投影。在此类手动执行的任务中,有些任务操作起来非常困难和复杂,以至于它们阻碍了地理知识和数据的宣传普及,而它们也是发明GIS 的主要动力。
· 叠加分析和邻域分析
这两个常用的工具集可以回答两个最基本的地理问题:什么在什么之上?以及什么在什么附近?
· 表面分析
地理现象不仅仅局限于离散的点、线和面,还包括在地球表面(或正在研究的任何星球或物体)上连续变化的数据,例如,高程、坡度、降雨量和温度等。这种连续数据称为表面并用栅格和TIN 进行建模。
· 空间统计数据和非空间统计数据
地理学中有这样一条公理:事物的距离越近,其相似程度越高。该公理不仅为用来发现和表征地理模式且功能强大的空间统计工具奠定了基础,而且还为标准的非空间统计工具(如最小值、最大值、总和、频率、均值和标准差)奠定了基础。
· 表管理
ArcGIS 将数据存储在易于访问的表中,并且大部分工作流都包括某种表管理操作,例如,添加或删除字段、创建表间关系或根据包含坐标的列创建要素。
· 选择和提取
GIS 数据集包含的数据通常远超出需求,而一组常见的任务可用于从较大且较复杂的数据集中减去数据或提取数据。
3、工具和工具箱
地理处理工具用于对地理数据执行一些非常小但非常重要的操作,例如提取和叠加数据、更改地图投影、向表中添加列、计算属性值、面叠加和最优路径等等。您不仅用于数百种工具可供选用,还可通过模型构建器(可视化编程语言)或脚本(文本编程语言)创建您自己的工具。
工具都储存在工具箱中。ArcGIS提供了数百种工具,并将它们进行了分类并放到了十余个工具箱中,这些工具功能丰富、涉及领域广泛。
图3-1 ArcGIS提供的工具箱
3.2 地理处理工具运行方法
可以使用多种方法来执行工具。最常见的方法是打开工具对话框,填入工具参数,然后单击确定执行工具。对于系统工具,工具执行操作在后台进行,这意味着在工具执行的同时也可继续在ArcMap 中工作。工具执行完成时,将收到一条通知消息,可以在结果 窗口中查看有关工具执行情况的信息。通常,工具创建的输出会自动添加到ArcMap 内容列表。
要执行工具,首先必须找到该工具,方法是在搜索 窗口中搜索该工具或在目录 窗口中浏览到该工具。
1、使用工具对话框执行工具
要从搜索 窗口中打开工具对话框,请单击该工具名称。
图3-2搜索工具
要从目录 窗口或 ArcToolbox 窗口中打开工具对话框,请双击该工具,或右键单击并选择打开。
图3-3打开工具
工具对话框打开后,填入工具的参数。各工具自己都有唯一一组参数。有些参数为必需参数,只有填入这些参数(即,它们必须具有值)后工具才可执行。其他参数为可选参数,也就是说,可以将这些参数留空或接受其默认值。工具具有输入和输出参数。输入参数通常是现有数据集或选项,它们控制着工具的功能。输出参数通常是工具创建的新数据集。对于输出数据集参数,在您输入一个或多个输入参数后,将自动创建输出数据集名称和位置。
2、使用模型构建器执行工具
模型构建器是一款功能强大的应用程序,通过它可将一系列工具串联在一起,一个工具的输出用作另一个工具的输入,如下所示。
图3-4模型构建器
在模型构建器中,添加工具,打开其对话框,填入参数,然后单击确定按钮。如果单击确定后,工具并未执行,那么必须运行模型,该工具才能执行。这样可将多个工具串联在一起,可以一次性执行所有相关工具。
模型是自动处理工作的方式。创建模型时,保留可以使用不同输入数据多次执行的数据处理工作流。使用模型可自动处理无数的任务。
3、通过Python 窗口执行工具
还可使用基于文本的编程语言(如 Python)来执行工具。由于 Python是基于文本的编程语言(而不是像模型构建器那样的可视化编程语言),因此要依次输入工具名称及其参数。在下图所示的Python 窗口中,您可以输入Python 代码并立即执行该代码。
图3-6 Python窗口
虽然与使用工具对话框相比,该工作显得有些多余(谁也不愿意输入成批的代码),但使用Python 和Python 窗口具有很多优势:
· 可以使用逻辑语句(如if-then-else)进行条件执行或使用for 循环遍历数据集,也可访问Python 数据结构(如字典和列表)。
· 可以访问标准Python 模块中的功能来对字符串、数学或文件和文件夹进行操作。下图中,glob模块被用于浏览系统文件夹中的所有文件。
· Python具有丰富的可用于操纵和变换数据的第三方模块。
· 加载ArcPy 站点包(在下图中通过import 语句进行加载)时,可以访问所有地理处理工具以及许多用于逐行读取要素、描述数据或与ArcMap 交互的其他函数。例如,在下图中,使用ArcPy mapping模块向当前地图中添加图层。
图3-7代码示例
4、通过Python 脚本执行工具
可在 Python 窗口中输入代码并立即将其进行执行。但您也可使用文本编辑器或集成开发环境 (IDE)(例如PythonWin)在磁盘中创建Python 文件(带有.py 扩展名的文件)。这些文件(称为脚本)是可从操作系统提示符或通过创建执行脚本的脚本工具执行的程序。脚本工具与所有其他地理处理工具一样,可以在模型、Python窗口或 Python脚本中,通过其对话框来执行脚本工具。
3.3 通过 Python 使用工具
1、工具参数与调用
每个地理处理工具都具有一组固定的参数,这些参数为工具提供执行所需的信息。工具通常包含多个输入参数以定义一个或多个数据集,这些数据集一般用于生成新的输出数据。参数具有几个重要属性:
· 每个参数具有一种或多种特定的数据类型,如要素类、整型、字符串或栅格。
· 参数为输入值或输出值。
· 参数需有值,或为可选。
· 各个工具参数都具有唯一的名称。
在 Python 中使用工具时,必须正确设置工具的参数值,以便在脚本运行时工具可以执行。一旦提供了一组有效的参数值,工具即准备好执行。参数将被指定为字符串或对象。
字符串是唯一标识参数值的简单文本,如数据集的路径或关键字。在下面的代码示例中,为缓冲区工具定义了输入和输出参数。请注意,工具名称要追加其工具箱的别名。在该示例中,两个字符串变量用于定义输入和输出参数,以便对工具的调用更容易阅读。
例3-1使用字符串作为参数
import arcpy
roads = "c:/base/data.gdb/roads"
output = "c:/base/data.gdb/roads_Buffer"
# Run Buffer using the variables set above and pass the remaining
# parameters in as strings
arcpy.Buffer_analysis(roads, output,"distance", "FULL","ROUND", "NONE")
对于部分参数(如空间参考),还可以指定对象。在下面的代码示例中,使用其可选“坐标系”参数的SpatialReference 对象执行 创建要素类工具。
例3-2 使用对象作为参数
import arcpy
in_workspace = "c:/temp"
output_name = "rivers.shp"
# Create a spatial reference object
spatial_ref = arcpy.SpatialReference('North America Equidistant Conic')
# Run CreateFeatureclass using the spatial reference object
arcpy.CreateFeatureclass_management(
in_workspace, output_name, spatial_reference=spatial_ref)
大部分地理处理工具同时包含必选参数和可选参数。通常,在许多情况下都存在多个不需要进行指定的可选参数。有两种方法可以处理这些未使用的参数。一个方法是保持所有可选参数有序,然后将您不需要的参数引用为空字符串""、井号"#" 或类型为None 的参数。另一种方法是使用关键字参数,并使用参数名称来分配值。使用关键字参数可以跳过未使用的可选参数或以不同的顺序指定它们。
例3-3 使用空字符串跳过可选参数
import arcpy
arcpy.AddField_management("schools","school_id", "LONG","", "", "", "", "NON_NULLABLE")
例3-4 使用关键字参数跳过可选参数
import arcpy
arcpy.AddField_management("schools","school_id", "LONG", field_is_nullable="NON_NULLABLE")
2、工具输出
当作为Result 对象执行时,ArcPy会返回工具的输出值。结果对象的优点是可以保留工具执行的相关信息,包括消息、参数和输出。即使在运行了多个其他工具后仍可保留这些结果。
下面的示例说明了如何在执行地理处理工具后获取结果对象的输出。
例3-5 获取结果对象的输出
import arcpy
arcpy.env.workspace ="c:/city/data.gdb"
# Geoprocessing tools return a result object of the derived
# output dataset.
result = arcpy.CopyFeatures_management("roads","urban_roads")
# A print statement will display the string
# representation of the output.
print result
# A result object can be indexed to get the output value.
# Note: a result object also has a getOutput() method that
# can be used for the same purpose.
result_value = result[0]
如果为结果对象建立索引或使用其 getOutput() 方法,那么返回值为 Unicode字符串。当使用派生输出参数运行诸如获取计数(提供表中的记录数)或计算默认拓扑容差(提供拓扑容差值)之类的工具时,需要重点考虑这一点。要将Unicode 字符串转换为所需类型,可使用int() 或float() 等内置Python 函数。
注:派生参数不需要用户的交互,并且不会在工具对话框上或作为Python 中的工具的参数出现。输出参数通常是“派生”类型。
例3-6 派生输出参数
import arcpy
import types
arcpy.env.workspace ="c:/base/data.gdb"
# Many geoprocessing tools return a result object of the derived
# output dataset.
result = arcpy.GetCount_management("roads")
result_value = result[0]
# The result object's getOutput method returns values as a
# unicode string. To convert to a different Python type, use
# built-in Python functions: str(), int(), long(), float()
count = int(result_value)
print count
print types.TypeType(count)
如果创建的输出仅为大型工作流的一个中间阶段,那么输出参数可以省略,以便工具为输出创建唯一路径和名称。可以通过将输出设置为“#”或“None”来完成此操作,或如果输出是所使用的最后一个参数,则可以完全跳过此操作。在每种情况中,返回值都是新数据源的完整路径。
例3-7 输出参数的省略
import arcpy
arcpy.env.workspace ="c:/city/data.gdb"
result = arcpy.CopyFeatures_management("roads","#")
result = arcpy.CopyFeatures_management("roads","")
result = arcpy.CopyFeatures_management("roads")
3、ArcPy中的工具组织
地理处理工具以两种不同的方法进行组织。所有工具均以ArcPy 函数的形式提供,但也可以通过匹配工具箱别名的模块调用。尽管帮助中的大多数示例都以ArcPy 函数的形式显示工具,但两种方法同样有效。使用哪一种方法具体取决于个人喜好和编码习惯。在下面的示例中,使用两种方法显示获取计数工具。
例3-8 工具调用方式
import arcpy
in_features = "c:/temp/rivers.shp"
# Tools can be accessed as functions on the arcpy module
arcpy.GetCount_management(in_features)
# Or from modules matching the toolbox name
arcpy.management.GetCount(in_features)
通过模块使用工具时,有时可能要注意标识模块的方式,以便脚本具有更好的可读性。在这种情况下,可以使用格式from - import - as。
例3-9 标识模块的方式
# Clean up street centerlines that were digitized without
# having set proper snapping environments
import arcpy
from arcpy import editas EDIT
from arcpy import managementas DM
streets = "c:/data/streets.gdb/majorrds"
streets_copy = "c:/output/Output.gdb/streetsBackup"
DM.CopyFeatures(streets, streets_copy)
EDIT.TrimLine(streets,"10 Feet", "KEEP_SHORT")
EDIT.ExtendLine(streets,"15 Feet", "EXTENSION")
3.4 示例:如何按照字段列表创建FeatureClass ?
1、创建Workspace
“工作空间”工具集包含一系列可创建 ArcGIS 所使用的数据存储结构的工具。这些结构包括工作空间、文件、两种类型的地理数据库、要素数据集和一个ArcSDE 连接文件。
Shapefiles是文件类型的空间数据存储格式,从而在“工作空间”工具集中选用“CreateFolder”工具来完成这一目标。
CreateFolder_management (out_folder_path, out_name)
n out_folder_path:要创建文件夹的磁盘位置。数据类型为Folder
n out_name: 要创建的文件夹。数据类型为String
例3-10 CreateFolder
# Import system modules
import arcpy
from arcpy import env
# Set workspace
env.workspace = "C:/data"
# Set local variables
out_folder_path = "C:/output"
out_name = "folder1"
# Execute CreateFolder
arcpy.CreateFolder_management(out_folder_path, out_name)
如果想创建文件地理数据库,则需调用“CreateFileGDB”工具。
CreateFileGDB_management (out_folder_path, out_name, {out_version})
n out_folder_path:将创建文件地理数据库的位置(文件夹)。数据类型为Folder
n out_name:要创建的文件地理数据库的名称。数据类型为String
例3-11 CreateFileGDB
# Import system modules
import arcpy
# Set local variables
out_folder_path = "C:/output"
out_name = "fGDB.gdb"
# Execute CreateFileGDB
arcpy.CreateFileGDB_management(out_folder_path, out_name)
2、创建FeatureClass
“要素类”工具集提供了一组专用于执行基本要素类管理(包括创建、追加、整合和更新多个要素类)的工具。
要素类是具有相同几何类型的要素的集合:点、线、多边形或注记。 要素类可与其他要素类一起存储在地理数据库中的要素数据集内,也可作为独立要素类存储在地理数据库中。此外,要素类还可存储在shapefile 中,或者与具有不同几何的其他要素类一起存储在coverage 中。
要想在 ArcSDE 地理数据库、文件地理数据库或个人地理数据库中创建空要素类;在文件夹中此工具将创建shapefile。要使用“CreateFeatureclass”工具。
CreateFeatureclass_management (out_path, out_name, {geometry_type}, {template}, {has_m},{has_z}, {spatial_reference}, {config_keyword}, {spatial_grid_1}, {spatial_grid_2},{spatial_grid_3})
n out_path:创建输出要素类所在的ArcSDE 地理数据库、文件地理数据库、个人地理数据库或文件夹。此工作空间必须已经存在。数据类型为:Workspace;Feature Dataset
n out_name:要创建的要素类的名称。数据类型为String
n geometry_type:要素类的几何类型,可设置为“POINT”、“MULTIPOINT”、“POLYGON”、 “POLYLINE”。数据类型为String
例3-12 CreateFeatureclass
# Name: CreateFeatureclass_Example2.py
# Description: Create a feature class to store the gnatcatcher habitat zones
# Import system modules
import arcpy
from arcpy import env
# Set workspace
env.workspace = "C:/data"
# Set local variables
out_path = "C:/output"
out_name = "habitatareas.shp"
geometry_type = "POLYGON"
template = "study_quads.shp"
has_m = "DISABLED"
has_z = "DISABLED"
# Use Describe to get a SpatialReference object
spatial_reference = arcpy.Describe("C:/workspace/studyarea.shp").spatialReference
# Execute CreateFeatureclass
arcpy.CreateFeatureclass_management(out_path, out_name, geometry_type, template, has_m, has_z, spatial_reference)
3、添加Field
“字段”工具集包含一组用于向要素类表添加字段或对该表中的字段进行更改的工具。字段是表中的列;每个字段包含一个属性的多个值。表中可包含任意数量的字段。可指定字段设置,如字段类型和可存储在字段中的最大数据量。
添加字段是指向表或要素类表、要素图层、栅格目录和/或带属性表的栅格添加新字段。“AddField”工具。
AddField_management (in_table, field_name, field_type, {field_precision}, {field_scale},{field_length}, {field_alias}, {field_is_nullable}, {field_is_required}, {field_domain})
n in_table:要添加指定字段的输入表。该字段将被添加到现有输入表,并且不会创建新的输出表。可将字段添加到ArcSDE 的要素类、文件或个人地理数据库的要素类、coverage、shapefile、栅格目录、独立表、带属性表的栅格和/或图层。
n field_name:要添加到输入表的字段的名称。
n field_type:在创建新字段时所使用的字段类型。
Ø TEXT —名称或其他文本特性。
Ø FLOAT —特定范围内含小数值的数值。
Ø DOUBLE —特定范围内含小数值的数值。
Ø SHORT —特定范围内不含小数值的数值;编码值。
Ø LONG —特定范围内不含小数值的数值。
Ø DATE —日期和/或时间。
Ø BLOB —影像或其他多媒体。
Ø RASTER —栅格影像。
Ø GUID —GUID值
例3-12 AddField
# Name: AddField_Example2.py
# Description: Add a pair of new fields to a table
# Import system modules
import arcpy
from arcpy import env
# Set environment settings
env.workspace = "C:/data/airport.gdb"
# Set local variables
inFeatures = "schools"
fieldName1 = "ref_ID"
fieldPrecision = 9
fieldAlias = "refcode"
fieldName2 = "status"
fieldLength = 10
# Execute AddField twice for two new fields
arcpy.AddField_management(inFeatures, fieldName1,"LONG", fieldPrecision, "", "",
fieldAlias, "NULLABLE")
arcpy.AddField_management(inFeatures, fieldName2,"TEXT", "","", fieldLength)
4、完整程序
第4章ArcPy中的函数和类
在 ArcPy 中,所有地理处理工具均以函数形式提供,但并非所有函数都是地理处理工具。除工具之外,ArcPy还提供多个函数以更好地支持使用 Python的地理处理工作流。函数可用于列出某些数据集、检索数据集的属性、在将表添加到地理数据库之前验证表名称或执行其他许多有用的地理处理任务。这些函数只能从ArcPy 获得,而不能作为ArcGIS 应用程序中的工具,因为它们专为Python 工作流所设计。
函数的一般形式与工具类似;它接受参数(可能需要也可能不需要)并返回某些结果。非工具函数的返回值可以为各种类型- 从字符串到地理处理对象。工具函数会始终返回结果对象,并提供地理处理消息支持。
工具参数通常使用简单文本字符串来定义。数据集名称、路径、关键字、字段名称、容差、域名可通过带引号的字符串指定。对于需要多个属性的较复杂参数,难以使用简单字符串对其进行定义。这种情况下可使用类(例如,SpatialReference、ValueTable和 Point类)来定义这些字符串,而不必输入复杂的长文本字符串。
4.1 列出数据并描述数据
1、ListWorkspaces
列出所设置的工作空间中的所有工作空间。可以为工作空间名称和工作空间类型指定搜索条件,从而限制所返回的列表。 必须先设置工作空间环境,之后才能使用多个列表函数。
ListWorkspaces ({wild_card}, {workspace_type})
n wild_card:通配符,可限制返回的结果。如果未指定任何通配符,则会返回所有值。
n workspace_type:工作空间类型,有六种可能。
Ø Access —Only personal geodatabases will be selected.
Ø Coverage —Only coverage workspaces will be selected.
Ø FileGDB —Only file geodatabases will be selected.
Ø Folder —Only shapefile workspaces will be selected.
Ø SDE —Only ArcSDE databases will be selected.
Ø All —All workspaces will be selected.(默认值为All)
import arcpy
arcpy.env.workspace = "c:/data"
# List all file geodatabases in the current workspace
workspaces = arcpy.ListWorkspaces("*", "FileGDB")
for workspace in workspaces:
# Compact each geodatabase
arcpy.Compact_management(workspace)
4.2 使用Cursor
(对FeatureClass进行遍历、增、删改)
4.3 Geometry及其构建
(Point及Geometry、PointGeometry、Multipoint、Polyline或 Polygon)
4.4 消息和错误处理
4.5 示例:添加Feature至FeatureClass
第5章 数据访问模块
数据访问模块 (arcpy.da) 是一个用于处理数据的 Python模块。通过它可控制编辑会话、编辑操作、改进的游标支持(包括更快的性能)、表和要素类与 NumPy 数组之间相互转换的函数以及对版本化、复本、属性域和子类型工作流的支持。
5.1 NumPy 数组
Numerical Python (NumPy)是一个用于在 Python中进行科学计算(包括支持功能强大的多维数组对象)的基础包。NumPy为用户提供了执行复杂数学运算的途径,而且在 9.2版本之后已作为 ArcGIS软件安装过程的一部分。Python NumPy数组专用于处理大型数组。很多现有 Python函数都是为了处理 NumPy数组而创建,而 NumPy数组是包含在 Python的 SciPy科学计算包中的最著名数组。
要将 NumPy 数组转换为表和要素类,数组必须为结构化数组。结构化数组包括用来在 ArcGIS 表和要素类中将数据映射至字段的多个字段(或结构体)。
import numpy
array = numpy.array([(471316.383,5000448.782), (470402.493,5000049.216)], numpy.dtype([('X','>f8'),('Y','>f8')]))
一经创建,结构化 NumPy 数组即可转换为要素类或表。
创建数组的 dtype 取决于输入表的字段类型或要素类。
字段类型 |
NumPy dtype |
单精度 |
numpy.float32 |
双精度 |
numpy.float64 |
SmallInteger |
numpy.int32 |
整型 |
numpy.int32 |
OID |
numpy.int32 |
GUID |
<U64 |
字符串 |
<u1、<u10 等 |
numpy提供了loadtxt函数进行文本文件加载,该功能不仅能实现数据加载,而且能按照dtype将数据按照要求进行标准化,如dtype为结构化数据类型,则加载后的数据直接为结构化数组。
numpy.loadtxt(fname,dtype=<type 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False,ndmin=0)
loadtxt函数要求文本文件每一行必须包含同样数量的值。
fname : 文件或字符串
将要读取的文本文件,或者该文件的文件名
dtype : 数据类型, 可选参数
结果数组的数据类型,缺省情况下为float。若其为结构化数据,结果数组将是1维数组,文本文件中的每一行将成为该数据中的一个元素。此时,文本文件中数据的列数必须与数据类型中的字段数相同。
comments : 字符串, 可选参数
用于标识注释文字的字符,缺省值为‘#’。
delimiter : 字符串, 可选参数
用于分隔文本文件数值的分隔符,缺省情况下为空格,根据文本文件中数据格式,可以设置为诸如‘,’等。
skiprows : 整数, 可选参数
读取文件时跳过文件头上的skiprows 行,缺省值为 0。
usecols : 数值序列, 可选参数
Which columns to read, with 0 being the first. For example, usecols = (1,4,5) will extract the 2nd, 5th and 6th columns. The default, None, results in all columns being read.
NumPyArrayToFeatureClass将 NumPy 结构化数组转换为点要素类。
NumPyArrayToFeatureClass (in_array, out_table, shape_fields, {spatial_reference})
参数 |
说明 |
数据类型 |
in_array |
NumPy 结构化数组。 数组必须包含字段名称和 numpy dtype。 |
NumPyArray |
out_table |
The output point feature class to which the records from the NumPy array will be written. |
String |
shape_fields [shape_fields,...] |
A list (or tuple) of field names used to create the feature class' geometry. Coordinates are specified in the order of x, y, z, and m. z-coordinate and m-value fields are optional. Assuming field names of x, y, z, and m in a numpy array, feature classes could be constructed as below.
|
String |
spatial_reference |
要素类的空间参考。可以使用SpatialReference 对象或等效字符串来指定。 (默认值为 None) |
shape_fields使用示例:
import arcpy
# Create a feature class with x,y fields
arcpy.da.NumPyArrayToFeatureClass(array, fc, ("x", "y"))
# Create a feature class with x,y,z fields
arcpy.da.NumPyArrayToFeatureClass(array, fc, ("x", "y", "z"))
# Create a feature class with x,y,m fields
arcpy.da.NumPyArrayToFeatureClass(array, fc, ("x", "y", "", "m"))
# Create a feature class with x,y,z,m fields
arcpy.da.NumPyArrayToFeatureClass(array, fc, ("x", "y", "z", "m"))
5.2 da中的Cursor
5.3 编辑会话与事务
5.4 示例:将包含点的坐标信息的数据文件转换为FeatureClass
(在ArcMap中,能够调用File->add x,y data完成该项功能)
数据文件内容为:
0.000,0.500
1.000,1.500
2.000,2.500
3.000,3.500
4.000,4.500
5.000,5.500
6.000,6.500
7.000,7.500
8.000,8.500
9.000,9.500
10.000,10.500
11.000,11.500
使用Python编写以下程序:
import numpy
import arcpy
dtype=[('x', '>f8'), ('y', '>f8')]
coords=numpy.loadtxt("d:\\coords.txt",dtype,delimiter=",")
此时,coords是读入数据文件的内容,即按照dtype的样式,将数据文件的数据描述为形式为x,y的坐标对。
array([(0.0, 0.5), (1.0, 1.5), (2.0, 2.5), (3.0, 3.5), (4.0, 4.5),
(5.0, 5.5), (6.0, 6.5), (7.0, 7.5), (8.0, 8.5), (9.0, 9.5),
(10.0, 10.5), (11.0, 11.5)],
dtype=[('x', '<f8'), ('y', '<f8')])
out = "d:\\out.shp"
arcpy.da.NumPyArrayToFeatureClass(coords,out,("x","y"))
按照x,y坐标对,将coords输出为d:\\out.shp。将其加载到ArcMap窗口,即可显示坐标内容。
记住,loadtxt中要将dtype设置为正确的形式才能将数据正确读入。上述数据在numpy中输出方式如下:
numpy.savetxt("d:\\out.txt", coords, fmt="%.3f", delimiter=",")
若数据文件中包含有除x,y之外的信息,则需要重新构造dtype以适应数据文件中的记录内容。
第6章制图模块(arcpy.mapping)
6.1 arcpy.mapping简介
1、什么是arcpy.mapping?
Arcpy.mapping 是作为 ArcPy 站点包一部分的一个Python 脚本模块。随ArcGIS for Desktop 一同安装,并对所有许可均可用。其设计初衷主要是用于操作现有地图文档(.mxd) 和图层文件(.lyr) 的内容。此外,还提供自动执行导出和打印的函数。Arcpy.mapping可用于自动执行地图生产;它扩展了数据驱动页面的功能,同时,因其包含导出至 PDF文档、创建和管理 PDF文档的函数,而为构建完整地图册所必需。最后,可将 arcpy.mapping脚本发布为地理处理服务,并将脚本功能提供给 Web应用程序。
通过描述 arcpy.mapping 执行的一些方案来了解其功能将会更容易些。以下是 arcpy.mapping 脚本可完成的众多方案中的一小部分:
n 创建有关地图文档中所含信息(如数据框坐标系、图层数据源、数据源损坏的图层或布局元素位置)的报告。
n 更新、修复或替换地图文档或图层文件中的图层数据源。
n 更新图层符号系统而无需实际打开地图文档。
n 查找并替换文件夹内所有地图文档中的文本字符串。
n 将地图文档保存至之前的ArcGIS 版本以便分发。
n 更新地图文档元数据(例如,关键字、摘要和描述)。
n 使用地图导出命令批量创建地理数据,例如由数据框中要素列表驱动的一系列GeoTIFF 图像。
n 自动创建和管理要通过ArcGIS for Server 发布的地图服务。
n 构建多种PDF 地图册:
Ø 含标题页、多个地图页面以及任意数量含辅助内容(如表格式报表和联系人列表)的附加页面的专题或时态地图册。
Ø 基于数据驱动页面输出的参考地图册。
2、构建arcpy.mapping 的初衷
Arcpy.mapping 专门面向专业的 GIS 分析人员(以及开发人员)而构建。以前,以上列出的方案必须使用ArcObjects 来完成,然而事实多次证明,对于普通GIS 专业人员而言,该编程环境非常难学。Arcpy.mapping是一种粗粒度对象模型,也即函数的设计原则是单个 arcpy.mapping函数可代替多行 ArcObjects代码。以下这个简单示例显示了如何使用 arcpy.mapping通过仅仅两行代码引用现有地图文档并将其导出至 PDF文档。
>>> mxd = arcpy.mapping.MapDocument("C:/Project/Watersheds.mxd")
>>> arcpy.mapping.ExportToPDF(mxd, "C:/Project/Output/Watersheds.pdf")
Arcpy.mapping 不是 ArcObjects 的替代品,而是作为其支持的不同情景的一种备选方案。对于细粒度开发和应用程序自定义来说,ArcObjects仍是必不可少的,而 arcpy.mapping主要用于自动处理现有地图文档和图层文件的内容。
6.2在ArcMap环境中使用arcpy.mapping
1、Python窗口
要学习 arcpy.mapping,首先应从 Python窗口着手。Python窗口是 ArcMap框架的一部分,它所提供的自动完成功能使您能够轻松读取函数参数的名称和顺序。以下步骤显示了如何设置Python 窗口,以实现令人满意的最终用户体验并使其与本文档中的屏幕截图一致。
步骤:
n 在ArcMap 中打开一个新的空地图文档。
n 单击地理处理> Python。
n 在Python 窗口的代码窗格(具有>>> 字符)中单击。会有一些帮助文本出现在右侧的帮助窗格中。
n 右键单击代码窗格并选择帮助放置> 底部。帮助即会出现在代码窗格的下方。
n 现在输入以下语句(请注意,Python区分大小写):
>>> arcpy.mapping.ExportToPDF(
Python 窗口应如下图所示。第一个必需参数称为 map_document,处于高亮显示状态。如果输入一个逗号,则第二个参数会变为高亮显示。只有两个必需参数:map_document和 out_pdf。可选参数使用大括号{} 括起。
n 右键单击代码窗格,然后单击全部清除以清除代码窗格。
2、引用现有地图文档
通常,通过 arcpy.mapping 脚本执行的首要操作之一即引用要处理的现有地图文档 (.mxd) 或图层文件(.lyr)。
引用地图文档的方法有两种。第一种方法是通过提供.mxd 文件的路径在磁盘上进行引用。如果要构建将在ArcGIS 环*部运行的脚本,则必须使用地图文档的路径对其进行引用。第二种方法是引用当前加载至ArcMap 应用程序中的地图文档(在这种情况下,指的是untitled.mxd)。在ArcMap 内的Python 窗口中进行操作时,引用当前加载的地图文档十分方便,因为在应用程序中可直接看到对地图文档执行的更改。以下步骤将介绍如何引用当前加载至ArcMap 中的地图文档。
步骤:
在 Python 窗口中输入以下内容,完成输入后按 ENTER:
>>> mxd = arcpy.mapping.MapDocument("CURRENT")
MapDocument 函数为称为 mxd 的变量返回一个MapDocument 对象参考。字符串CURRENT 是用于引用当前已加载地图文档的关键字。也可以在此处提供地图文档的路径来代替CURRENT。
在 Python 窗口中输入以下内容,完成输入后按 ENTER:
>>> mxd.author = "YOUR NAME GOES HERE"
将打开 MapDocument 对象具有一个称为 author的属性。只需将其值设置为字符串即可。
在 Python 窗口中输入以下内容,完成输入后按 ENTER:
>>> mxd.save()
由于该地图文档未保存,因此会出现一个对话框提示您提供路径和文件名。save()方法不具有任何参数,但由于它是一个方法,因此仍必须加上左、右括号。事实上,如果要处理的是已经存在的地图文档,并不需要处理弹出的保存对话框。要验证地图文档的保存位置,请尝试以下操作:
在 Python 窗口中输入以下内容,完成输入后按 ENTER:
>>> print mxd.filePath
代码窗格中会打印出路径:
3、将图层文件添加到地图文档中
接下来要做的是向地图文档中添加图层文件(.lyr)。此操作可通过arcpy.mapping AddLayer 函数完成。步骤如下:
在 Python 窗口中,输入以下内容:
>>> arcpy.mapping.AddLayer(
自动完成功能显示有两个必需参数。第一个参数是对地图文档中数据框的引用。第二个参数是对要添加的图层的引用。该图层可以是地图文档或图层文件中的图层。第三个参数是可选参数,用于控制内容列表中图层的放置。由于这是第一个也是仅有的一个图层,可以忽略第三个参数并使用其默认值。
添加该图层之前,需要引用相应的对象。首先将引用数据框。
在 Python 窗口中,输入以下内容,完成输入后按 ENTER:
>>> df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0]
ListDataFrames 函数需要引用地图文档和通配符过滤器(可选)。可以提供数据框的全名以进行搜索。还可以输入类似 "lay*"的内容。
所有 ArcPy 列表函数将返回 Python列表对象。在列表中返回的这些项目从零开始,这表示列表中的第一个项目的索引值为 0,第二个项目为1,依此类推,一直到n-1。由于要让df 变量引用DataFrame 对象而不是Python 列表对象,因此必须在函数后追加索引号。在函数末尾追加[0] 会返回列表中的第一个数据框。在这里,将返回列表中仅有的数据框。如果在地图文档中对数据框进行唯一命名并使用相应的通配符值分隔项目,应始终返回仅有一个项目的列表,而索引[0] 将会起到作用。如果在地图文档中有两个数据框,并且不想通过wildcard 值引用第二个数据框,则需要在函数末尾加上[1],例如,df2 = arcpy.mapping.ListDataFrames(mxd)[1]。
接下来,在使用 AddLayer 函数之前需要引用图层文件。引用图层文件的过程与通过提供 .mxd完整路径引用图层文档的过程相同,所不同的是需使用 Layer函数而非 MapDocument函数。
在 Python 窗口中输入以下内容,完成输入后按 ENTER。注意:路径很可能与以下示例不同。
>>> lyrFile = arcpy.mapping.Layer(r"C:\Project\data\Rivers.lyr")
在以上步骤中,创建了对现有图层文件的引用,该引用存储在名为lyrFile 的变量中。
请注意,路径字符串的前面有一个小写 r。这是 Python中的特殊字符,代表 raw。这表示要按原样解释该字符串并忽略字符串中的其他任何特殊字符。
所有必需的变量参考即已创建完毕。接下来将使用AddLayer 函数将图层文件添加至当前地图文档。
在 Python 窗口中输入以下内容,完成输入后按 ENTER:
>>> arcpy.mapping.AddLayer(df, lyrFile)
该图层应已添加到内容表和数据视图中,Python窗口应如下图所示:
4、将地图文档导出至PDF
将地图文档导出至 PDF 极其容易,仅需要单行代码。在教程开始处已看过 ExportToPDF函数的语法。现在将完成该语法。步骤如下:
在 Python 窗口中输入以下内容,完成输入后按 ENTER。路径很可能与以下示例不同。
>>> arcpy.mapping.ExportToPDF(mxd, r"C:\Project\Doc1.pdf")
有很多参数与 ArcMap 中的设置一致。仅有两个必需参数:map_document和 out_pdf。
已在指定位置创建了 PDF 文档,Python窗口应如下图所示:
5、使用ListLayers 函数引用图层,并更改图层属性
有许多属性和方法可用于处理地图文档中的图层。之前已将图层文件中的图层添加至地图文档。创建的名为lyrFile 的变量即引用添加至地图文档的图层。使用此变量,可修改已添加图层的某些属性。步骤如下:
在 Python 窗口中,输入以下内容:
>>> lyrFile.
输入点之后,请注意 Layer 对象上的所有不同属性和方法。使用 lyrFile变量,可更改地图文档中的这些属性,在调用 save()方法时,会将这些更改保存至磁盘上的图层文件 (.lyr)。
并非所有可能的图层属性都可用于 Layer 对象,只有那些对于地图自动化情景最常见的图层属性才可用。可通过创作图层文件中的属性以及使用arcpy.mapping UpdateLayer 函数来修改更多属性。
大多数情况下,地图文档中已经具有图层。在以下这些步骤中,将假定图层已在地图文档中,再次对其进行引用。在地图文档中引用图层与引用数据框非常相似。
在 Python 窗口中,按 Backspace删除当前文本,输入以下内容,然后按 ENTER:
>>> lyr = arcpy.mapping.ListLayers(mxd)[0]
ListLayers 函数需要提供地图文档参考。该函数有两个附加参数:一个用于执行通配符搜索,另一个用于指定数据框。由于只有一个图层和一个数据框,因此不必提供其他参数。同样,语句结尾仍需要加上[0] 索引值,以便返回Layer 对象而不是Python 列表对象。
使用新的 lyr 变量,可更新某些图层属性。
在 Python 窗口中输入以下两行,在每行后面按 ENTER:
>>> lyr.name = "Some New Name"
>>> lyr.visible = False
运行后不会立即看到更改。不是所有的属性更改或方法都会自动更新应用程序。这是有意设计成这样的,目的在于避免应用程序经常刷新。使用CURRENT 引用ArcMap 中当前加载的地图文档时,有时需要刷新内容列表或活动视图(数据视图或布局视图)。
在 Python 窗口中输入以下两行,在每行后面按 ENTER:
>>> arcpy.RefreshTOC()
>>> arcpy.RefreshActiveView()
内容列表和数据视图将刷新。注:如果在ArcMap 外部运行独立脚本,则不需要这些附加函数。
Python 窗口应如下图所示:
6、更改数据框范围
在本节中,将更改数据框范围以使其与所选要素的范围相符。在脚本中,通常使用类似SelectlayerByAttribute 的函数来完成此操作。为了简化操作,您将以图形的方式选择一些要素。首先需要使用Python 再次开启图层可见性。步骤如下:
在 Python 窗口中输入以下三行,在每行后面按 ENTER:
>>> lyr.visible = True
>>> arcpy.RefreshTOC()
>>> arcpy.RefreshActiveView()
在 ArcMap 中,以图形方式选择图层中的一个或多个要素。然后,创建存储所选要素范围的变量,并将该范围应用于所引用的DataFrame 对象的extent 参数。
在 Python 窗口中输入以下两行,在每行后面按 ENTER:
>>> lyrExtent = lyr.getSelectedExtent()
>>> df.extent = lyrExtent
Python 窗口应如下图所示:
7、将地图文档(再次)导出至PDF
将再次导出至 PDF。这次将另外创建一个 PDF文档,该文档最终将与第一个文档一起追加到新文档中。步骤如下:
在 Python 窗口中输入以下内容,完成输入后按 ENTER。提供的路径很可能与以下示例不同。
>>> arcpy.mapping.ExportToPDF(mxd, r"C:\Project\Doc2.pdf")
Python 窗口应如下图所示:
新建 PDF 文档并追加两页
arcpy.mapping 模块包含一些 PDF 文档管理函数,这对于创建多页文档十分理想。例如,完整的地图册除包含数据驱动页面生成的标准参考地图页面以外,往往还包含一些其他页面。arcpy.mapping的使用对于构建完整地图册来说是必要的步骤。
教程本部分将模拟多页报告的创建过程。首先要新建一个PDF 文档,然后追加在先前步骤中创建的PDF。假设这些PDF 文档只是构成地图册的单个文档。例如,Doc1.pdf可以是表示标题页和内容列表等的多页 PDF。第二个PDF 文档可以是将所有数据驱动页面地图页面导出至单个多页PDF 的结果。
第一步是新建 PDF 文档。
在 Python 窗口中输入以下内容,完成输入后按 ENTER:
>>> PDFdoc = arcpy.mapping.PDFDocumentCreate(r"C:\Project\Final.pdf")
称为 PDFdoc 的变量引用内存中的 PDFDocument对象。只有在保存并关闭文档后,该变量才会存在于磁盘中。
在 Python 窗口中输入以下三行,在每行后面按 ENTER:
>>> PDFdoc.appendPages(r"C:\Project\Doc1.pdf")
>>> PDFdoc.appendPages(r"C:\Project\Doc2.pdf")
>>> PDFdoc.saveAndClose()
前两行分别将每个 PDF 追加至新建的 PDF文档中。最后一行是提交更改并在磁盘上创建最终 PDF。
已在指定位置创建了 PDF 文档,Python窗口应如下图所示:
6.3 arcpy.mapping指导原则
本节重点介绍了 arcpy.mapping 模块的一些重要使用原则。还针对 arcpy.mapping API设计提出了一些见解,并就不同情景给出了策略建议。
1、必须处理现有地图文档或图层文件
arcpy.mapping 模块的设计初衷是用于修改已存在的地图文档 (.mxd) 或图层文件 (.lyr)中的现有元素。也就是说,它旨在帮助实现现有要素处理的自动化,但不可用于创作新对象。设计的出发点并非想让其成为ArcObjects 的完全替代品,也不会将其用于为ArcMap 界面中的所有按钮、对话框、菜单选项或快捷菜单项创建函数、方法或属性(这些功能由ArcObjects 提供)。必须预先在ArcMap 中认真创作一个含所有相应元素的地图文档或图层文件,然后使用arcpy.mapping 操作其内容。
以下提供一些 arcpy.mapping 应用的简单示例:
n 替换图层的数据源。
n 遍历一系列数据框范围,查找并替换文本值,然后将页面布局导出至PDF。
n 通过将PDF 文档追加到最终产品的方式构建完整的地图册。
注:可对现有地图文档或图层文件执行更改,然后使用MapDocument 或Layer 对象上的saveACopy 方法将这些更改保存至一个新文件。
2、添加图层并处理模板地图文档
arcpy.mapping 不允许创作全新的地图文档。按照设计,它也不提供更改现有地图文档的页面大小或方向的功能。解决方案很简单。预先创作含各种相应元素、页面大小、方向等内容的模板地图文档,然后使用arcpy.mapping 操作其内容。
常见的一种情景是创作一个不含图层的模板地图文档,然后使用arcpy.mapping AddLayer、AddLayerToGroup或 InsertLayer函数向地图文档添加图层。如果图例元素已事先创作为自动将新项目添加到图例,则会自动出现图例项。
另一种常见情景涉及含对开页面的地图册。左侧和右侧页面各偏移一定的距离,以便为装订留出空间。该情景需要有两个地图文档:一个是左侧页面,另一个是右侧页面。使用Arcpy.mapping 脚本逻辑将所有单个页面合到一起,形成最终的多页PDF 输出。请参阅创建包含对开页面的地图册,该文档详细介绍了此情景并提供了arcpy.mapping 代码示例。
3、创作任何对象时均使用唯一名称
为便于引用地图元素(例如,数据框、图层、布局元素或表)以对其访问和修改,地图元素必须具有唯一名称。许多arcpy.mapping 列表函数(例如ListDataFrames、ListLayers、ListLayoutElements和 ListTableViews)都含有通配符参数,允许您对名称属性进行过滤。这些列表函数始终会返回一个Python 列表对象。为引用Python 列表中的地图元素,您可以通过循环遍历列表,也可以在函数末尾追加一个索引号。如果使用通配符并指定唯一名称,则返回的Python 列表将始终包含一个项目,并可使用索引值0 对其进行引用。
mxd = arcpy.mapping.MapDocument("CURRENT")
riverLyr = arcpy.mapping.ListLayers(mxd, "Rivers")[0]
titleTxt = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "title")[0]
页面布局元素有一个独立属性,称为元素名称。可在元素的属性 对话框内的大小和位置 选项卡中对其进行设置。
数据框、图层和表不像页面布局元素那样具有独立的名称属性。它们的名称基于内容列表中显示的标注。理想情况下,将为同一地图文档内的所有数据框、图层和表给定唯一名称。如果出现需要有重复名称又不能将二者混淆的情况,那么您需要创作地图文档以使用其他属性进行区分。
以下代码显示了如何使用 Layer 对象的 description属性对数据框“County Maps”中具有相同名称“Streets”的图层进行区分的示例。
mxd = arcpy.mapping.MapDocument("C:/Project/Project.mxd")
df = arcpy.mapping.ListDataFrames(mxd, "County Maps")[0]
for lyr in arcpy.mapping.ListLayers(mxd):
if lyr.name == "Streets":
if lyr.description == "1:10000":
lyr.visible = True
if lyr.description == "1:100000":
lyr.visible = False
4、创作额外布局元素并视需要将其移入和移出页面布局
有时可能会遇到这种情况,您在创建地图系列时,其中某些页面具有附加地图元素,例如,额外的数据框、附加图片或文本元素等。这种情况下,您可以创作一个含所有可能布局元素的地图文档,然后根据需要使用arcpy.mapping 脚本逻辑将这些元素移入和移出页面,而不必专门针对这些情景创作独立的地图文档。如果某个元素被移到页面布局边界以外,则不会将其打印或导出。
在以下示例中,结果布局将基于当前数据框比例显示不同样式的比例尺。如果比例大于1:25,000,则比例尺单位将以米计。如果比例大于或等于1:25,000,则比例尺单位将以千米计。
mxd = arcpy.mapping.MapDocument("C:/Project/Project.mxd")
m_scale = arcpy.mapping.ListLayoutElements(mxd, "MAPSURROUND_ELEMENT", "m scale bar")[0]
km_scale = arcpy.mapping.ListLayoutElements(mxd, "MAPSURROUND_ELEMENT", "km scale bar")[0]
df = arcpy.mapping.ListDataFrames(mxd, "Main DF")[0]
if df.scale < 25000:
m_scale.elementPositionX = 5 #on the page
km_scale.elementPostitionX = 15 #off the page
else:
m_scale.elementPositionX = 15 #off the page
km_scale.elementPostitionX = 5 #on the page