Geometry von 2 Tabellen vergleichen

Hi,
Ich habe jeweils in seperaten Tabellen Klassifikationen einer Satellitenbildszene zu 2 unterschiedlichen zeitpunkten gespeichert (2004 / 2005) und möchte alle Gebäude finden, welche 2005 neu sind.
Dafür hab ich mit ST_Overlaps (tab1.geom, tab2.geom) die Objekte aus 2005 selektiert welche sich mit denen von 2004 überlappen inklusive der gid. Das geschieht alles in einer “derived” table.
Dann selektiere ich aus 2005 alle gebäude inklusive der gid und will die selektieren welche ungleich sind mit denen aus der “derived table” -> die gebäude die sich überlappen. Dafür vergleiche ich die gid.

In diesem Fall bekomme ich aber alle Gebäude aus 2005 (insgesamt 137). Insgesamt überlappen sich 95, daher sollte ich eigentlich aus dem querry 137 - 95 objekte kriegen, was aber nicht der Fall ist.

Zu beginn hab ich es mit ST_Disjoint probiert was aber icht funktioniert hat.

Hier ist der Syntax von meinem Statement,

SELECT 
DISTINCT ab.gid, ab.class, ab.the_geom
FROM
(SELECT * FROM ara05 WHERE class = 'buildings') AS ab,
(SELECT ara05.the_geom, ara05.class, ara05.gid FROM ara04, ara05 WHERE ST_Overlaps(ara04.the_geom, ara05.the_geom) 
AND ara04.class = 'buildings' AND ara05.class = 'buildings') AS overlap
WHERE
ab.gid <> overlap.gid

ich hoffe jemand kann mir helfen!

Stimmen denn die SRIDs, bzw sind sie vorhanden?
Was bekommst du denn als Ergebnis der Abfrage?
Gruß Uwe

hallo uwe,

Die srid sind noch nicht gesetzt. Das wäre jetzt mein nächster Schritt gewesen um es zu probieren.

Zu dem was ich als Ergebniss bekomme:
Ich habe 2 Tabelle für die Klassifikationen von 2004 und 2005, beide haben momentan keine srid.
Um von einem großen SQL statement wegzugehen habe ich das ganze mal Schritt für Schritt versucht.
Zunächst habe ich 2 neue, temporäre Tabellen erstellt. “buildings_05” beinhaltet alle Gebäude von 2005, insgesamt 137.
Und eine weitere Tabelle “overlap_04_05”, welche die Gebäude aus 2005 beinhaltet, die gleich sind mit denen aus 2004 (siehe SQL Statement). Insgesamt sind das 95.

Wenn ich jetzt das statement setze:
“zeige mir alle gebäude aus den gesamten in 2005 wo die gid gleich ist mit den gebäuden die 2004 auch schon da waren” bekomme ich tatsächlich 95.
Wenn ich die Abfrage umdrehe bekomme ich 137 und nicht 32.
Ich habe es probiert mit Vergleichsoperator ("=", “<>”) und der “IN” Funktion. Ich krieg bei beiden Methoden das gleiche ergebniss.

Die Overlap Funktion funktioniert aber soweit ich das sehe. Ich habe die beiden Tabellen als shp exportiert und in ein GIS geladen. Das Ergebnis hat gestimmt! Daher glaube ich nicht, dass es an der srid liegt sondern eher an der gid.

Das mit der SRID war nur eine Vermutung, früher gabs einige Probleme bei verschiedenen Vergleichen, wenn die nicht da war. Wies im Moment aussieht weiß ich noch nicht, da ich erst seit 3 Tagen das 1.3.2 hab und noch nicht dazu gekommen bin mich damit eingehender zu beschäftigen.

Aber mal ne logische Frage: Suchst du Gebäude, deren ‘Umriss’ sich geändert hat aber nicht die ID, oder nur den neuen Datenbstand, also neue Gebäude mit eine neuen ID, die vorher nicht dabei war? Sorry, wenn ich etwas aufm Schlauch steh…

gruß Uwe

Ich suche die Gebäude die vorher noch nicht da waren!

Es handelt sich hierbei um eine objektorientierte Klassifikation! Daher kann es sein, dass sich die Objekte in ihrem Umriss geändert haben aber in ihrer Klassifikation nicht. Ich Hab daher auch nach der Überlappung bzw. nicht Überlappung gesucht und nicht nach den Gebäude die “genau den gleichen umriss haben”.

Man könnte natürlich auch mit einer Distanzrechnung an das Problem herangehen. Ich denk das werde ich mal als nächstes Probieren.

lg

Hast du schon ST_Equals oder den Operator ‘~=’ ausprobiert?

Also etwa so:

select t1.gid, t1.the_geom 
        from tab_2005 t1 left join tab_2004 t2 on (t1.gid==t2.gid) 
        where not (t1.the_geom ~= t2.the_geom)

Ohne Gewähr so kurz vor Feierabend… :wink:

Gruß UWe

hallo uwe,

Ich hab mein Problem gelöst! Danke für deine Hilfe.
Bei ST_Overlap bekommt man entweder True oder False zurück. Dabei vergleicht er Objekt für Objekt und schaut ob die sich überlappen z.B.

objekt 1 - objekt 2 - überlappung F
objekt 1 - objekt 3 - überlappung F

Daher hab ich auch so eine Lange Tabelle als Resultat bekommen wenn ich nach “FALSE” selektiert hab. Ich hab es jetzt mit folgendem Sql statment gelöst:

DELETE FROM 
ara05_buildings
WHERE EXISTS
(
    SELECT
    overlap_id.gid_2005
    FROM
        (
        SELECT
        DISTINCT buildings05.gid AS gid_2005
        FROM
            (SELECT * FROM ara05 WHERE class = 'buildings') AS buildings05,
            (SELECT * FROM ara04 WHERE class = 'buildings') AS buildings04
        WHERE
        ST_Overlaps(buildings05.the_geom, buildings04.the_geom) = 't'
        ) 
        AS overlap_id
    WHERE
    overlap_id.gid_2005 = ara05_buildings.gid
);

lg