이것은 나에게 간단한 질문처럼 보입니다 (아마도 가능합니다).하지만 나는 대답을주는 예를 찾을 수없는 것 같습니다. PostGIS를 사용하여 다각형 외부 에있는 점을 선택하려고 합니다. 궁극적으로 이것은 내가 볼 수있는 한 ST_Intersects의 반대입니다.
예 : Taxlot 레이어와 주소 포인트 레이어가 있습니다. 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);
답변
“교차하지 않음”으로 작동하지 않는 이유는 형상을 쌍으로 만 비교하기 때문입니다. 분리와 같은 문제가있을 것입니다. 모든 하우스 포인트는 하나의 소포와 교차하더라도 일부 소포를 분리합니다.
underdark의 제안에는 그 문제가 없습니다. 인덱스를보다 효과적으로 사용하는 또 다른 방법이 있습니다.
CREATE TABLE t_intersect AS
SELECT
hp.gid,
hp.st_address,
hp.city,
hp.st_num,
hp.the_geom
FROM
public.housepoints AS hp LEFT JOIN
public.parcel AS par ON
ST_Intersects(hp.the_geom,par.the_geom)
WHERE par.gid IS NULL;
아이디어는 그것들을 st_intersects와 결합하고 소포 ID가 존재하지 않는 행을 얻는 것입니다.
여기에 필요한 인덱스는 공간 인덱스 및 소포의 gid 인덱스입니다 (소포 테이블의 id가 gid라고 가정).
답변
ST_Disjoint를 찾고있을 수 있습니다.
ST_Disjoint — 도형이 공간적으로 교차하지 않는 경우-공간이 교차하지 않는 경우 TRUE를 반환합니다.
답변
특수 기능이없는 경우 :
CREATE table t_intersect AS
SELECT
hp.gid,
hp.st_address,
hp.city,
hp.st_num,
hp.the_geom
FROM
public.housepoints as hp
WHERE
hp.gid NOT IN
(
SELECT
h.gid
FROM
public.parcel as p,
public.housepoints as h
WHERE
ST_Intersects(h.the_geom,p.the_geom)
) AS foo
답변
여기에 우리가 사용 NOT EXISTS
하고 CREATE TABLE AS SELECT
(CTAS)
CREATE table t_intersect
AS
SELECT
hp.gid,
hp.st_address,
hp.city, hp.st_num,
hp.the_geom
FROM public.housepoints AS hp
WHERE NOT EXISTS (
SELECT 1
FROM public.parcel AS par
WHERE ST_Intersects(hp.the_geom,par.the_geom)
);
답변
ST_Disjoint는 어떻습니까? — 도형이 공간적으로 교차하지 않는 경우-공간을 공유하지 않으면 TRUE를 반환합니다.
답변
어떤 경우에는 LATERAL JOIN을 사용하는 것이 매우 유용합니다. 매우 빠를 수 있습니다.
SELECT * FROM houses h
LEFT JOIN LATERAL (
SELECT True t FROM parcels p
WHERE ST_Intersects(p.geom, h.geom)
LIMIT 1
) p ON True
WHERE p.t IS NULL;
답변
ST_Intersects 전에 NOT을 사용하여 트릭을 수행하십시오.
이것은 이웃 # 62에없는 모든 주소를 가져옵니다.
select
a.*
from denver.neighborhoods as n
join denver.addresses as a on not ST_Intersects(n.geom, a.geom)
where n.nbhd_id = '62'
기하 열의 순서-다각형을 먼저, 점을 두 번째로-일반적인 ST_Intersect 사용과 반대입니다.
빠르고 간단합니다! 이 작업을 잠시 동안 올바르게 수행하는 방법에 대해 궁금했습니다!