Мне кажется, что это такой простой вопрос (и, вероятно, это так), но я не могу найти пример, который дает мне ответ. Используя PostGIS, я просто хочу выбрать точки, которые выходят за пределы полигонов. В конечном счете, это обратное к ST_Intersects, насколько я понимаю.
Пример: у меня есть слой таксота и слой адресной точки. Я предполагаю, что должен использовать ST_Intersects, но как мне сказать, чтобы он делал обратный выбор? Я подумал, может быть, добавив оператор NOT перед кодом ниже, но это не сработало.
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
источник
источник
Ответы:
Причина, по которой он не работает с «не пересекаются», состоит в том, что вы сравниваете геометрию только парами; будет такая же проблема с дизъюнктом. Каждая точка дома будет разъединять некоторые посылки, даже если она пересекает одну посылку.
Предложение Подземья не имеет этой проблемы. Существует также еще одна хитрость, которая, вероятно, позволит более эффективно использовать индексы:
Идея состоит в том, чтобы соединить их с st_intersects и получить строки, в которых нет идентификатора участка.
Здесь нужны индексы: пространственный индекс и индекс gid в посылках (при условии, что id в таблице посылок также называется gid).
источник
Возможно, вы ищете ST_Disjoint
источник
В случае, если нет специализированной функции:
источник
Здесь мы используем
NOT EXISTS
иCREATE TABLE AS SELECT
(CTAS)источник
Как насчет ST_Disjoint? - Возвращает TRUE, если геометрия не "пространственно пересекается" - если они не разделяют пространство вместе.
источник
В некоторых случаях очень полезно использовать LATERAL JOIN, оно может быть очень быстрым.
источник
Простое использование NOT до того, как ST_Intersects добьется цели:
Это получает все адреса, которые не находятся в окрестности # 62:
Обратите внимание на порядок столбцов geom - сначала полигоны, затем точки второго, что отличается от обычного использования ST_Intersects.
Быстро и просто! Задумывались, как это сделать правильно какое-то время!
источник
Возможно, это не самое быстрое решение ... Но я обычно просто обманываю, объединяя все функции другой таблицы.
Хорошо и быстро, если таблица not_in_here не так сложна.
источник