加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Map Algebra 地图代数 (转)

(2011-03-15 15:02:08)
标签:

杂谈

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(<condition>, <true_expression>, <false_expression>)

举一个例子:

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(<dir_grid>, {weight_grid})

其中<dir_grid>为水流流向数据,{weight_grid}为权重数据。注意,如果使用大括号{}的参数表示为可选项,即在此weight_grid为可选项。

除了通过帮助可以查找到ArcGIS常用分析工具对应的Map Algebra函数外,还可以在打开Multi Output Map Algebra工具时,通过点击Multi Output Map Algebra窗体上的Usage按钮,如下图所示:

 


在弹出的Grid Map Algebra Usages窗体中左侧列出所有的Map Algebra函数,点击相应的函数,在右侧会出现该函数的使用语法结构。如FlowAccumulation对应的语法为:

  (out_float_grid) FLOWACCUMULATION (<dir_grid>, {weight_grid}, {FLOAT | INT})

其中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,保存于工作目录下
 


 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xwebsite/archive/2009/11/22/4850423.aspx

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有