原文发布时间:2010-04-14
作者:毛毛虫
5、Nodata设置问题
在FME中,使用转换器RasterBandNodataSetter来设置或标识栅格数据集中的NODATA 值,使用RasterPaletteNodataSetter来设置或标识调色板的Nodata值,使用RasterBandNodataRemover转换器(这个转换器之前命名为RasterNodataRemover)移除栅格数的Nodata值。另外可以使用RasterCellValueReplacer转换器把一个范围设置为一个值,如果又把这个值设置为Nodata值,可以移除这个范围内的值。
如下例:
原图为:
重投影后,图示为:
在黑色部分单击任一单元格,信息显示如下:
可见黑色部分的值为Nodata值,使用RasterPaletteNodataSetter转换器进行设置后,上图显示为:
去除了黑边部分。
6、栅格化转换器ImageRasterizer
这个转换器是把输入的点、线和多边形要素转化为一个填充了背景色的栅格数据。这里单独提出来是要大家注意下,我在使用这个转换器时一直提示失败,后来发现在忽略了这个转换器后面的一句话:没有fme_color属性的要素会被丢弃。也就是说,使用这个转换器的时候,需要先用一个AttributeCreator转换器设置下fme_color属性,如下:
希望大家注意一下,不再犯我犯过的错误。
下面是上面提到的五部分的综合应用的两个例子。
例1:生成不规则图片
FME中是不能裁剪出不规则图片的,也就是说用不规则多边形裁剪栅格数据,得到的仍是矩形图片。
现有一幅图片:
我们想把下图绿色内的部分裁剪出来生成一个图片,
使用前面介绍过的Clipper方法,发现得到的图如下:
生成的图片是矩形的,没有图形的部分如何能生成不带黑边的图片?
为了熟悉转换器的使用,这里介绍两种方法:
A、用矢量叠加栅格的形式生成矢量来实现
根据给出的图片和给出的裁剪范围,使用DonutBuilder转换器生成一个环形多边形(带洞的多边形),如下(网格阴影部分):
只要给这个矢量赋值为白色(使用PenColorSetter),应用VectorOnRasterOverlayer转换器就可以达到需要的效果。
B、把矢量数据栅格化,融合影像实现
先提取栅格数据的编辑,使用不规则多边形进行裁剪,对裁剪出来的图形栅格化(ImageRasterizer),使用Sorter转换器进行排序,使得栅格化后的矢量数据后进入RasterMosaicker转换器(保证栅格化的矢量数据覆盖原来的栅格数据),再使用RasterMosaicker转换器进行镶嵌。注意,在镶嵌前需要一个对两个栅格数据使用RasterBandNodataSetter转换器设置下,否则执行镶嵌时候提示下列错误:
RasterMosaicker(RasterMosaicFactory): The band nodata value '255' of the selected band '1:0' does not match the band nodata value 'NULL' of the corresponding band in the mosaicked。
RasterBandNodataSetter转换器设置如下:
完成镶嵌后的效果如图:
再次使用RasterBandNodataSetter转换器就可以得到我们想要的图:
例2:影像更新示例
要更新的影像存在包含了旧影像的部分和较新的更高分辨率的影像。具体方法是:首先,使用SpatialFilter转换器选择被新影像覆盖的旧影像,然后用RasterMosaicker转换器把两幅影像镶嵌为一幅,并可以使影像有相同的分辨率(通过重采样,注意镶嵌之前保证新影像后进入RasterMosaicker转换器)最后使用Clipper把新影像裁剪出来单独存储。
由于没有找到合适的影像,图像不太清晰,希望大家谅解。
处理前的原影像:
需要更新的部分(图中部分有云区域):
使用SpatialFilter转换器中原图中选出需要更新的区域,再使用RasterMosaicker转换器镶嵌后的效果:
最后使用Clipper转换器从镶嵌的影像中裁剪出来,独立存储。