Name

ST_SimplifyPreserveTopology — Douglas-Peuckerアルゴリズムを使用して、単純化した妥当なジオメトリを返します。

Synopsis

geometry ST_SimplifyPreserveTopology(geometry geom, float tolerance);

説明

Douglas-Peucker algorithmの一種を用いて単純化したジオメトリを計算します。結果のトポロジが入力と同じになるように単純化を制限します。簡略化のtolerance (許容値)は距離値で、単位は入力SRSの単位です。簡略化によって、トポロジが保持される限り、簡略化された線の許容距離値内の頂点が削除されます。入力が妥当かつ単純な場合には、結果は妥当かつ単純です。

この関数は、どの種類のジオメトリ (GEOMETRYCOLLECTIONも含む)を引数にとっても呼ぶことができますが、ラインとポリゴン要素だけを単純化します。結果はリングの数は同じで、入力が相互にインタセクトしていないなら結果も相互にインタセクトしません。線ジオメトリの端点は保持されます。

[Note]

この関数は、ポリゴン間で共有される境界は保持されません。保持するにはST_CoverageSimplifyを使います。

GEOSモジュールで実現しています。

Availability: 1.3.3

ST_Simplifyと同じ例で、ST_SimplifyPreserveTopologyでは過単純化を防止します。円は少なくとも四角形にはします。

SELECT  ST_Npoints(geom) AS np_before, 
        ST_NPoints(ST_SimplifyPreserveTopology(geom, 0.1)) AS np01_notbadcircle, 
        ST_NPoints(ST_SimplifyPreserveTopology(geom, 0.5)) AS np05_notquitecircle,
        ST_NPoints(ST_SimplifyPreserveTopology(geom, 1))   AS np1_octagon, 
        ST_NPoints(ST_SimplifyPreserveTopology(geom, 10))  AS np10_square,
        ST_NPoints(ST_SimplifyPreserveTopology(geom, 100)) AS np100_stillsquare
FROM (SELECT ST_Buffer('POINT(1 3)', 10,12) AS geom) AS t;

 np_before | np01_notbadcircle | np05_notquitecircle | np1_octagon | np10_square | np100_stillsquare
-----------+-------------------+---------------------+-------------+-------------+-------------------
        49 |                33 |                  17 |           9 |           5 |                 5

非交差ラインのトポロジを保全した、ラインの集合の単純化を行います。

SELECT ST_SimplifyPreserveTopology(
  'MULTILINESTRING ((20 180, 20 150, 50 150, 50 100, 110 150, 150 140, 170 120), (20 10, 80 30, 90 120), (90 120, 130 130), (130 130, 130 70, 160 40, 180 60, 180 90, 140 80), (50 40, 70 40, 80 70, 70 60, 60 60, 50 50, 50 40))',
    40);

外側リングと内側リングのトポロジを保全したMULTIPOLYGONを単純化します。

SELECT ST_SimplifyPreserveTopology(
  'MULTIPOLYGON (((90 110, 80 180, 50 160, 10 170, 10 140, 20 110, 90 110)), ((40 80, 100 100, 120 160, 170 180, 190 70, 140 10, 110 40, 60 40, 40 80), (180 70, 170 110, 142.5 128.5, 128.5 77.5, 90 60, 180 70)))',
    40);