where 절에서 교차 면적 백분율 계산


15

postgres에 다각형 테이블 (인구 조사 블록 그룹)이 있습니다. 각 블록 그룹에 주로 거주하는 도시 (다른 다각형 테이블)로 태그를 지정하려고합니다. 이게 가능해? 본질적으로 다음과 같은 것을 만들어야한다고 생각합니다.

select b.*,t.name  
from blockgroups b, towns t  
where (st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) > .5  

그러나이 쿼리는 영원히 걸리고 있습니다 (5,000 블록 그룹과 375 도시가 있습니다 ...). 이 쿼리가 올바르지 않은 경우 전혀 작동하거나 올바른 경우 더 빠른 방법에 대한 제안 사항이 있습니까?


최대 오버랩을 기준으로 블록 그룹에 태그를 지정하려는 것 같습니까? 그렇다면 이 답변을 참조하십시오 . 귀하의 '도시'가 인구 조사 지역 (MCD 또는 장소) 인 경우 중첩 비율을 계산할 필요가 없습니다.
dbaston

답변:


23

postgis는 모든 "blockgroup vs town"조합의 교차 지오메트리를 만지려고 할 때에도 교차 지오메트리를 만들려고하기 때문에 작업 방식은 효과가 있지만 시간이 너무 오래 걸립니다.

WHERE 절에 다른 조건 검사를 추가하여 두 기하학이 인터셉트되어 있는지 확인하고 기존 기하학 앞에 놓으십시오.

select b.*,t.name
from blockgroups b, towns t
where st_intersects(b.wkb_geometry, t.wkb_geometry) and    
    (st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) > .5

SQL에서 WHERE 절에 조건 목록이있는 경우 작성된 ​​순서대로 테스트됩니다. 초기 작업 중 하나에서 FALSE가 반환되면 쿼리는 다른 조건 확인을 건너 뜁니다. 결과는 항상 FALSE입니다.

또한 blockgroups.wkb_geometry 및 towns.wkb_geometry에 공간 인덱스가 있는지 확인하십시오.


1
추가하는 ST_Intersects것이 올바른 방법이지만 계획자는 작성된 순서대로 조건을 실행하거나 실행하지 않을 수 있습니다. 이에 대한 자세한 내용은 Postgres 문서 를 참조하십시오. ST_IntersectsST_Intersection에 같은 비용을 내 그래서 플래너가 무엇을하고 있는지 잘 모르겠지만, 항상 여기 옳은 일을하는 것 같다 솔직히 말해서, (100)를 설치합니다.
dbaston

아 .. 다른 언어 에서처럼 조건이 점검 될 것이라고 가정했습니다. 그러나 플래너에게 다른 옵션을 제공한다고 생각합니다.
Alexandre Neto

10

인구 조사 단위 중 일부가 3 개 도시에 걸쳐있을 수 있으므로 Alexandre의 매우 유용한 답변에 덧붙여 (따라서 어느 도시에서든 50 % 이상 떨어지지 않을 수 있음) 다음과 같이 할 수 있습니다.

select distinct on (b.id)
b.*,t.name,
(st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) as proportion
from blockgroups b, towns t
where st_intersects(b.wkb_geometry, t.wkb_geometry) 
order by b.id, proportion desc;

이것은 기본적으로 다음과 같은 상황을 방지합니다. 파란색 영역은 사라집니다. 여기에 이미지 설명을 입력하십시오


1
나는 SO 답변으로 처음 만난 문제가 다음 답변으로 해결 될 때 절대적으로 그것을 좋아합니다. 건배, @RobinL!
wfgeo

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.