PostGIS-Funktionsvergleichsfunktion?

9

Ich möchte in der Lage sein, Features in Schicht 1 (Quelle) mit Features in Schicht 2 (Aktualisierungen der Quelle) zu vergleichen, um festzustellen, ob sich die Geometrie und / oder Attribute von Features geändert haben. Ich hätte dann auch gerne einen "Bericht" erstellt, der angibt, was sich geändert hat.

Zur Verdeutlichung bearbeiten: Änderungen in der Geometrie umfassen auch das Suchen von Features, die der neuen Datenebene hinzugefügt wurden. Löschungen mögen interessant sein, aber Ergänzungen sind wichtiger.

Ich habe die PostGIS-Funktionen durchgesehen und kann anscheinend keine Tools finden, mit denen Unterschiede zwischen zwei Ebenen-Features, sowohl Geometrie als auch Attribute, verglichen und gemeldet werden können.

Ich suche etwas Ähnliches wie das ArcGIS- Tool " Feature Compare ".

Wenn es in PostGIS nichts Vergleichbares gibt, gibt es andere Open-Source-Tools, die diese Art von Fragen beantworten? Vielen Dank.

RyanKDalton
quelle
Wäre es nicht einfacher, ein Versionsverwaltungssystem zu verwenden? Oder haben Sie diese beiden Schichten bereits und müssen sich jetzt damit befassen?
underdark
Es wäre definitiv einfacher, die Versionierung zu verwenden, außer dass die Daten nicht Eigentum von mir sind oder von mir verwaltet werden. Es handelt sich um Daten, die in vierteljährlichen Aktualisierungen in verschiedenen Formaten (normalerweise Shapefiles) bereitgestellt werden, und ich möchte herausfinden, welche Funktionen und Attribute sich zwischen den Aktualisierungen geändert haben.
RyanKDalton

Antworten:

7

Sie können in PostgreSQL zeilenweise Vergleiche mit Zeilenkonstruktoren durchführen . Ich vermute, dass dies mit Geometriefeldern funktionieren würde, aber ich habe es nicht versucht.

Bei zwei Tabellen, in denen die übereinstimmenden Funktionen jeweils dasselbe ID-Feld haben, können Sie Folgendes tun:

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

Update: Dies funktioniert in meinen Tests mit Geometriefeldern.

Update 2: Hier ist ein vollständigeres Beispiel, das auf Ihren Kriterien basiert.

Tabellen: 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)

Das sollte dir das bringen, wonach du suchst. Sie sollten wahrscheinlich die 'not in'-Klausel in' not exist 'ändern, um eine bessere Leistung zu erzielen.

Sean
quelle
Das würde jegliche Hinzufügungen oder Löschungen zum Datensatz ignorieren (wobei eine ID nur in einer Tabelle vorhanden ist), nicht wahr?
Relet
1
In der Frage werden keine Löschungen oder Ergänzungen erwähnt, aber Sie können dies leicht mit einer Abfrage verknüpfen, um neue oder gelöschte zu finden. Sie können auch den Unterschied zwischen den Funktionen untersuchen.
Sean
Sean, das ist ein großartiges Konzept, das wirklich vielversprechend aussieht. 1) Dadurch werden alle Funktionen gefunden, die gleich sind. Wie würde ich alle Änderungen finden? 2) Was wäre die beste Methode, um dieses Ergebnis wieder mit den geänderten Features (Geometrien) zu verknüpfen, damit Sie die geänderten Features visuell mit den Quell-Features vergleichen können?
RyanKDalton
@Ryan: Es werden beide gefunden - es sollte zurückgegeben werden, wenn die Zeilen für jedes Paar identischer IDs identisch sind (True oder False).
Relet
@ Sean: Ich bin so nah dran, diese Arbeit zu machen, aber als ich versuchte, eine UNION (wie ich sie in der ST_EQUALS-Antwort verwendet habe) zu erstellen, um alle neuen Geometrien einzuschließen, konnte ich sie nicht zum Laufen bringen, weil ich es sagte brauchte die gleiche Anzahl von Zeilen in meiner Gewerkschaftsabfrage. Row () = Row () erstellt eine boolesche Spalte, die in meinen Quelldaten nicht vorhanden ist (Teil der UNION-Anweisung). Wie kann ich also eine "gefälschte" Spalte in meiner UNION-Abfrage erstellen / referenzieren, die mit der ROW übereinstimmt ( ) = ROW () Anweisung auswählen?
RyanKDalton
2

Die Funktion ST_Equals(geometryA, geometryB)gibt TRUE zurück, wenn sie räumlich gleich sind.

Pablo
quelle
Vergleicht dies zwei Schichten oder nur zwei spezifische Merkmale ? Was bedeutet "räumlich gleich"? Bedeutet dies, dass sie dieselbe Menge von Punkten auf der Erde darstellen, oder bedeutet dies, dass sie dieselbe Menge von Punkten auf genau dieselbe Weise darstellen ? (Letzteres ist strenger.)
whuber
Als Ergebnis wollte ich unbedingt alle Geometrien in Ebene A (aktualisiert), die seit Ebene B (Original) hinzugefügt oder geändert wurden. Ich konnte dieses Ergebnis mit der folgenden Syntax erzielen: SELECT A.fields FROM A EXCEPT SELECT A.fields FROM A, B WHERE ST_EQUALS (A.geom, B.geom). Das Ergebnis sind alle Feature-Geometrien aus Ebene A, die geändert oder hinzugefügt wurden. Vielen Dank!
RyanKDalton