快速浏览:使用地图代数

地图代数允许您通过代数来访问 Spatial Analyst 的工具、运算符、函数和类。其最基本的格式是,输出栅格位于等号 (=) 左边,工具、运算符及其参数位于等号右边。例如:

from arcpy.sa import *
outShade = Hillshade("inelevation", 99, 33)

以上语句用于计算山体阴影,即确定太阳在方位角为 99 度且高度角为 33 度时的照明度,并且创建名为 outShadeRaster 对象来存储结果。

地图代数可以执行简单语句,但在创建复杂语句和模型时可实现该语言的强大功能。由于地图代数集成在 Python 中,因此,Python 和 ArcPy 的所有功能及其扩展模块(模块、类、函数和属性)均可供 Spatial Analyst 建模器使用。

使用地图代数可以快速提高工作效率,并且随着需求的增加,您可以对其很多方面进行探索。以下快速浏览为您提供一些基本的入门知识。

运行“地图代数”的基础知识

使用“地图代数”的方法有三种:

栅格计算器

栅格计算器工具可执行“地图代数”表达式。此工具具有易于使用的计算器界面,只需单击界面中的按钮便可创建大部分“地图代数”语句。栅格计算器可作为独立工具使用,也可在模型构建器中使用。因此,通过该工具可将“地图代数”的功能集成到模型构建器中。

栅格计算器用户界面

上述语句用于将三个栅格相加。

栅格计算器工具并不能取代其他 Spatial Analyst 工具。需要继续使用其他工具进行相应计算。例如,使用坡度工具执行坡度计算。栅格计算器工具用于执行单行代数语句。

由于栅格计算器是地理处理工具,因此,它也可以像所有工具一样集成在模型构建器中。有关详细信息,请参阅以下主题:

Python 窗口

ArcGIS 10.0 提供了一种新的嵌入式 Python 体验。地理处理命令行在改善后已成为一种完全交互式的 Python 解释程序(或界面),现在称为 Python 窗口。在Python 窗口中,可以高效、便捷地使用地理处理工具和 ArcGIS 中的 Python 函数。可在该窗口中运行的 Python 命令包括单行代码,也包括带逻辑的复杂块。在 Python 窗口中,还可通过自定义或第三方 Python 模块和库来实现其他功能。

要启动 Python 窗口,请单击“标准”工具条上的“Python 窗口”按钮 Python 窗口,或者在“地理处理”下拉菜单中单击 Python 窗口。

Python 窗口示例

上面的语句序列用于导入 ArcPy 站点包、地理处理环境和 Spatial Analyst 模块;设置工作空间;运行坡度工具;并且永久保存输出。在语句末尾输入回车符后,会立即运行该语句。

Python 窗口的部分功能包括:自动完成内置行、使用变量,以及访问 Python 和 ArcPy 功能。

Python 集成开发环境

尽管对在 Python 窗口中输入的语句数量没有限制,但是创建太多复杂的模型可能会比较麻烦。您也可以通过所偏爱的集成开发环境(例如 PythonWin)来访问 Spatial Analyst 模块的工具、运算符、函数以及类。启动首选的 IDE 并输入所需的语句。

以下脚本用于导入 ArcPy、地理处理环境和 Spatial Analyst 模块;设置变量;检出 Spatial Analyst 扩展模块;运行坡度工具;以及保存输出。

# Name: Slope
# Description: Identifies the rate of maximum change
#               in z-value from each cell.
# Requirements: Spatial Analyst Extension


# Import system modules
import arcpy
from arcpy import env
from arcpy.sa import *

# Set environment settings
env.workspace = "C:/data"

# Set local variables
inRaster = "elevation"
outMeasurement = "DEGREE"
zFactor = 0.3043

# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")

# Execute Slope
outSlope = Slope(inRaster, outMeasurement, zFactor)

# Save the output
outSlope.save("C:/output/outslope02")

与 Python 窗口一样,IDE 可用于访问所有可用的 Python 和 ArcPy 功能。

使用工具工作

所有输出栅格的 Spatial Analyst 工具均可以代数形式使用。如果数据集名称位于内容列表 窗口或当前工作空间中,则可使用它;否则,必须输入完整路径。

# In the following statement, indem is either  
#   in the TOC or in the current workspace
outRas = Aspect("indem")

# In the following statement the full path is specified
outRas2 = Aspect("C:/Data/indem2")  

语句的输出可输入到后续语句中。

outRas = Select("inras", "Value > 105")

# outRas is variable defined by the previous statement and is not quoted
outdist = EucDistance(outRas)  

使用运算符

“地图代数”支持一系列运算符(例如,+、- 和 *)。这些运算符同样也存在于 Python 中,但针对“地图代数”进行了修改,以便按不同方式来处理 Raster 对象。例如,下面将两个数相加,构成了一个变量:

# set outVar to 14 using the Python + operator
outVar = 5 + 9

为了体现该语句应对栅格起作用(即,使用 Spatial Analyst 运算符),必须将数据集转换为栅格。以下示例使用 Spatial Analyst 的 + 运算符将两个栅格相加:

outRas = Raster("inras1") + Raster("inras2")  

运算符可以接收栅格和数字的混合形式。例如,以下示例将常数值 8 与输入栅格中的所有像元相加:

outRas = Raster("inras1") + 8

创建复杂表达式

可将工具和运算符连在一起构成一条语句。以下示例执行每个表达式中的多个工具和运算符:

outRas = Slope("indem" * 2) / 57
outdist = EucDistance(ExtractByAttributes("inras", "Value > 105"))

可以使用括号控制处理顺序。考虑下面两个示例,它们使用了相同的运算符,但是由于使用括号而得到了不同的结果:

outRas1 = (Raster("inras1") + Raster("inras2")) / Raster("inras3")

并且

outRas2 = Raster("inras1") + Raster("inras2") / Raster("inras3")

在第一条语句中,inras1inras2 相加,然后将结果除以 inras3。第二条语句中没有括号,inras2 将除以 inras3,然后将结果与 inras1 相加。

在单个表达式中连续使用多个布尔(~&^|)运算符和/或关系(<<=>>===!=)运算符时,应使用括号。例如,表达式 (a>2) & (a<5) 需要使用括号。如果不使用括号,则表达式将导致错误:a>2 & a<5。因为使用了括号,下面的表达式将会执行:

outRas = (Raster("a") > 2) & (Raster("a") < 5)
开始行动开始行动:

有些表达式可能不只是需要括号,而是需要重写。例如,形式为 a < b < c 的表达式将不会执行,而添加括号会改变表达式的含义。因此,要成功执行此表达式,需要将其重写为以下形式 (a < b) & (b < c)

使用类

在“地图代数”工具中,类用于具有多个实际参数的形式参数。通过对输入形式参数使用类,可以轻松地访问形式参数的各个实际参数,从而查询、更改和添加其他实际参数。以下示例显示了类的使用:

outRas = FocalStatistics("inRaster", NbrCircle(5, "CELL"), "SUM") 

上述语句用于为含有五个像元的圆形邻域中的每个像元计算总和。NbrCircle 是用于创建 NbrCircle 对象的类。

以下示例显示了重映射表类。可以在重映射类中输入任意数量的值。

outReclass = Reclassify("inRaster", "VALUE", RemapRange([[0, 1], [3, 10], [4, 8]]))

在上述语句中,类 RemapRange 用来定义输入值的重分类。inRaster 中值为 0 的像元将被分配给 outReclass 中的 1,而 3 将被分配给 10,4 将分配给 8。

有关在“地图代数”中使用类的详细信息,请参阅 Spatial Analyst 类概述

用于输出要素、表或文件的“地图代数”功能

只有输出栅格的 Spatial Analyst 工具才可以使用代数格式执行。对于输出不是栅格(例如,要素、表或文本文件)的 Spatial Analyst 工具,通过括号将输出指定为工具中的参数。请注意下例中的语法,下例将等值线创建为输出折线要素数据集:

indem = "C:/Data/indem"
Contour(indem, "C:/output/outcontours")

关于执行“地图代数”语句的建议

在如下所示的所有“地图代数”示例中,输出均为 Raster 对象。Raster 对象指向临时栅格数据集,除非明确保存此数据集,否则 ArcGIS 会话结束时会将其删除。要永久保存临时数据集,可对 Raster 对象调用 save 方法(请参阅以下两个示例)。

在实施“地图代数”工具或运算符之前,建议设置相应的分析环境,尤其是当前工作空间范围像元大小掩膜

以下示例用于演示工作空间环境:

import arcpy 
from arcpy import env 
from arcpy.sa import *

env.workspace = "C:/sapyexamples/data" 

outHillshade = Hillshade("elevation", 180, 75, "SHADOWS", 1)

outHillshade.save("outhillshd01")

上述语句设置了工作空间,因此,outhillshd01 将保存在 C:/sapyexamples/data 中。

建议将“地图代数”工具所有复杂输入的类均设置为变量,并在语句中使用此变量。在下面的语句中,RemapRange 类对象被设置为变量 myRemapRange 并且用作重分类工具的输入。

import arcpy 
from arcpy import env
from arcpy.sa import *

env.workspace = "C:/sapyexamples/data" 
myRemapRange = RemapRange([[-3, 0, 0], [0, 1.75, 25], [1.75, 3.5, 50], 
                           [3.5, 5.25, 75], [5.25, 7, 100]]) 

outReclassRR = Reclassify("inreclass", "VALUE", myRemapRange)

outReclassRR.save("rclassremran")

更多阅读材料

要想更深入地了解 ArcPy,可以浏览以下主题:

要获取有关 Python 中的地理处理的详细信息,可参阅以下主题:

有关 Python 的详细信息,可访问以下页面:

相关主题


7/10/2012