이 글은 도형 정보를 합치는 함수인 ST_UNION
과 ST_COLLECT
의 사용법을
간단하게 기록하는 글이다.
실습용 데이터: 연속지적도 테이블
여기서 사용될 실습 테이블은 예전에 작성한 글에서 생성한
연속지적도 Table
로 진행한다. 참고로 테이블의DDL
은 아래와 같다.CREATE TABLE public.continue_map ( pnu varchar(19) not null, -- PNU, 필지고유번호 geom geometry(multipolygon, 5186) null, -- 필지 도형 정보 jibun varchar(100) null, -- 지번 ex) 176-3 대 bchk varchar(1) null, -- 발급승인코드 sgg_oid int4 null, -- 원천오브젝트ID col_adm_se varchar(5) null, -- 원천시군구 코드 constraint continue_map_pkey primary key (pnu) ); -- 이번 실습에서 쓰이는 컬럼은 pnu 와 geom 이다. 다른 컬럼은 신경쓰지 말자. -- create spatial index 는 항상 해주자. create index continue_map_spatial_idx on public.continue_map using gist(geom);
일단 연속지적도 테이블에서 실습할 지역을 정하겠다.
실습 지역은 PNU 앞 10자리가 1168010100
인 서울특별시 강남구 역삼동
으로 하겠다.
참고로 위 사진 처럼 법정동 코드를 검색하고 싶다면 여기에서 확인하자.
그리고 너무 많은 정보가 조회되면 느릴 수 있으니 조회 결과물의 개수를
500개로 제한해서 실습을 진행하겠다.
SELECT *
FROM CONTINUE_MAP
WHERE PNU LIKE '1168010100%'
ORDER BY PNU LIMIT 500 -- 500 개 제한!
이제 본격적으로 PostGIS 쿼리를 짜보자. 순서는 다음과 같다.
ST_Union
연산을 사용해서 하나의 MultiPolygon
으로 받기ST_Collect
연산을 사용해서 하나의 GeometryCollection
으로 받기select st_union(a.geom) as geom from
(
select * from continue_map
where pnu like '1168010100%'
order by pnu limit 500
) a
-- group by a.src_signgu_code
-- 애초에 "서울특별시 강남구"는 구제시가 아니므로 위처럼 할 필요가 없다.
-- 설사 구제시여도, 어짜피 다 더해버릴 거라서 의미가 없기는 매 한가지다.
MultiPolygon
를 반환한다.select st_collect(array(
select geom
from continue_map
where pnu like '1168010100%'
order by pnu limit 500
))
GeometryCollection
를 반환한다.st_union
보다 평균적으로 빨리 조회되었다.2번째 방식의 결과물이 이뻐 보여서 이걸로 계속 실습을 진행해보겠다.
그런데 WEB GIS 개발에서는 결국 이렇게 생성한 도형정보를 브라우저에 그리는 걸
최종 목표로 하는 경우가 많다.
하지만 위처럼 쿼리를 돌려서 얻은 결과물은 Browser
에서 바로쓰지 못한다.
그 이유는 크게 2가지 이유가 있다.
브라우저에서 사용하는 Web Map js
라이브러리(ex: openlayers
)와 DB
에서 조회한 Geometry 가 서로 다른 좌표계를 사용 중이다.
Web Map js
는 wkt
또는 geojson
포맷의 데이터를 받아서 쓴다.
이런 문제를 해결하려면 추가적인 쿼리가 필요하다.
st_transform(geom, 5189); -- 좌표계 변환 및 좌표 이동
st_asText(geom); -- 문자열로 반환(WKT)
그래서 기존 쿼리를 더 보강하면 바꾸면 아래와 같다.
select
st_asText( -- 결과값을 [geometry ==> Text] 로 변환
st_transform( -- geometry 좌표계를 [5186 ==> 5179] 로 변환
st_collect(array( -- GeometryCollection 타입의 geometry 반환
select geom from continue_map
where pnu like '1168010100%'
order by pnu limit 500
)),
5179)
) as geom;
간단하게 QGIS - QuickWKT
플러그인 사용하여 WKT 가 정상적으로 지도에
출력되는지만 테스트해보자.
4-1. 플러그인 설치
4-2. 플러그인 실행
4-3. QuickWTK 팝업이 나오면 가운데 화면에 WKT 복붙 및 확인 클릭
4-4. WKT 로 생성된 레이어의 좌표계 변경
4-5. 최종 확인
good 😁