Spatial Analyst 中的地图代数

需要 Spatial Analyst 许可。

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

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

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

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

随着需求的增加,您可以地图代数的很多方面进行探索。 以下快速浏览为您提供一些基本的入门知识。

运行地图代数的基础知识

可通过三种方式使用地图代数:

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

栅格计算器

栅格计算器工具可运行地图代数表达式。 该工具具有一个计算器界面,可在其中单击按钮创建大多数地图代数语句。 栅格计算器可作为独立工具使用,也可在 模型构建器 中使用。 因此,通过该工具可将地图代数集成到 模型构建器 中。

“栅格计算器”用户界面
显示“栅格计算器”用户界面。

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

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

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

Python 窗口

Python 窗口允许您使用 ArcGIS Pro 中的地理处理工具和 Python 功能。 可在该窗口中运行的 Python 功能包括单行代码,也包括复杂的多行代码块。 Python 窗口还提供了一个使用第三方 Python 模块和库访问附加功能的位置。

要启动 Python 窗口,在分析选项卡上,单击 Python 下拉菜单,然后选择 Python 窗口按钮 显示 Python 窗口。 或者,在视图选项卡的窗口组中,单击 Python 窗口。

Python 窗口示例

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

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

Python 集成式开发环境

尽管对在 Python 窗口中可以输入的语句数量没有限制,但是创建太多复杂的模型可能会比较麻烦。 您也可以通过所偏爱的集成开发环境来访问 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")

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

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

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

使用工具

所有输出栅格的 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.tif")

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

outRas = Select("inras.tif", "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 运算符),必须将数据集转换为 Raster。 以下示例使用 Spatial Analyst+ 运算符将两个栅格相加:

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

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

outRas = Raster("inras1.tif") + 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 工具,通过括号将输出指定为工具中的参数。 请注意下例中的语法,下例将等值线创建为输出折线要素数据集:

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

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

在如下所示的所有“地图代数”示例中,输出均为 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 中的地理处理的详细信息,可参阅以下内容:

相关主题