首页 » 技术分享 » Generalizer函数及其算法简析

Generalizer函数及其算法简析

 

原文发布时间:2010-07-28

作者:毛毛虫

有四类可获得的方法;

1、概括化的算法(Generalizing algorithms),通过移除顶点减少坐标的密度。

2、平滑算法(Smoothing algorithms),确定每个顶点的新的位置。

3、测量算法(Measuring algorithms),计算点的位置,返回这些点的列表(例如,计算要素的弯曲度)。

4、拟合算法(Fitting algorithms),用适应指定线的新要素完全的替代初始几何,(例如,最小化对源的正交距离)

你所选择的算法决定了函数对话框中参数是否可用。

函数的属性如下:

参数

Preserve Shared Boundaries (保留共享边界)

No:每个要素都会被处理,各自概括化,不考虑邻近要素。如果原始的面要素组成一个覆盖范围,该范围会有空隙和重叠。如果想在做面边界概括时想保留这个覆盖范围,选择yes。

Yes:覆盖拓扑结构会在面边界概括时会保持不变。整个的面要素的覆盖范围必须是没有重叠。如果面要素有重叠,那么你应该选择No,或者先使用AreaOnAreaOverlayer来创建一个覆盖范围。在这些情况下,你也可以在之前、之后使用VERTEX 模式的Snapper或替代这个函数。

这个函数计算覆盖范围的拓扑,概括独立的弧,然后重新创建面要素。这个选项对于面会花费较长的时间,因为它计算弧/节点拓扑、概括独立的弧,然后重新创建面。

 

Generalization Tolerance

这个参数被所有四种概括算法所用。它用大地单位来计算(要素坐标的测量单位)。

Number of Wedges

楔形的数目:这个参数只用于Deveau算法。当在这个设置中围绕着这个点的浮动点带,它控制同时考虑存在的楔形的数目。这个值越大,在概括的过程中越积极。

Sharpness Angle

这个参数只用于Deveau算法。这个设置减弱尖峰容差。角的顶点小于从前面两个没有移动的点给出的值。这个角度用度来测量。

Number of Neighbors

这个参数指定了每个点考虑的邻近的数目。例如,一个值2指定了每个点左边的2个点和点自身。对于右边的两个点会被考虑。对于拐点算法,这个参数指定了会影响拐点计算的每边的邻点的数目。影响平滑线的数目越大,可能有较少的拐点。值0表示没有过滤。

Displacement Percentage

位移百分比:指定了原始的和平均点到移动点间的距离。例如,值50会放置在平均值和点的原始位置中间。

Weighting Power

这个参数只用于McMaster权重距离算法。它也用来确定每个邻近点的权重。

Degree of Basis Polynomial

这个参数指定了用于近似曲线的多项式的次数。

Segment Length

这个参数指定了输出线段的长度。如果设置为0,那么输出的曲线会是输入的点的数目十倍。

 

为了详细说明各个算法,我们使用下面数据为例来详细说明。

Generalizing Algorithms

Douglas(Generalize)

这种算法移除在概括容差内的引起偏离的点,但是其他点的位置不发生变化。

相关的参数:

Preserve Shared Boundaries

Generalization Tolerance

在Generalization Tolerance设置相同的情况下,Preserve Shared Boundaries设置为No时,得到的结果如下:

为了方便说明,我们截取两个面,可以看到产生了空隙和覆盖。


Preserve Shared Boundaries设置为Yes时,得到的结果如下:


Thin(Generalize)

这种算法从一个临近顶点移除了小于概括容差距离的顶点。起点和终点不能移动,除非要素的整个长度小于容差,这种情况会引起要素被最后一个坐标的点替代。

相关参数:
        Preserve Shared Boundaries 
        Generalization Tolerance  

在Generalization Tolerance设置相同的情况下,Preserve Shared Boundaries设置为No时,得到的结果如下:

下图中,灰色的边界始边界,红色的边界是使用第一种方法Douglas得出的结果,蓝色的是使用Thin 方法计算的结果,从图中可以看出,相同的容差设置下,Thin方法更接近原图。


Preserve Shared Boundaries设置为Yes时,日志如下,没有结果输出:

Generalizer_2_PolygonMaker(PolygonFactory): PolygonFactory 'PolygonFactory' rejected the following input feature, which is neither a line nor a polygon

Storing feature(s) to FME feature store file `mapping_log.ffs'

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Feature Type: `___lines___'

Attribute(32 bit integer): `__left__' has value `0'

Attribute(string)        : `__mypoly__' has value `2'

Attribute(32 bit integer): `__right__' has value `2'

Attribute(string)        : `fme_geometry' has value `fme_line'

Attribute(string)        : `fme_type' has value `fme_point'

Geometry Type: Point (1)

Number of Coordinates: 1 -- Coordinate Dimension: 2 -- Coordinate System: `Xian80.LL'

(109.014504747722,30.6463672791162)

===========================================================================

Generalizer_2_PolygonMaker(PolygonFactory): PolygonFactory 'PolygonFactory' rejected the following input feature, which is neither a line nor a polygon

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Feature Type: `___lines___'

Attribute(32 bit integer): `__left__' has value `0'

Attribute(string)        : `__mypoly__' has value `0'

Attribute(32 bit integer): `__right__' has value `2'

Attribute(string)        : `fme_geometry' has value `fme_line'

Attribute(string)        : `fme_type' has value `fme_point'

Geometry Type: Point (1)

Number of Coordinates: 1 -- Coordinate Dimension: 2 -- Coordinate System: `Xian80.LL'

(109.014504747722,30.6463672791162)

===========================================================================

提示输入的要素不是多边形或线,这是因为对于共享一条边界的多边形存在相同的点,这种算法在Preserve Shared Boundaries设置为Yes时,把该点作为一个输入要素,因此这种设置对于有相同边的要素不能处理。

 

ThinNoPoint

这种算法会从一个相邻的顶点移除小于概括的容差距离的顶点。起始点和终点不能移除,甚至要素的整个的长度小于容差情况下要素被连接起点和终点的线替代。

相关参数:
        Preserve Shared Boundaries 
        Generalization Tolerance 

这种算法与Thin算法的区别是当要素的整个长度小于容差的情况下,是被最后一个坐标替代还是被起点和终点连接的先替代。

这种算法在Preserve Shared Boundaries设置为Yes时,也会有输出:

Deveau(Generalize):

这种算法移除了对要素整体形状影响较小的点,可能会引入原来要素顶点外的新的顶点。这种算法内在的操作对顶点的Z坐标无效,没有任何度量。因此,输入要素永远是2D,没有度量(measure)。它需要楔形参数和锐角参数被指定。

相关参数:

  Preserve Shared Boundaries 
        Generalization Tolerance 
        Number of Wedges 
        Sharpness Angle 

黄色为原始图形,红色的为Number of Wedges设置为30的效果,蓝色的为Number of Wedges设置为5的效果。Number of Wedges越大,变形越小。

黄色的为原图,蓝色的是设置Sharpness Angle为75的结果,红色的是设置Sharpness Angle为15的结果


局部放大的效果如下(Sharpness Angle越大,可能的偏离越小):


Wang(Generalize):

这种算法将迭代的组合,消除和扩大弯曲,直到输入线要素没有弯曲小于给出的容差值。

相关参数:

  Preserve Shared Boundaries 
        Generalization Tolerance 

其中绿色的为原图,红色的为处理后的效果:

 

局部放大后的效果:


当把Preserve Shared Boundaries设置为yes是,可能得到的效果更明显(红色):


注意:当Generalization Tolerance设置的过大时,可能会出现如图所示的效果(红色为处理后的结果):


或者会提示:Generalize: Deleted 36 feature(s) that generalized to 0 points!

也就是消除输入要素的弯曲都在制定的容差内。

 

Smoothing Algorithms

McMaster

这种算法首先通过计算点的xy坐标和邻近点的平均值,对每个点计算一个新的位置。然后根据指定的位移值将点朝着原来的点滑动。总的影响是每个点向邻近的点拉近。

相关参数:

  • Preserve Shared Boundaries
  • Number of Neighbors
  • Displacement Percentage

紫色的为原图,蓝色的为Number of Neighbors设置为2Displacement Percentage设置为50的结果,红色的为Number of Neighbors设置为10Displacement Percentage设置为50的结果,绿色的为Number of Neighbors设置为10Displacement Percentage设置为20的结果,


McMaster Weighted Distance

这种算法执行与McMaster算法类似的操作,只是它使用反向距离权重来计算从每个临界点到该点移动的距离。整体的效果是较远的点比近处的点拉近的少。

这个权重参数只用于McMaster Weighted Distance算法。它用来确定每个临界点的权重。

注意:对于线,McMaster算法不改变第一个和最后N个点(这里N是邻近点的数目),因为它们对于平均算法没有足够的邻近元素。对于多边形,利用一个环绕来改变多边形的每个点。这种情况的邻接多边形和Preserve Shared Boundaries选项,边界的共线部分会一起平滑。保留的部分的边界会被平滑为线。这意味着没有环绕用于邻接多边形。

相关参数:

  • Preserve Shared Boundaries
  • Number of Neighbors
  • Displacement Percentage
  • Weighting Power

与前几种算法不同的是,对于共享边界也会进行处理,如下图:


放大到红色标识的位置,如图显示(蓝色为处理前的图形,红色为处理后的结果):


如下图:Number of Neighbors Displacement Percentage设置相同,黄色为原图,蓝色为Weighting Power设置为0的结果,绿色为Weighting Power设置为2的结果,红色为Weighting Power设置为4的结果,Weighting Power越大越接近原图。


NURBfit

这种算法是与用给出的多项式次数的B样条弯曲(B-Spline curves)来拟合直线。这个结果线会遵从下面这些给出的线段长度。次数越多,线越平滑。

相关参数:

Preserve Shared Boundaries

Degree of Basis Polynomial

Segment Length

蓝色的为原图,红色的为Degree of Basis Polynomial 设置为100的效果,绿色的为Degree of Basis Polynomial 设置为200的效果。


与前面的算法不同的是,得到的结果可能比原来的点要得多,比如上面的设置中,原始图形的点为6903 ,处理后的点为205771。如果Segment Length被设置为0,得到的结果图形的点事原始图形的十倍,此例中位69030

 

Measuring Algorithms

Inflection Points

这种算法会计算沿着线的拐点,返回这些点的列表。拐点由线的弯曲来计算。

相关参数:

  • Number of Neighbors

如下图(红色的是原图,蓝色的是处理后的效果):


处理后的结果是拐到的列表:



Fitting Algorithms

拟合算法完全取代原有的几何形状,以崭新的几何拟合到指定的行(例如到原始几何的最小正交距离),目前所用的算法是

Orthogonal Distance Regression(正交距离回归)

没有参数。


转载自原文链接, 如需删除请联系管理员。

原文链接:Generalizer函数及其算法简析,转载请注明来源!

0