原文发布时间:2010-04-26
作者:毛毛虫
下面继续说一下转换器RasterExpressionEvaluator的用法。
下面讲一下设置条件的语法和应用:
条件语句if,例如if (A[0]>15, 100, 255),表示如果输入波段A[0]大于15,输出波段A[0]的值为100,否则为255。
示例一:颜色分类
使用可以对比单元格的简单条件来对颜色分类。如下图(google map):找出所有绿色单元格表示公园。
根据对数据的分析知道,满足绿色显示的条件是绿色波段与红色波段和蓝色波段的值大(这里设置为大于15)满足这个条件的单元格值为100,否则为255。条件语句为:if (A[1]-A[0]>15 && A[1]-A[2]>15, 100, 255),设置如图:
根据对数据的分析知道,满足绿色显示的条件是绿色波段与红色波段和蓝色波段的值大(这里设置为大于15)满足这个条件的单元格值为100,否则为255。条件语句为:if (A[1]-A[0]>15 && A[1]-A[2]>15, 100, 255),设置如图:
示例二:道路中心线提取
在转换器RasterExpressionEvaluator的用法(二)中提到道路中心线提取的例子,现在用RasterExpressionEvaluator转换器方法来处理,也跟上面的方法对比一下。原图(google map,png格式):
从前面的分析我们已经知道,白色道路的R、G和B相当接近,黄色道路的G波段很接近R波段,而蓝色波段要明显的小于B波段,根据这些条件来设置RasterExpressionEvaluator的条件语句:
if ((abs(A[0]-A[1])<=3 && abs(A[0]-A[2])<=3) || (abs(A[0]-A[1])<=4 && abs(A[0]-A[2])>10) , 0, 255)
也就是说,如果是灰色或黄色道路,波段赋值为0(黑色),否则为255(白色)。
转换后:
使用转换器RasterBandNodataSetter设置nodata值为255后,就可以利用RasterBandNodataSetter转换器来根据nodata值提取矢量多边形,转换的结果如下:
下面的处理过程(去除小多边形,平滑多边形等)与原来的处理过程相同。分别执行下两种方法,会发现第二种方法比第一种方法处理速度快的多。
示例三:变化监测
检查更新的影像的单元格的值是否与原始影像相同。
原始图像:1.png和2.png
把包含数据的单元格设置为200,转换器设置如下:
输出图的效果如下:
设置RasterExpressionEvaluator转换器(在A、B端口输入的影像的不重叠且A波段不为白色的部分设置为黑色,重叠部分保持原来的A的波段颜色)
从图中可以看到显示了两幅影像的所有波段部位255的部分,重叠部分黑色显示(黑色部分表示第二副比第一幅增加的部分):
设置RasterExpressionEvaluator转换器(在A、B端口输入的影像的不重叠且B波段不为白色的部分设置为黑色,重叠部分保持原来的A的波段颜色)
从图中可以看到显示了两幅影像的所有波段部位255的部分,重叠部分黑色显示(黑色部分表示第二副比第一幅增加的部分):
使用两次RasterInterpretationCoercer生成两个波段GREEN8和BLUE8
RasterBandCombiner组合这两个波段
使用RasterBandAdder添加一个RED8波段
最后使用RasterExpressionEvaluator重新排列波段
最后转换的结果图为:
经过上述步骤,就把两幅影像相同的部分、第二幅比第一份增加的部分、第二副比第二幅缺少的部分都表示出来了。
示例四:添加数据
当一个栅格提供一个特定层的信息,可以跟另一个栅格组合。本例中有两个栅格数据:一个是道路网(包含标注),如图(google map地图,png格式):
另一个栅格作为背景。
栅格地图中的,道路的相关单元格的分类应该考虑主要路线(黄色),标准道路(白色),各种道路的标注(有不同的颜色),如果单元格满足条件,我们可以从道路中提取,否则我们使用背景栅格。
在前面道路提取中,我们提到,白色道路的R、G和B相当接近,黄色道路的G波段很接近R波段,而蓝色波段要明显的小于B波段。在机场道路的注记栅格单元的特征是,如果绿色的值非常暗(小于100),那么在绿色和红色之间的不同应该大于6,否则大于20,基于这些条件提取道路和注记的条件语句为:
if((B[0]==B[1] && B[0]==B[2]) || (abs(B[0]-B[1])<=5 && (B[0]-B[2]>6 && B[0]<100) || (B[0]-B[2]>20 && B[0]>100)), B[0], A[0]);if((B[0]==B[1] && B[0]==B[2]) || (abs(B[0]-B[1])<=5 && (B[0]-B[2]>6 && B[0]<100) || (B[0]-B[2]>20 && B[0]>100)), B[1], A[1]);if((B[0]==B[1] && B[0]==B[2]) || (abs(B[0]-B[1])<=5 && (B[0]-B[2]>6 && B[0]<100) || (B[0]-B[2]>20 && B[0]>100)), B[2], A[2])
设置RasterExpressionEvaluator为:
转换后的图为:
部分放大后(由于两幅图的配准和影像的倾斜问题,可能没有完全重叠):