Problem mit ST_CONTAINS

Hallo zusammen,

ich bin noch sehr unerfahren mit Datenbanken und arbeite mich erst seit kurzer Zeit ein und komme nun bei einem Problem nicht mehr weiter:
Für ein kleines GIS-Projekt habe ich nun einen quadratischen Buffer um vorhandene Punktkoordinaten erstellt (Statement N°1) und möchte weiter eine VIEW ertellen in welcher mir die Punkte der Arealstatistik Schweiz (ein “Punktgitter” wobei alle 100m in x- und y-Richtung ein Punkt liegt), welche innerhalb des entsprechenden Buffers sind, ausgespuckt werden (Statement N°2).

  • Die VIEW wird ohne Fehlermeldung erstellt, jedoch sind, ausser den gewünschten Spaltennamen, keine Daten da.

Ich versuchte dann noch einfach eine Abfrage mit ST_CONTAINS zu erstellen (Statement N°3). Das Statement scheint korrekt zu sein und eigentlich das gleiche machen wie beim erstellen der VIEW (?), jedoch läuft die Abfrage nach 15min. immer noch.

Vielleicht spielt es auch noch eine Rolle, dass die Bufferquadrate sich teilweise überlappen?
Wenn mich da irgendwer aufklären kann, was ich falsch mache, bin ich sehr dankbar für eure Hilfe!

Liebe Grüsse,
Sevi




Statement N°1:
ALTER TABLE public.Koordinaten_fallen_2056

ADD COLUMN Buffer_100m geometry,
ADD COLUMN Buffer_200m geometry,
ADD COLUMN Fitting_rectangle_400m2 geometry,
ADD COLUMN Fitting_rectangle_1600m2 geometry;

UPDATE public.Koordinaten_fallen_2056
SET Buffer_100m = ST_BUFFER (geom,100);

UPDATE public.Koordinaten_fallen_2056
SET Buffer_200m = ST_BUFFER (geom,200);

UPDATE public.Koordinaten_fallen_2056
SET Fitting_rectangle_400m2 = ST_ENVELOPE (Buffer_100m);

UPDATE public.Koordinaten_fallen_2056
SET Fitting_rectangle_1600m2 = ST_ENVELOPE (Buffer_200m);

Statement N°2:
CREATE VIEW Fallenstandorte_mit_Arealstatistik AS

SELECT
public.Koordinaten_fallen_2056.survyear,
public.Koordinaten_fallen_2056.x,
public.Koordinaten_fallen_2056.y,
public.Koordinaten_fallen_2056.fitting_rectangle_400m2,
public.area_noas04_2056.as85r_72,
public.area_noas04_2056.as97r_72,
public.area_noas04_2056.as09_72

FROM
public.area_noas04_2056,
public.Koordinaten_fallen_2056

WHERE ST_CONTAINS (public.Koordinaten_fallen_2056.fitting_rectangle_400m2, public.area_noas04_2056.geom)

Statement N°3:SELECT ST_CONTAINS (public.Koordinaten_fallen_2056.fitting_rectangle_400m2, public.area_noas04_2056.geom) AS Arealstatistik,
public.Koordinaten_fallen_2056.fitting_rectangle_400m2,
public.area_noas04_2056.geom

FROM
public.area_noas04_2056,
public.Koordinaten_fallen_2056

auf dem ersten Blick habe ich den Eindruck, daß Du mit Deinem ‘select … from tablea, tableb’ ein Crossjoin produzierst…

Hallo akretschmer,

danke für die sehr schnelle Rückmeldung!

Ich habe begriffen, dass ich tatssächlich einen crossjoin produziere und bei der Datenmenge ists kein Wunder, dauert die Abfrage so lange. Jedoch habe ich es bis jetzt noch nicht geschaft das Problem anders zu lösen.
Ich habe nun weiter versucht, nur die Punkte auszuwählen, welche innerhalb des Buffers sind:

SELECT
public.area_noas04_2056.geom

FROM
public.area_noas04_2056,
public.koordinaten_fallen_2056

WHERE ST_CONTAINS (public.koordinaten_fallen_2056.fitting_rectangle_400m2, public.area_noas04_2056.geom)

Auch dieses Statement funktioniert ohne Fehler, jedoch bekomme ich ausser dem header der selektierten Spalte keine Daten. Ich sehe nicht wo mein Fehler liegt.
Auch für Vorschläge für andere Vorgehensweisen bin ich sehr dankbar

Verwendst du Indices? Stimmen die Projektionen? Welches Ergebnis liefert st_intersects? Was passiert, wenn du die Abfrage auf einen Bereich beschränkst, von dem du das Ergebnis kennst? Hast du mal die konkreten Polygone betrachtet? Wie sehen die Daten in QGIS aus?

Viele Grüsse
Uwe

Bei solchen Abfragen ist die Permutation ja vermutlich gewünscht oder besser unvermeidbar. Wüsste man es besser, würde man die Permutation natürlich einschränken.
Die Antwort auf Deine Frage ist vermutlich, dass nichts gefunden wird, das st_contains() erfüllt.

Es macht im allgemeinen für den Anfang wenig Sinn, hier mit großen Datenmengen zu arbeiten, solange man es nicht verstanden hat und die Ergebnisse nicht notfalls “zu Fuß” nachprüfen kann.

Also einfach mal mit einem Polygon und einem Punkt anfangen und den Punkt verschieben.

Falls im Forum jemand etwas dazu sagen soll, nicht nur Createstatments posten, auch die Werte.

Noch was: Wenn sich die Bufferquadrate überlappen, bekommst du mehrere Ergebnis pro Punkt. Macht das Ganze nicht gerade schneller. Da es ein quadratischer Buffer ist, kannst du auch aus den Koordinaten Abstände berechen und ohne geometrische Abfragen arbeiten. Das sind dann einfache </> Vergleiche. Das geht meist schneller als Geometrieabfragen. ODer du kannst dir mal st_dwithin anschauen.
Wie auch immer, kannst du eventuell einen Datenausschnitt bereitstellen, dann könnte man das besser nachvollziehen.

Gruß Uwe