需要 Spatial Analyst 许可。
地图代数允许您通过代数来访问 Spatial Analyst 的工具、运算符、函数和类。 其最基本的格式是,输出栅格位于等号 (=) 左边,工具、运算符及其参数位于等号右边。 请参阅以下示例:
from arcpy.sa import *
outShade = Hillshade("inelevation.tif", 99, 33)
以上语句用于计算山体阴影,即确定太阳在方位角为 99 度且高度角为 33 度时的照明度,并且创建名为 outShade 的 Raster 对象来存储结果。
地图代数可以运行简单语句,但在创建复杂语句和模型时可实现该语言的强大功能。 由于地图代数已集成到 Python 中,因此,Python 和 ArcPy 的所有功能及其扩展(模块、类、函数和属性)均可供建模者使用。
随着需求的增加,您可以地图代数的很多方面进行探索。 以下快速浏览为您提供一些基本的入门知识。
运行地图代数的基础知识
可通过三种方式使用地图代数:
- 栅格计算器工具
- Python 窗口
- Python 集成式开发环境 (IDE)
栅格计算器
栅格计算器工具可运行地图代数表达式。 该工具具有一个计算器界面,可在其中单击按钮创建大多数地图代数语句。 栅格计算器可作为独立工具使用,也可在 模型构建器 中使用。 因此,通过该工具可将地图代数集成到 模型构建器 中。
在上述表达式中,通过将第二个栅格和第三个栅格相乘,并将结果与第一个栅格相加来结合三个栅格。 请注意,运算符遵循定义的优先级顺序。
栅格计算器工具并不能取代其他 Spatial Analyst 工具。 需要继续使用其他工具进行相应计算。 例如,使用坡度工具执行坡度计算。 栅格计算器工具用于运行单行代数语句。
由于栅格计算器是地理处理工具,因此,它也可以像所有工具一样集成在 模型构建器 中。 有关详细信息,请参阅以下主题:
Python 窗口
在 Python 窗口允许您使用 ArcGIS Pro 中的地理处理工具和 Python 功能。 可在该窗口中运行的 Python 功能包括单行代码,也包括复杂的多行代码块。 Python 窗口还提供了一个使用第三方 Python 模块和库访问附加功能的位置。
要启动 Python 窗口,在分析选项卡上,单击 Python 下拉菜单,然后选择 Python 窗口按钮 。 或者,在视图选项卡的窗口组中,单击 Python 窗口。
上面的语句序列用于导入 ArcPy 站点包、地理处理环境和 Spatial Analyst 模块;设置工作空间;运行坡度工具;并且永久保存输出。 在语句末尾按 Enter 键后,会立即运行该语句。
Python 窗口的部分功能包括:自动完成内置行、使用变量,以及访问 Python 和 ArcPy 功能。
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 可用于访问所有可用的 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.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")
在第一条语句中,inras1 与 inras2 相加,然后将结果除以 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 中的地理处理的详细信息,可参阅以下内容: