Map Algebra 地图代数
三峡大学土木水电学院 肖泽云
ArcGIS的空间分析通过地图代数语言(Map Algebra Language),提供了许多丰富的分析工具。地图代数语言(Map Algebra Language)提供了一些能单独运行、也能和其他联合运用的积木块工具来解决问题。当然,要连接这些积木块还需要遵循相关的语法规则。
地图代数语言(Map Algebra Language)中的积木块主要是一些对象(Object)、行为(Action)和修饰(Qualifier),这有点类似于名称、动词和副词,下面来看一下这三个概念:
1)对象(Object)
对象要么是存储信息,要么就是一些值,它们是计算的输入部分或输出的存储位置。Raster数据集、Raster图层、表、常数和数值在地图代数语言(Map Algebra Language)中都是对象。
2)行为(Action)
行为可以看作是操作或函数,ArcGIS的空间分析主要是进行Raster数据集、Raster图层、要素数据集、要素图层、表、数值等之间的数学计算。这一套操作由算术运算、关系运算、布尔运算、按位运算、逻辑操作(支持整型数据和浮点型数据类型)和组合操作(同时叠加Raster数据集或Raster图层时还保留输入数据的属性值)。
3)修饰(Qualifier)
修饰主要是一些用于控制何时何地执行操作的参数,
常数和数值都是一些单值对象,经常都是一些数字。在地图代数语言中经常用到的常数有PI(3.14)、E(2.718)和DEG(57.296)等。
1、地图代数语言基础
操作:
操作可以用于一个或两个输入数据间,这些输入数据包括栅格数据集、栅格图层、数字或常数,如下:
[inlayer1] + [inlayer2]
在上面的等式中将创建一个输出的栅格数据集,它的值为两个栅格图层inlayer1
和inlayer2的总和。
函数:
一个函数的表达式主要依靠其语法和参数,如下:
sin(c:/data/inraster1)
mean([inlayer1], [inlayer2], [inlayer3])
focalsum([inlayer1], rectangle, 3, 3)
第一个表达式中输出的栅格数据集中每个单元值为栅格数据集inraster1上对应单元值的正弦值,第二个表达式表示对三个图层inlayer1、inlayer2和inlayer3取平均值。如果要直接调用数据集,则在函数的圆括号()内输入数据集的目录及名称,如果为地图中的图层,则直接采用方括号[]内输入图层名称即可。
带表达式的参数:
如下:
sin([inlayer1]) + pow([inlayer2], 2)
这个表示将图层inlayer1转换成正弦Raster,将图层inlayer2
平方,然后和前面的正弦Raster相加。
2、地图代数语言中的操作
地图代数语言表达式的结果可以为Raster数据集、要素数据集、表,甚至是ASCII文件。如下:
[inlayer1] * [inlayer2] div c:/data/inraster3
[inlayer1] & [inlayer2]
[inlayer1] + c:/results/inraster2 - [inlayer3]
在
地图代数语言中圆括号不参与操作,空格也没有任何意义,如下:
([inlayer1] div [inlayer2]) * [inlayer3]
[inlayer1] + ([inlayer2] + 8)
(([inlayer1] * 6) + [inlayer2]) & d:/data/inrast3
3、地图代数语言中的函数
所有的函数都是以函数名开头,紧接着就是数据,数据都在圆括号内,具体有需要多少个数据则根据函数而定。如下:
tan([inlayer])
focalmax([inlayer1], rectangle, 4, 4)
zonalmin([zonelayer], [valuelayer])
reclass(ingrid1, remap_table, NODATA)
4、地图代数语言中的常用语法
地图代数语言中的常用语法如下:
类型 |
语法 |
说明 |
算术 |
- |
符号 |
mod |
取模 |
|
* |
乘 |
|
/ |
除 |
|
div |
小数除 |
|
+ |
加 |
|
- |
减 |
|
布尔 |
^,not |
异 |
&,and |
和 |
|
!,xor |
非 |
|
|,or |
或 |
|
关系 |
<,lt |
小于 |
<=,le |
小于等于 |
|
>,gt |
大于 |
|
>=,ge |
大于等于 |
|
==,eq |
等于 |
|
^=,<>,ne |
不等于 |
处理上面的一些语法外,还有条件语句,其语法如下:
Con(
举一个例子:
outraster = con(inraster1 > 5, 10, 100)
上面的表达式表示当inraster1数据中单元值(即象元值)大于5,将会在outraster数据中对应单元位置赋予值10,否则就赋予100。
除了上面的一个条件语句,还可以对条件语句进行嵌套,如下例子:
outraster = con(inraster1 < 5, sin(inraster1), _
con(inraster1 < 20, cos(inraster1), _
con(inraster1 > 50, 100, 0)))
5、打开Map Algebra工具
打开ArcToolbox,选择“Spatial Analyst Tools——Map Algebra”,如下图所示:
有两个Map Algebra 工具,一个是处理单个输出的(Single Output Map Algebra),另一个是处理多个输出的(Multi Output Map Algebra)。
1)单个输出
双击Single Output Map Algebra工具,弹出如下图所示窗体:
在Map Algebra expression下输入表达式,如“sin(E:/WebHelp/FGDB.gdb/Region)”,然后在Output raster下选择数据输出的路径及文件名,点击OK按钮开始执行工具。
2)多个输出
当要批量处理多个事件时,就可以采用多个输出。双击Multi Output Map Algebra工具,弹出如下图所示窗体:
同样,在Map Algebra expression下输入表达式,如:
newSlope = SLOPE(DEM)
newShade = HILLSHADE(DEM)
其中newSlope和newShade是自定义的文件名,该文件保存位置还需要通过设置环境来设置。点击“Environments”按钮,出现如下图所示环境设置窗体:
在General Settings里面设置Current Workspace,设置当前工作目录,然后点击OK按钮。那么生成的数据newSlope和newShade将保存在刚才设置的当前工作目录下。
在使用多个输出时需要注意的是,需要设置当前工作目录,还需要为每个输出数据设置名称,另外要直接使用Map中的图层,不需要使用中括号。
6、ArcGIS中包含的Map Algebra函数
通过ArcGIS Desktop Help,查找某个分析工具的使用提示,如果该工具具有对应的Map Algebra函数,那么在使用提示中将会有其对应的Map Algebra函数及其语法格式。如Flow Accumulation工具,通过帮助可以查找到它对应的Map Algebra函数,如下图所示:
其函数为:FlowAccumulation(
其中
除了通过帮助可以查找到ArcGIS常用分析工具对应的Map Algebra函数外,还可以在打开Multi Output Map Algebra工具时,通过点击Multi Output Map Algebra窗体上的Usage按钮,如下图所示:
在弹出的Grid Map Algebra Usages窗体中左侧列出所有的Map Algebra函数,点击相应的函数,在右侧会出现该函数的使用语法结构。如FlowAccumulation对应的语法为:
(out_float_grid) FLOWACCUMULATION (
其中out_float_grid为输出数据,dir_grid为输入数据,weight_grid和FLOAT | INT为可选项。
7、例子
例子代码 |
说明 |
SLOPE([Inlayer1]) |
计算Inlayer1.图层的坡度 |
MEAN([Inlayer1], [Inlayer2], [Inlayer3]) |
计算这三个图层的平均值 |
HILLSHADE(e:/spatial/elevation) |
根据elevation数据创建坡面数据 |
Shape = GRIDSHAPE(Ingrid) |
转换位于工作目录中的数据Ingrid为格网数据,其数据名称Shape,并保存于工作目录下 |
BASIN(FLOWDIRECTION([elevation])) |
首先使用FLOWDIRECTION工具创建一个水流流向数据,然后使用BASIN工具划分流域。 |
outgrid = con(ingrid1 < 5, sin(ingrid1), ingrid1 < 20, cos(ingrid1), ingrid1 > 50, 100, 0) |
使用条件工具创建数据,该数据名称为outgrid,保存于工作目录下 |
参考资料:
1 ArcGIS Desktop 9.2 Help