等値線をpostgisで等値ポリゴンに変換する方法は?


9

私は次のように定義されたisolinesのpostgisテーブルを持っています:

CREATE TABLE myisolines
(
  gid serial NOT NULL,
  isotime timestamp without timezone,
  val numeric(10,4),
  geom geometry(LineString,4326)
);

視覚的には、このラインストリングオブジェクトは次のようになります。

ここに画像の説明を入力してください

データの空間範囲がわかっているので、Bboxを追加して、LineStringを閉じているようにすることができます。

ここに画像の説明を入力してください

重複しないが連続したサーフェスを作成し、ポリゴンが形成された最低の等値線を持つ列を持つ、ポリゴンmyisopolygonsを含むmyisolinesテーブルから、アイソポリゴンのテーブルを作成します。セルフクローズドアイソライン(アイランド)またはbboxでクローズされたアイソラインから形成できることを理解しています。その場合、その特定のアイソラインからを取得する必要があります。視覚的には次のようになります。valvalval

ここに画像の説明を入力してください

どういうわけかトポロジーを作ってから面をポリゴンに変換できると思ったのですが、どうしたらいいのかわかりません。これはどのように行うことができますか?

もう1つのオプションは、bboxと作成された各ポリゴンの間の差分関数を再帰的に使用することですが、これは正しい方法ではなく、まったく高速ではありません。


ST_SplitまたはST_BuildAreaは問題の良い候補です
ニックス

回答:


3

これはを使用したソリューションST_Polygonizeです。境界ごとにポリゴンを生成し、ポリゴンでカバーされる最小および最大の標高を提供します。アルゴリズムは、ピークとうつ病を区別できず、これらの場合、最小値と最大値の両方で同じ高度を返します。

WITH closed_contours AS (
    SELECT 
      ST_Union(geom) AS geom 
    FROM 
      (SELECT geom FROM contours 
       UNION ALL 
       SELECT ST_SetSRID(ST_Boundary(ST_Expand(ST_Extent(geom), -1e-10)), 4326) 
       FROM contours) 
sq)

SELECT
  poly_id, 
  min(polys.geom) AS geom, 
  min(elevation)  AS min_elev, 
  max(elevation)  AS max_elev
FROM
  (SELECT row_number() OVER () AS poly_id, geom FROM
      (SELECT 
         (ST_Dump(ST_Polygonize(geom))).geom
       FROM closed_contours) dump
  ) polys
INNER JOIN contours ON ST_Intersects(polys.geom, contours.geom)
GROUP BY poly_id;

WITHクエリの句は、既存の等高線のわずかに縮小された範囲でそれらを結合することによって、開いている等高線を「閉じます」。(範囲はST_Extent、単精度ボックスを生成するの使用から生じるすべての丸め誤差を洗い流すように縮小されます。これは、ST_Polygonize完全精度で閉じられ、ノード精度でノード化された入力を必要とします)。輪郭が既に閉じている場合(つまり、アイランドで作業している場合)、この手順は省略できます。


0

私はあまり経験がありませんが、関数geometry ST_MakePolygon(geometry outerlinestring、geometry [] interiorlinestrings);を試してみます。


それは実際には質問に完全に答えるものではありません。
John Powell、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.