FME中的栅格数据操作之八——转换器RasterExpressionEvaluator的用法(四)

原文发布时间:2010-04-26

作者:毛毛虫

示例五:半透明设置

如图:


其原理是在输入端口A的栅格数据中添加输入端口B的栅格数据,B数据所占的百分比越少,透明度越高。

如下两个数据,A端口的输入数据:


B端口的输入数据:


设置下列条件,if(B[0]==0,A[0],A[0]+B[0]/2);if(B[1]==0,A[1],A[1]+B[1]/2);if(B[2]==0,A[2],A[2]+B[2]/2),得到的图如下:


 设置条件如下,if(B[0]==0,A[0],A[0]+B[0]/10);if(B[1]==0,A[1],A[1]+B[1]/10);if(B[2]==0,A[2],A[2]+B[2]/10),得到的图如下:


在做这个例子时,发现一个问题,提醒大家一下。我处理过程中,我设置了一下nodata值,结果转换失败,日志提示:

RasterExpressionEvaluator(RasterEvaluationFactory): Some bands used in expression 0 have a nodata value and some bands do not.  Please ensure that all bands used in an expression have the same nodata value, or all bands used in an expression have no nodata value

A fatal error has occurred. Check the logfile above for details

也就是说,波段的nodata值不同是,RasterExpressionEvaluator转换器不能执行,要么保证所有的nodata值相同,要么删除所有的nodata值。

 

下面说一下在RasterExpressionEvaluator转换器中表达属性值的语法:

A:attribute_name,如A:i表示A数据的i属性。

下面是这一用法的一个说明示例,设置一个属性值i(初值为10,递减至0),根据i值做一个循环,结合上面提到的透明度的设置,达到又A数据渐变到B数据的效果。


使用Creator转换器创建一个Null类型的几何对象后,自定义一个转换器。

首先设置一个属性i,赋值为10;使用两个RasterReader转换器,从指定的格式和数据集中读取和输出栅格要素,设置如下:

    

 使用RasterExpressionEvaluator,设置条件语句如下(这里有四个波段,前三个波段都用到了表达属性的语法,结合透明度的设置来看这个条件表达式):

(A[0]*A:i/10.0 + B[0]*((11-B:i)/10.0));(A[1]*A:i/10.0 + B[1]*((11-B:i)/10.0));(A[2]*A:i/10.0 + B[2]*((11-B:i)/10.0));if(A[3]==0 || B[3]==0,0,255)


转换器ExpressionEvaluator和Tester联合设置循环条件



 添加一个循环的输出,该自定义转换器如下:


输出的图片如下:


下面是一个综合应用RasterExpressionEvaluator转换器的例子。

高程分区方案:这个例子是根据高程值进行分区,用不同的颜色表示。

用到的了两个数据,数字化DEM栅格和彩色RGB栅格,根据端口B输入的DEM数据的高程分类,来修改在端口A的输入的RGB数据中的栅格的显示颜色,DEM数据如下:


输入的RGB数据如下:


对RGB数据,海蓝色部分的属性为: RED8: 153, GREEN8: 179,BLUE8: 204

保留海蓝色的部分,其余设置为灰色,条件语句为:

if(A[0]==153 && A[1]==179 && A[2]==204, A[0], 0.2989*A[0] + 0.5870*A[1] + 0.1140*A[2]);if(A[0]==153 && A[1]==179 && A[2]==204, A[1], 0.2989*A[0] + 0.5870*A[1] + 0.1140*A[2]);if(A[0]==153 && A[1]==179 && A[2]==204, A[2], 0.2989*A[0] + 0.5870*A[1] + 0.1140*A[2])


对于DEM数据,先设置一个属性_height,根据这个_height(例如赋值50)属性在RasterExpressionEvaluator中对高程进行分类:


条件语句为,if(A[0]==0,0,A[0]/A:_height+1),因为设置的DEM数据为整数型,这个语句说明如果高度为0则保留0值,高度在1到50设置A[0]的值为1,51到100设置A[0]的值为2,以此类推,得到的DEM数据如下:


注意在这两个数据应用RasterExpressionEvaluator转换器合成一个之前,要使用转换器RasterResampler进行重采样,否则转换失败,日志提示如下:

RasterExpressionEvaluator_2(RasterEvaluationFactory): Raster A has '812' rows and '1267' columns, whereas raster B has '235' rows and '549' columns.  Paired rasters must have the same dimensions

A fatal error has occurred. Check the logfile above for details

RasterExpressionEvaluator要求进行匹配的数据像素相同。

在这个把两个栅格数据合成一个的ExpressionEvaluator转换器中 ,根据存储在栅格B(被分类的DEM)存储的分区值,修改栅格A(道路地图)的R和G波段。对于DEM分区1和2,增加绿色波段(绿色);对于DEM分区3和4,增加红色和绿色波段(黄色);对于DEM分区大于4的,增加红色波段(红色)。表达式为:

if(B[0]<=2,A[0], if(B[0]==3 || B[0]==4, A[0]*1.1, if(B[0]==5 || B[0]==6, A[0]*1.3, A[0]*1.5)));if(B[0]==0 || B[0]==5 || B[0]==6, A[1], if(B[0]==1 || B[0]==2,A[1]*1.3, if(B[0]>=7, A[1]/1.1, A[1]*1.1)));A[2]

执行的结果如下:











猜你喜欢

转载自blog.csdn.net/fmechina/article/details/80856032