Wydaje mi się, że to takie proste pytanie (i prawdopodobnie tak jest), ale nie mogę znaleźć przykładu, który dałby mi odpowiedź. Korzystając z PostGIS, chcę po prostu wybrać punkty, które wypadają poza wielokątami. Ostatecznie jest to odwrotność ST_Intersects, o ile widzę.
Przykład: Mam warstwę taksówki i warstwę adresu. Zakładam, że powinienem używać ST_Intersects, ale jak mam to zrobić, aby dokonać wyboru wstecznego? Pomyślałem, że może dodanie instrukcji NOT przed kodem poniżej, ale to nie zadziałało.
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
źródło
źródło
Odpowiedzi:
Powodem, dla którego nie działa z „nie przecina się”, jest to, że porównujesz geometrie tylko parami; będzie ten sam problem z rozłącznością. Każdy punkt domu rozłącza niektóre działki, nawet jeśli przecina jedną działkę.
sugestia podmroku nie ma tego problemu. Jest też inna sztuczka, która prawdopodobnie pozwoli na bardziej efektywne wykorzystanie indeksów:
Chodzi o to, aby połączyć je za pomocą st_intersects i uzyskać wiersze, w których identyfikator paczki nie jest obecny.
Potrzebne tutaj indeksy to indeks przestrzenny i indeks gid w paczkach (przy założeniu, że tabela id w paczkach jest również nazywana gid).
źródło
Być może szukasz ST_Disjoint
źródło
W przypadku braku specjalistycznej funkcji:
źródło
Tutaj używamy
NOT EXISTS
iCREATE TABLE AS SELECT
(CTAS)źródło
Co powiesz na ST_Disjoint? - Zwraca wartość PRAWDA, jeśli geometrie nie „przecinają się przestrzennie” - jeśli nie dzielą ze sobą żadnej przestrzeni.
źródło
W niektórych przypadkach bardzo przydatne jest użycie POŁĄCZENIA PÓŹNIEJ, może być bardzo szybkie. Powinno to wyglądać
źródło
Po prostu użycie NOT zanim ST_Intersects załatwi sprawę:
Otrzymuje to wszystkie adresy, które nie znajdują się w sąsiedztwie # 62:
Zwróć uwagę na kolejność kolumn geom - najpierw wielokąty, punkty drugie, co jest odwrócone od zwykłego użycia ST_Intersects.
Szybki i prosty! Od jakiegoś czasu zastanawiam się, jak to zrobić poprawnie!
źródło
To może nie być najszybsze rozwiązanie ... Ale zwykle oszukuję, łącząc wszystkie funkcje drugiego stołu.
Ładne i szybkie, jeśli tabela not_in_here nie jest tak złożona.
źródło