PostGIS와 교차하지 않는 기능 선택 있습니다. ST_Intersects를 사용해야한다고

이것은 나에게 간단한 질문처럼 보입니다 (아마도 가능합니다).하지만 나는 대답을주는 예를 찾을 수없는 것 같습니다. 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 사용과 반대입니다.

빠르고 간단합니다! 이 작업을 잠시 동안 올바르게 수행하는 방법에 대해 궁금했습니다!