Esto me parece una pregunta tan simple (y probablemente lo sea), pero parece que no puedo encontrar un ejemplo que me dé la respuesta. Con PostGIS, solo quiero seleccionar puntos que quedan fuera de los polígonos. En última instancia, esto es lo contrario de ST_Intersects, por lo que puedo ver.
Ejemplo: tengo una capa de taxlot y una capa de punto de dirección. Supongo que debería estar usando ST_Intersects, pero ¿cómo le digo que haga la selección inversa? Pensé que tal vez agregar una declaración NOT delante del código a continuación, pero eso no funcionó.
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
fuente
fuente
Respuestas:
La razón por la que no funciona con "no se cruza" es que solo compara geometrías en pares; Habrá el mismo problema con disjuntas. Cada punto de la casa desunirá algunas parcelas, incluso si se cruza con una parcela.
La sugerencia de Underdark no tiene ese problema. También hay otro truco que probablemente hará un uso más efectivo de los índices:
La idea es unirlos con st_intersects y obtener las filas donde la identificación de la parcela no está presente.
Los índices necesarios aquí son un índice espacial y un índice de gid en parcelas (suponiendo que id en la tabla de parcelas también se llama gid).
fuente
Quizá estés buscando ST_Disjoint
fuente
En caso de que no haya una función especializada:
fuente
Aquí usamos
NOT EXISTS
yCREATE TABLE AS SELECT
(CTAS)fuente
¿Qué tal ST_Disjoint? - Devuelve VERDADERO si las Geometrías no se "cruzan espacialmente" - si no comparten ningún espacio juntos.
fuente
En algunos casos es muy útil usar LATERAL JOIN, puede ser muy rápido. Debería verse como
fuente
Simplemente usando NOT antes de que ST_Intersects haga el truco:
Esto obtiene todas las direcciones que no están dentro del vecindario # 62:
Tenga en cuenta el orden de las columnas geom: polígonos primero, puntos segundos, que se invierte del uso habitual de ST_Intersects.
¡Rápido y simple! ¡Me he estado preguntando cómo hacer esto correctamente por un tiempo!
fuente
Puede que esta no sea la solución más rápida ... Pero generalmente solo hago trampa al unir todas las características de la otra tabla.
Agradable y ágil si la tabla not_in_here no es tan compleja.
fuente