Dies scheint mir eine so einfache Frage zu sein (und wahrscheinlich auch), aber ich kann kein Beispiel finden, das mir die Antwort gibt. Mit PostGIS möchte ich nur Punkte auswählen, die außerhalb von Polygonen liegen. Letztendlich ist dies die Umkehrung der ST_Intersects, soweit ich das beurteilen kann.
Beispiel: Ich habe einen Taxlot-Layer und einen Adresspunkt-Layer. Ich gehe davon aus, dass ich die ST_Intersects verwenden sollte, aber wie kann ich die umgekehrte Auswahl vornehmen? Ich dachte, ich füge vielleicht eine NOT- Anweisung vor dem Code unten hinzu, aber das hat nicht funktioniert.
CREATE table t_intersect AS
SELECT
hp.gid,
hp.st_address,
hp.city,
hp.st_num,
hp.the_geom
FROM
public.parcel as par,
public.housepoints as hp
WHERE
ST_Intersects(hp.the_geom,par.the_geom);
postgis
geoprocessing
sql
intersection
RyanDalton
quelle
quelle
Antworten:
Der Grund, warum es mit "Nicht schneidet" nicht funktioniert, ist, dass Sie Geometrien nur paarweise vergleichen. es wird das gleiche Problem mit disjunkt geben. Jeder Hauspunkt trennt einige Parzellen, selbst wenn er eine Parzelle schneidet.
Der Vorschlag von underdark hat dieses Problem nicht. Es gibt auch einen anderen Trick, mit dem Indizes wahrscheinlich effektiver genutzt werden können:
Die Idee ist, sie mit st_intersects zu verbinden und die Zeilen abzurufen, in denen die Paket-ID nicht vorhanden ist.
Die Indizes, die hier benötigt werden, sind ein räumlicher Index und ein Index für GID in Paketen (vorausgesetzt, die ID in der Pakettabelle wird auch GID genannt).
quelle
Möglicherweise suchen Sie nach ST_Disjoint
quelle
Falls es keine spezialisierte Funktion gibt:
quelle
Hier verwenden wir
NOT EXISTS
undCREATE TABLE AS SELECT
(CTAS)quelle
Wie wäre es mit ST_Disjoint? - Gibt TRUE zurück, wenn sich die Geometrien nicht "räumlich schneiden" - wenn sie keinen gemeinsamen Raum haben.
quelle
In einigen Fällen ist es sehr nützlich, LATERAL JOIN zu verwenden, es kann sehr schnell sein. Es sollte so aussehen
quelle
Einfach NOT verwenden, bevor ST_Intersects den Trick macht:
Dadurch werden alle Adressen abgerufen, die sich nicht in der Nachbarschaft Nr. 62 befinden:
Beachten Sie die Reihenfolge der Geom-Spalten - Polygone zuerst, Punkte zweitens, was sich von der üblichen Verwendung von ST_Intersects umkehrt.
Schnell und einfach! Ich habe mich eine Weile gefragt, wie ich das richtig machen soll!
quelle
Dies ist möglicherweise nicht die schnellste Lösung ... Aber ich betrüge normalerweise nur, indem ich alle Funktionen des anderen Tisches verbinde.
Schön und bissig, wenn die not_in_here- Tabelle nicht so komplex ist.
quelle