名前

CG_Simplify — 主要な地物と Z/M 値を維持しつつジオメトリーの複雑さを減らします。

概要

geometry CG_Simplify(geometry geom, double precision threshold, boolean preserveTopology = false);

説明

SFCGAL の簡略化アルゴリズムを使ってジオメトリーを簡略化します。ジオメトリーの主要な特徴を保存しつつポイントや頂点の数を減らします。この関数は Z 値や M 値の保存もします。

アルゴリズムは制約付き三角分割を基にしていて、Z 値と M 値の保存のための追加操作を持つCGAL Polyline Simplification 2ライブラリを使っています。トポロジが保存され、ジオメトリーどうしがインタセクトしているとき、Z 値と M 値はインタセクトしているポイントで補間されます。

この関数は 3次元地形のようなジオメトリー (2.5次元) で動作しますが、壁のような垂直なサーフェス向けには作られていません。

Availability: 3.6.0 - SFCGAL >= 2.1.0が必要

このメソッドには SFCGAL バックエンドが必要です。

この関数は3次元に対応し、Z値を削除しません。

この関数はM値に対応します。

パラメータ

geom

入力ジオメトリー

threshold

簡略化に関する最大距離のしきい値 (ジオメトリーの単位)。この値が大きいほど結果ジオメトリーが単純になります。

preserveTopology

TRUE に設定すると、この関数はジオメトリーのトポロジを確実に保存します。このモードでジオメトリーがインタセクとするとき、インタセクとするポイントにおける Z 値と M値は補完値になります。デフォルト値は FALSE です。

返り値

Z 値と M 値を保存した簡略化されたジオメトリーが返ります。

この例ではポリゴンをしきい値 0.5で簡略化しています。

コード
SELECT CG_Simplify(
    'POLYGON((0 0,0 1,0.1 1,0.2 1,0.3 1,0.4 1,0.5 1,1 1,1 0,0 0))',
    0.5
  );
出力
POLYGON((0 0,0 1,1 1,1 0,0 0))
Geometry figure for visual-cg-simplify-01

トポロジーの保持によって、Z 値 M 値を持ちジオメトリータイプが混在しているコレクションでは、補助的な点が追加で保持されることがあります。

コード
SELECT CG_Simplify(
    'GEOMETRYCOLLECTION ZM(
      LINESTRING ZM(-1 -1 3 4,0 0 10 100,1 1 20 200,0 2 15 150,0 5 30 300,2 19 25 250,-4 20 15 150),
      POLYGON ZM((0 0 10 100,1 1 20 200,0 2 15 150,0 5 30 300,2 19 25 250,-4 20 15 150,0 0 10 100))
    )',
    2,
    false
  );
出力
GEOMETRYCOLLECTION ZM (LINESTRING ZM (-1 -1 3 4,2 19 25 250,-4 20 15 150),POLYGON ZM ((0 0 10 100,2 19 25 250,-4 20 15 150,0 0 10 100)))
Geometry figure for visual-cg-simplify-02

トポロジー保存の形式ではコレクションのインターセクトした部分にある共有基準点を維持します。

コード
SELECT CG_Simplify(
    'GEOMETRYCOLLECTION ZM(
      LINESTRING ZM(-1 -1 3 4,0 0 10 100,1 1 20 200,0 2 15 150,0 5 30 300,2 19 25 250,-4 20 15 150),
      POLYGON ZM((0 0 10 100,1 1 20 200,0 2 15 150,0 5 30 300,2 19 25 250,-4 20 15 150,0 0 10 100))
    )',
    2,
    true
  );
出力
GEOMETRYCOLLECTION ZM (LINESTRING ZM (-1 -1 3 4,0 0 10 100,2 19 25 250,-4 20 15 150),POLYGON ZM ((0 0 10 100,2 19 25 250,-4 20 15 150,0 0 10 100)))
Geometry figure for visual-cg-simplify-03

簡略化におけるトポロジー保存の有無の比較。閾値は 50とする。

コード
WITH data AS (
  SELECT ST_GeomFromText('GEOMETRYCOLLECTION(
    POLYGON((88.46 158.85,90.77 171.54,147.31 173.85,146.15 145,173.85 119.62,146.15 103.46,112.69 118.46,91.92 93.08,65.38 101.15,34.23 121.92,41.15 142.69,49.23 143.85,88.46 158.85)),
    POLYGON((112.69 118.46,146.15 103.46,190 60.77,185.38 43.46,126.54 26.15,83.85 28.46,67.69 64.23,43.46 58.46,10 83.85,34.23 121.92,65.38 101.15,91.92 93.08,112.69 118.46)))
  ') AS geom
)
SELECT geom AS input_geometry,
       CG_Simplify(geom, 50, true) AS topology_preserved,
       CG_Simplify(geom, 50, false) AS topology_not_preserved
FROM data;
出力
GEOMETRYCOLLECTION(POLYGON((88.46 158.85,90.77 171.54,147.31 173.85,146.15 145,173.85 119.62,146.15 103.46,112.69 118.46,91.92 93.08,65.38 101.15,34.23 121.92,41.15 142.69,49.23 143.85,88.46 158.85)), POLYGON((112.69 118.46,146.15 103.46,190 60.77,185.38 43.46,126.54 26.15,83.85 28.46,67.69 64.23,43.46 58.46,10 83.85,34.23 121.92,65.38 101.15,91.92 93.08,112.69 118.46))) | GEOMETRYCOLLECTION(POLYGON((88.46 158.85,147.31 173.85,146.15 103.46,112.69 118.46,34.23 121.92,88.46 158.85)), POLYGON((112.69 118.46,146.15 103.46,185.38 43.46,10 83.85,34.23 121.92,112.69 118.46))) | GEOMETRYCOLLECTION(POLYGON((88.46 158.85,173.85 119.62,34.23 121.92,88.46 158.85)), POLYGON((112.69 118.46,190 60.77,10 83.85,112.69 118.46)))
Geometry figure for visual-cg-simplify-04