2つのテーブル間のPostGISユニオン、属性を保持


8

私は、各シェイプの上位レベルと下位レベルの両方の名前を含む1つのPostGISテーブルを生成するような方法で、米国州レベルの上位レベルと下位レベルの政府境界を結合しようとしています。

以下の私の例でUは、はデータセットであり、行UAとを含む列がありUBます。L別のデータセットであるとありLALBLC。形状を結合すると、同じ形状になりますLが、結合されていない新しいデータセットには両方のデータ列があります。

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

編集:上記の私のサンプル画像はかなり下手です。これまでの回答は、ジオメトリが使用可能であると想定したデータのクエリに関連しています。これは重要ですが、私の質問のより混乱する部分をスキップしています。より良い例:

画像

黄色の形状はからU、オレンジの形状はからLです。それらは重なり合っていますが、ポリゴンの一部が別の形状内に完全に含まれていないことに注意してください(私の例ではLB、とLCは完全に内にありますUB)。

私が尋ねようとしたのは、2つのレイヤーを正しくチョッピングして、結果のデータセットに重複がないようにすることです。たとえば、このメーリングリストの投稿をご覧ください。


1
サイドコメント:ST_Union関数がこれとは逆の処理を行い(ESRIが「ディゾルブ」と呼び)、機能を溶かすため、これを操作のESRI用語である「ユニオン」と呼ぶと、PostGISの人々を混乱させます。ベンダー中立の用語は「オーバーレイ」かもしれません。
ポールラムジー

私の質問は、すでに質問され、かなりよく回答されたこの質問と非常に似ていると思います。
MagneticMonster

回答:


5

列名がわからないので、これが私の推測です。(私はテストする機会がなかったので、正確ではないかもしれません。)うまくいけば、私が使用した列名を推測できます。LがUのサブセットであると仮定します。

SELECT l.id AS l_id, u.ab AS uab, l.abc AS labc, ST_Intersection(u.geom, l.geom) AS geom
  FROM u, l
  WHERE ST_Intersects(ST_PointOnSurface(l.geom), u.geom);

2
これは正しいです。このアプローチのパフォーマンス調整については、gis.stackexchange.com / a / 31562/457も参照してください。
ポールラムジー

これは形状を生成したら完璧ですが、最初に結合された形状を作成する必要があります。私のサンプルの描画はこれを示すのに最適ではありませんが、最初にオーバーラップがないようにジオメトリをカットする必要があります。
MagneticMonster

SQLを十分に読まなかったと思います。共有領域だけで構成される新しい形状を生成しています。このクエリの出力には、重複する機能はありません。
Paul Ramsey

あなたは間違いなくポールです-私は以下のニクラスの答えにコメントするつもりだったと思います。
MagneticMonster

1

答えは、データがどれだけクリーンで一貫性があるかに依存します。テーブルLの重心がテーブルUの対応するポリゴン内にあると想定できる場合は、次のように記述できます。

SELECT * FROM U INNER JOIN L ON ST_Intersects(L.Centroid(geom),U.geom);

その後、あなたはあなたが望むものを手に入れるべきです。Lの重心の代わりにジオメトリ全体を使用すると、多くの奇妙な一致が得られます。

HTH

ニクラス


Centroid関数は、ポリゴン内にあるポイントを保証しないことに注意してください。ST_PointOnSurfaceにはあります。
2013年

@Scroあなたは絶対的に正しいです。私からのミス。
NicklasAvén2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.