文档库 最新最全的文档下载
当前位置:文档库 › 2.ArcPy

2.ArcPy

2.ArcPy
2.ArcPy

第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 https://www.wendangku.net/doc/8f8690522.html,

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 env as 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 类的属性的方式公开。这些属性可用于检索或设置当前值。可将地理处理环境设置视为影响工具执行结果的附加参数。

属性说明数据类型

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("WesternBrook", "westbrook_hill", 300) arcpy.Aspect_3d("WesternBrook", "westbrook_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 edit as EDIT

from arcpy import management as 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)

?out_folder_path:要创建文件夹的磁盘位置。数据类型为Folder

?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})

?out_folder_path:将创建文件地理数据库的位置(文件夹)。数据类型为Folder

?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})

?out_path:创建输出要素类所在的ArcSDE 地理数据库、文件地理数据库、个人地理

数据库或文件夹。此工作空间必须已经存在。数据类型为:Workspace;Feature

Dataset

?out_name:要创建的要素类的名称。数据类型为String

?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})

?in_table:要添加指定字段的输入表。该字段将被添加到现有输入表,并且不会创建

新的输出表。可将字段添加到ArcSDE 的要素类、文件或个人地理数据库的要素类、

coverage、shapefile、栅格目录、独立表、带属性表的栅格和/或图层。

?field_name:要添加到输入表的字段的名称。

?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

相关文档