需要 Spatial Analyst 许可。
地图代数允许您通过代数来访问 Spatial Analyst 的工具、运算符、函数和类。其最基本的格式是,输出栅格位于等号 (=) 左边,工具、运算符及其参数位于等号右边。例如:
from arcpy.sa import *
outShade = Hillshade("inelevation", 99, 33)
以上语句用于计算山体阴影,即确定太阳在方位角为 99 度且高度角为 33 度时的照明度,并且创建名为 outShade 的 Raster 对象来存储结果。
地图代数可以执行简单语句,但在创建复杂语句和模型时可实现该语言的强大功能。由于地图代数已集成到 Python 中,因此,Python 和 ArcPy 的所有功能及其扩展(模块、类、函数和属性)均可供建模者使用。
使用地图代数可以快速提高工作效率,并且随着需求的增加,您可以对其很多方面进行探索。以下快速浏览为您提供一些基本的入门知识。
运行“地图代数”的基础知识
使用“地图代数”的方法有三种:
- 栅格计算器工具
- Python 窗口
- 偏好的 Python 集成开发环境 (IDE)
栅格计算器
栅格计算器工具可执行“地图代数”表达式。此工具具有易于使用的计算器界面,只需单击界面中的按钮便可创建大部分“地图代数”语句。栅格计算器可作为独立工具使用,也可在模型构建器中使用。因此,通过该工具可将“地图代数”的功能集成到模型构建器中。
上述表达式用于将三个栅格相加。
栅格计算器工具并不能取代其他 Spatial Analyst 工具。需要继续使用其他工具进行相应计算。例如,使用坡度工具执行坡度计算。栅格计算器工具用于执行单行代数语句。
由于栅格计算器是地理处理工具,因此,它也可以像所有工具一样集成在模型构建器中。有关详细信息,请参阅以下主题:
Python 窗口
在Python 窗口中,可以高效、便捷地使用地理处理工具和 ArcGIS 中的 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")
在第一条语句中,inras1 与 inras2 相加,然后将结果除以 inras3。第二条语句中没有括号,inras2 将除以 inras3,然后将结果与 inras1 相加。
在单个表达式中连续使用多个布尔(~、&、^、|)运算符和/或关系(<、<=、>、>=、==、!=)运算符时,应使用括号。例如,表达式 (a>2) & (a<5) 需要使用括号。如果不使用括号,则表达式将导致错误:a>2 & a<5。因为使用了括号,下面的表达式将会执行:
outRas = (Raster("a") > 2) & (Raster("a") < 5)
使用类
在“地图代数”工具中,类用于具有多个实际参数的形式参数。通过对输入形式参数使用类,可以轻松地访问形式参数的各个实际参数,从而查询、更改和添加其他实际参数。以下示例显示了类的使用:
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 扩展模块 类概述。
用于输出要素、表或文件的“地图代数”功能
只有输出栅格的 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 的详细信息,可访问以下页面: