[GIS] PostGIS : ST_Intersects함수를 통해 교차하는 지오메트리를 추출해보자.
프로젝트때 맨날 쓰던건데, 막상 필요할 때 까먹어서 시간 날린 김에 ST_Intersects에 대해 정리해봄...
나중에 오나전히 포함하는 ST_within 함수도 정리해볼 생각임..
ST_Intersects 함수란?
ST_Intersects함수는 입력 매개변수(파라메터)로 2개의 형상이 교차하는 경우 1을 리턴한다.
교차하지 않는 경우에는 0을 리턴한다.
* 단 두 형상 중 어느 하나가 NULL이거나, 비어있는 경우에는 NULL이 리턴된다.
그림으로 대충 보면 다음과 같다.
PolygonTable1과 PolygonTable2라는 테이블이 있다. 각 테이블은 지오메트리 컬럼을 가지고 있고
PolygonTable1 테이블과 PolygonTable2 테이블의 각 컬럼 중 교차하는 컬럼을 추출 해내고 싶을 때
ST_Intersects 함수를 이용할 수 있다.
만약 위와 같은 상황에서 ST_Intersects함수를 통해 PolygonTable1의 지오메트리를 추출한다면
A, D, F를 포함하는 3개의 row가 추출(true가 리턴) 될 것이다.
ST_Intersects 함수 사용방법
ST_Intersects 함수는 기본적으로 true 또는 false를 리턴한다.
그렇기 때문에 보통 ST_Intersects함수는 where의 조건절로 주로 사용된다. ( 샘플코드 참조 )
기본문법
SELECT st_intersects(a.geom, b.geom) FROM PolygonTable1 a, PolygonTable2 b;
샘플코드
SELECT a.geom
FROM PolygonTable1 a, PolygonTable2 b
WHERE st_intersects(a.geom, b.geom);
이렇게 where의 조건절에 사용하면 실제 교차하는 지오메트리를 추출 할 수 있다.
※ 단 두 테이블의 지오메트리 컬럼의 좌표계가 일치해야 한다. 만약 일치 하지 않는다면
st_transform함수를 통하여 좌표계를 변경해줘야 한다.
샘플코드
--PolygonTable1의 지오메트리 컬럼의 좌표계는 5174이고,
--PolygonTable2의 지오메트리 컬럼의 좌표계가 4326이라고 한다면
--st_transform함수를 이용하여 PolygonTable2의 지오메트리 컬럼의 좌표계를 5174로 변경하여 사용
SELECT a.geom FROM PolygonTable1 a, PolygonTable2 b
WHERE st_intersects(a.geom, st_transform(b.geom , 5174));
이렇게 하면 좌표계가 서로 맞아 제대로 지오메트리를 추출할 수 있다.