快速浏览:在 Spatial Analyst 中使用“地图代数”

需要 Spatial Analyst 许可。

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

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

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

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

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

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

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

  • 栅格计算器工具
  • Python 窗口
  • 偏好的 Python 集成开发环境 (IDE)

栅格计算器

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

栅格计算器用户界面
栅格计算器用户界面

在上述表达式中,通过将第二个栅格和第三个栅格相乘,并将结果与第一个栅格相加来结合三个栅格。请注意,运算符遵循定义的优先级顺序

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

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

Python 窗口

Python 窗口中,可以高效、便捷地使用地理处理工具和 ArcGIS 中的 Python 函数。可在该窗口中运行的 Python 命令包括单行代码,也包括带逻辑的复杂块。在 Python 窗口中,还可通过自定义或第三方 Python 模块和库来实现其他功能。

要启动 Python 窗口,请单击分析选项卡或视图选项卡上窗口组中的 Python 按钮 显示 Python 窗口

Python 窗口示例

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

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

Python 集成开发环境

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

以下脚本用于导入 ArcPy、地理处理环境和 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。

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

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

只有输出栅格的 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 中的地理处理的详细信息,可参阅以下主题:

相关主题