原文发布时间:2010-04-20
作者:毛毛虫
这个例子是一个中心线提取示例:
对于一些相当好的栅格类型(或并不是十分糟糕的栅格)例如,使用GIS包从矢量数据产生的栅格。如果源矢量数据丢失,我们可以尝试矢量化栅格数据。
下面是一个Google Maps图片(png格式):
下面是提取道路的过程,如下:
使用转换器RasterCellCoercer把栅格转换为点图层,使用PointOnRasterValueExtractor提取栅格单元格的相关波段信息,后面连续添加三个ListIndexer、AttributeCopier转换器,
设置如下:
提取R、G、B三个波段的信息。
通过对源栅格数据中的分析,得出道路点(灰色)的R、G和B相当接近,我们使用ExpressionEvaluator转换器设置下列表达式来判断:
(abs(@Value(_red)-@Value(_green))<=3?1:0)&&(abs(@Value(_red)-@Value(_blue))<=3)?1:0
这个表达式的意思是G和B波段跟R波段相差小于等于三时结果为1,否则结果为0。
提取出道路(带有道路标注)的图示为:
类似的得出黄色道路(这个表达式是说对于黄色的部分,G波段很接近R波段,而蓝色波段要明显的小于B波段)计算的表达式为:
(abs(@Value(_red)-@Value(_green))<=4?1:0)&&(abs(@Value(_red)-@Value(_blue))>20)?1:0
提出黄色道路的图为:
两类道路叠加后的图为:
通过上面步骤,我们保留了道路和一些黑色的道路标注。
然后根据原来的单元格大小,把单元格生成的点转换为方形(这一部分以及下面关于生成轮廓线、平滑等问题在前面的相关文章中已经说明,不再详述)。
使用Dissolver融合内部的边界生成一个连续的覆盖区域。使用DonutHoleExtractor 提取后外部轮廓和内部的小多边形后,根据AreaCalculator计算的结果删除很小的面,使用DonutBuilder去除内部的小多边形,再用Generalizer转换器平滑,此时的图为:
再使用CenterLineReplacer转换器提取道路的中心线,再用Deaggregator分解聚类后的图为:
平滑后,与原来的栅格数据叠加效果如下:
为了达到更好的效果,可以使用MRF2Dcleaner转换器来减少悬线,使效果更好。
这种方法也可以用于根据区域的颜色提取区域。
本篇主要讲的是一个根据ExpressionEvaluator转换器来进行栅格数据转矢量的例子,下面文章中会提到使用转换器RasterExpressionEvaluator的做法。
待续…………
针对回复的十字路口问题的贴图: