Parece-me uma pergunta tão simples (e provavelmente é), mas não consigo encontrar um exemplo que me dê a resposta. Usando o PostGIS, eu só quero selecionar pontos que ficam fora dos polígonos. Em última análise, este é o inverso do ST_Intersects, tanto quanto eu posso ver.
Exemplo: Eu tenho uma camada de taxlot e uma camada de ponto de endereço. Eu suponho que eu deveria estar usando o ST_Intersects, mas como eu digo para fazer a seleção reversa? Eu pensei que talvez adicionando uma instrução NOT na frente do código abaixo, mas isso não funcionou.
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
fonte
fonte
Respostas:
O motivo pelo qual ele não funciona com "não se cruza" é que você só compara geometrias em pares; haverá o mesmo problema com a disjunção. Cada ponto doméstico separa algumas parcelas, mesmo que elas cruzem uma parcela.
A sugestão do underdark não tem esse problema. Há também outro truque que provavelmente fará um uso mais eficaz dos índices:
A idéia é juntá-los ao st_intersects e obter as linhas onde o ID do pacote não está presente.
Os índices necessários aqui são um índice espacial e um índice sobre gid em parcelas (assumindo que a tabela id em parcelas também seja chamada gid).
fonte
Você pode estar procurando por ST_Disjoint
fonte
Caso não haja função especializada:
fonte
Aqui usamos
NOT EXISTS
eCREATE TABLE AS SELECT
(CTAS)fonte
Que tal ST_Disjoint? - Retorna VERDADEIRO se as geometrias não "se interceptarem espacialmente" - se não compartilharem nenhum espaço juntos.
fonte
Em alguns casos, é muito útil usar LATERAL JOIN, pode ser muito rápido. Deve parecer
fonte
Simplesmente usando NOT antes que o ST_Intersects faça o truque:
Isso obtém todos os endereços que não estão no bairro # 62:
Observe a ordem das colunas geom - os polígonos primeiro, os pontos segundo, que são revertidos do uso usual de ST_Intersects.
Rápido e simples! Estive pensando como fazer isso corretamente por um tempo!
fonte
Esta pode não ser a solução mais rápida ... Mas geralmente trapaceio ao juntar todos os recursos da outra tabela.
Agradável e ágil se a tabela not_in_here não for tão complexa.
fonte