PostGISのリング自己交差


10

これは前の質問の続きです。私は新しいPostGISユーザーです。

データでトポロジの有効性を確認し、土地被覆(ポリゴン)データセットで約1700のトポロジの問題を見つけました。これらはすべて「Ring Self_intersection」です。

Paul Ramsayによるこのプレゼンテーション(20ページ)のいくつかの有用な情報を使用して、それに応じてデータをバッファーに入れようとしました。

UPDATE schema.data SET the_geom = buffer(the_geom、0.0)WHERE isvalid(the_geom)= false and isvalid(buffer(the_geom、0.0))= true;

しかし、私は応答を受け取ります:

通知:ポイントまたはその近くのリングの自己交差(編集)エラー:リレーション "sgm_buffer"の新しい行がチェック制約 "enforce_geotype_the_geom"に違反しています

**********エラー**********

エラー:リレーション "sgm_buffer"の新しい行がチェック制約 "enforce_geotype_the_geom"のSQL状態に違反しています:23514

私も試してみました:

UPDATE csgn.sgm_buffer SET the_geom = buffer(the_geom、0.0)

そして得る:

エラー:リレーション "sgm_buffer"の新しい行はチェック制約 "enforce_geotype_the_geom"に違反しています

**********エラー**********

エラー:リレーション "sgm_buffer"の新しい行がチェック制約 "enforce_geotype_the_geom"のSQL状態に違反しています:23514

それで、このバッファテクニックが私の問題で機能しないと思いますか?それとも私は何か間違ったことをしていますか?

ラムゼイ氏は同じ文書で、「8の数字」ポリゴンを処理するための追加の手法を提案しています。私はこれをコードで完全に書く方法(またはそれが何をしているか、そしてそれが私を助けるかどうか)を完全に理解していません:

SELECT ST_BuildArea(ST_Union( 'LINESTRING EMPTY'、ST_ExteriorRing( 'POLYGON((...))'

だから……誰でも手伝ってくれる?これは、PostGISにおける私の厳しいタイムスケールと限られたスキルで、実際の悪夢を証明しています。


1
「sgm_buffer limit 1からgeometry_type(the_geom)を選択する」は何を返しますか?また、他の質問で述べた40時間の実行時間に関連して、テーブルに空間インデックスが定義されていますか?
diciu

ST_Multi()すべてのポリゴンを強制的にMULTIPOLYGONsにする必要がある場合があります(これは想定です)
Mike T

コメントありがとう-diciu インデックスがあると思います、それらはpgAdminIIIに表示されているようですが、おそらく更新する必要がありますか?クエリを高速化するための解決策を見つけることができます-クエリを実行するのに適切な時間を知りませんか?Landcoverには約2000万の機能があります。
ESRIHelp 2011年

回答:


12

バッファリングすると、自己交差しているポリゴンがマルチポリゴンになると思います。

次の2つのオプションがあります。

1制約「enforce_geotype_the_geom」を削除します。これを行うには、pgAdmin
2を実行します。古いテーブルを更新する代わりに、新しいテーブルに結果を配置します。これは、元のテーブルの内容を変更しないため、多くの場合、良い方法です。クエリは次のようになります。

CREATE TABLE new_buffered_table as
SELECT ST_Buffer(the_geom,0.0) as the_geom, gid FROM original_table;

もちろん、新しいテーブルにフィールドを追加することもできます。

最初にバッファトリックを試してください。2番目のアプローチでは、Paulは空のラインストリングが何に影響するかを自分に伝えることができます。私はその魔法がどのように起こるのか覚えていません。


0

私は数ヶ月前に同じ問題を抱えていました。データベースに、自己交差が多いポリゴンがありました。Niklas Avenの方法を使用しましたが、うまくいきませんでした。他の方法も使用しました。

私の方法は、ポリゴンから自己交差を削除することです。これが私が使ったSQLクエリです:

     -- Create the new polygons 

SELECT ST_GeomFromText(polygone) as geom

   from (

    SELECT st_astext(ST_MakePolygon(linear)) as polygone

        from (
              SELECT st_astext
                ((ST_dump
                   (st_boundary
                      (ST_MakeValid
                     (ST_Transform
                        (ST_SETSRID
                           (geometry,4326),32631))))).geom) 
                          as linear from tables_name)
        as query2)

  as query1

where ST_area(polygone) > 1

ポリゴンと自己交差の面積を計算し、面積が1より大きいポリゴンのみを保持します。1自己交差の面積は非常に小さいため、許容値は1 です。度単位のデータがある場合、SRIDからメートルへの変換が重要であることにも注意してください。

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