PostGIS機能比較機能?


9

レイヤー1(ソース)のフィーチャーとレイヤー2(ソースの更新)のフィーチャーを比較して、フィーチャーのジオメトリや属性が変更されているかどうかを確認したいと思います。次に、何が変更されたかを示す「レポート」を生成させてください。

明確化のための編集:ジオメトリの変更には、新しいデータレイヤーに追加されたフィーチャの検索も含まれます。削除は面白いかもしれませんが、追加はより重要です。

私はPostGIS関数を調べてきましたが、ジオメトリと属性の両方の2つのレイヤーフィーチャ間の違いを比較して報告するように設計されたツールを見つけることができません。

ArcGISの「フィーチャ比較」ツールに似たものを探しています。

PostGISにこのようなものがない場合、これらのタイプの質問に答える他のオープンソースツールはありますか?ありがとう。


ある種のバージョン管理システムを使用する方が簡単ではないでしょうか?それとも、すでにこれらの2つのレイヤーがあり、今それらに対処する必要がありますか?
アンダーダーク

私がデータを所有または管理していないことを除いて、バージョニングを使用するほうが間違いなく簡単です。これは、四半期ごとの更新でさまざまな形式(通常はシェープファイル)で提供されるデータであり、更新間で変更された機能と属性を確認したいと思います。
RyanKDalton、2011

回答:


7

PostgreSQLでは、行コンストラクターを使用してごとの比較を行うことができます。これはジオメトリフィールドで機能すると思いますが、まだ試していません。

一致する機能のそれぞれに同じidフィールドがある2つのテーブルを考えると、次のようなことができます。

select ROW(t1.att1, t1.att2, t1.geom) = ROW(t2.att1, t2.att2, t2.geom)
from t1, t2
where t1.id = t2.id

更新:これは、私のテストではジオメトリフィールドで機能します。

更新2:条件に基づいたより完全な例を次に示します。

テーブル:t1(id、att1、att2、geom)t2(id、att1、att2、geom)

-- return the id and geometry from the updated table if the attributes or
-- geometry have changed or it's a new feature.

select t2.id, t2.geom
from t1, t2
where
  ( t1.id = t2.id and row(t1.att1, t1.att2, t1.geom) != row(t2.att1, t2.att2, t2.geom))
  or
  t2.id not in (select id from t1)

それであなたが探しているものが手に入るはずです。パフォーマンスを向上させるには、「not in」句を「not exist」に変更することをお勧めします。


これは、データセット(IDが1つのテーブルにのみ存在する場合)への追加または削除を無視しますか?
relet

1
質問では削除や追加については触れられていませんが、クエリを使って簡単に結合して、新しいものや削除されたものを見つけることができます。また、機能の違いで作業することもできます。
Sean、

ショーン、これは本当に有望に見える素晴らしいコンセプトです。1)これは同じ機能をすべて見つけますが、すべての変更をどのように見つけますか?2)変更されたフィーチャーをソースフィーチャーと視覚的に比較できるように、この結果を変更されたフィーチャー(形状)に結合するための最良の方法は何ですか?
RyanKDalton 2011

@Ryan:両方を検出します-同じIDのペアごとに行が同一(TrueまたはFalse)の場合に返されます。
2011

@Sean:私はこの作業に非常に近づいていますが、(ST_EQUALSの回答で使用したように)UNIONを実行してすべての新しいジオメトリを含めようとすると、それを機能させることができませんでした。ユニオンクエリに同じ数の行が必要でした。Row()= Row()は、ソースデータ(UNIONステートメントの一部)に存在しないブール型の列を作成します。そのため、UNIONクエリで「偽の」列を作成/参照して、ROW( )= ROW()selectステートメント?
RyanKDalton、2011

2

ST_Equals(geometryA, geometryB)それらが空間的に等しい場合、関数はTRUEを返します。


これは、二つの違いは何か、単に2つの特定の機能を?また、「空間的に等しい」とはどういう意味ですか?それは、それらが地球上の同じ点のセットを表すことを意味するのか、それとも、まったく同じ方法で同じ点のセットを表すことを意味するのですか?(後者はより厳格です。)
whuber

結果として私が本当に欲しかったのは、レイヤーB(オリジナル)以降に追加または変更されたレイヤーA(更新済み)のすべてのジオメトリです。私は次の構文でその結果を達成することができました:SELECT A.fields FROM A EXCEPT SELECT A.fields FROM A、B WHERE ST_EQUALS(A.geom、B.geom)。結果は、変更または追加されたレイヤーAのすべてのフィーチャジオメトリです。ありがとう!
RyanKDalton 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.