ST_Simplify — Douglas-Peukerアルゴリズムを使用して、簡略化したジオメトリを返します。
geometry ST_Simplify(geometry geom, float tolerance);
geometry ST_Simplify(geometry geom, float tolerance, boolean preserveCollapsed);
単純化したジオメトリの表現を計算します。Douglas-Peucker algorithm を使います。単純化の tolerance (許容値) は、距離の値で、単位は入力 SRS (空間参照系) の単位です。単純化によって、単純化された線の許容値距離内にある頂点は削除されます。入力が有効であっても結果が有効にならないことがあります。
この関数は、どの種類のジオメトリでも (GEOMETRYCOLLECTION であっても) 呼ぶことができますが、ライン要素とポリゴン要素だけが単純化されます。線ジオメトリの端点は保持されます。
preserveCollapsedフラグは、与えられた許容値では削除される小さいジオメトリを保持します。たとえば、10m許容値で1m長の線をたぬんかする場合にpreserveCollapsedがTRUEの場合には、このラインが消えることがありません。このフラグは、非常に小さい地物がマップから消えるのを防ぐために、地図描画目的の際に使います。
|
|
|
返されるジオメトリは単純性を喪失している場合があり (ST_IsSimple参照)、トポロジが保持されていないばあ外アリ、ポリゴンの結果が不正になる可能性があります (ST_IsValid参照)。トポロジを保全し、妥当性を確保するには、ST_SimplifyPreserveTopologyを使います。 |
|
|
|
この関数は、ポリゴン間で共有される境界は保持されません。保持するにはST_CoverageSimplifyを使います。 |
Availability: 1.2.2
中ぐらいの許容値で円を単純化すると八角形になり、許容値を大きくすると消えます。
SELECT ST_NPoints(geom) AS np_before,
ST_NPoints(ST_Simplify(geom, 0.1)) AS np01_notbadcircle,
ST_NPoints(ST_Simplify(geom, 0.5)) AS np05_notquitecircle,
ST_NPoints(ST_Simplify(geom, 1)) AS np1_octagon,
ST_NPoints(ST_Simplify(geom, 10)) AS np10_gone,
(ST_Simplify(geom, 100) is null) AS np100_geometrygoesaway
FROM (SELECT ST_Buffer('POINT(1 3)', 10, 12) As geom) AS t;
-[ RECORD 1 ]------------ np_before | 49 np01_notbadcircle | 33 np05_notquitecircle | 17 np1_octagon | 9 np10_gone | null np100_geometrygoesaway | t
ラインの集合の簡略化。ラインは簡略化後のインタセクトする場合があります。
SELECT ST_Simplify('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))'::geometry,
40);
MULTILINESTRING((20 180,50 100,170 120),(20 10,90 120),(90 120,130 130),(130 130,160 40,180 90,140 80),(50 40,80 70,50 40))
MULTIPOLYGONの簡略化。ポリゴンの結果は不正になることがあります。
SELECT ST_Simplify('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)))'::geometry,
40);
MULTIPOLYGON(((90 110,80 180,10 170,20 110,90 110)),((40 80,170 180,140 10,40 80),(180 70,142.5 128.5,90 60,180 70)))
ST_IsSimple, ST_SimplifyPreserveTopology, ST_SimplifyVW, ST_CoverageSimplify, Topology ST_Simplify