[PostGIS] 도형 합치기 (ST_UNION, ST_COLLECT) + WKT 변환

식빵·2022년 12월 17일
0

postgis

목록 보기
4/9
post-thumbnail

🥝 개요


이 글은 도형 정보를 합치는 함수인 ST_UNIONST_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);




🥝 쿼리 짜보기


1. 테스트 지역 정하기

일단 연속지적도 테이블에서 실습할 지역을 정하겠다.
실습 지역은 PNU 앞 10자리가 1168010100서울특별시 강남구 역삼동 으로 하겠다.

참고로 위 사진 처럼 법정동 코드를 검색하고 싶다면 여기에서 확인하자.


그리고 너무 많은 정보가 조회되면 느릴 수 있으니 조회 결과물의 개수를
500개로 제한해서 실습을 진행하겠다.

SELECT *
FROM CONTINUE_MAP
WHERE PNU LIKE '1168010100%'
ORDER BY PNU LIMIT 500 -- 500 개 제한!



2. PostGIS 쿼리 짜보기

이제 본격적으로 PostGIS 쿼리를 짜보자. 순서는 다음과 같다.

  1. ST_Union 연산을 사용해서 하나의 MultiPolygon 으로 받기
  2. ST_Collect 연산을 사용해서 하나의 GeometryCollection 으로 받기

📐 ST_Union 사용

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 를 반환한다.
  • 각 필지의 경계였던 MultiPolygon 의 경계선이 사라지다 보니
    살짝 심심한 모습이다.

📐 ST_Collect 사용

select st_collect(array(
	select geom 
	from continue_map
	where pnu like '1168010100%'
	order by pnu limit 500
))
  • GeometryCollection 를 반환한다.
  • 여러번 쿼리를 돌려본 결과 st_union 보다 평균적으로 빨리 조회되었다.
  • 각 필지의 경계선이 유지된다.

2번째 방식의 결과물이 이뻐 보여서 이걸로 계속 실습을 진행해보겠다.



3. 좌표계 변환 & 텍스트 반환

그런데 WEB GIS 개발에서는 결국 이렇게 생성한 도형정보를 브라우저에 그리는 걸
최종 목표로 하는 경우가 많다.

하지만 위처럼 쿼리를 돌려서 얻은 결과물은 Browser 에서 바로쓰지 못한다.
그 이유는 크게 2가지 이유가 있다.

  1. 브라우저에서 사용하는 Web Map js 라이브러리(ex: openlayers)와 DB 에서 조회한 Geometry 가 서로 다른 좌표계를 사용 중이다.

  2. Web Map jswkt 또는 geojson 포맷의 데이터를 받아서 쓴다.


이런 문제를 해결하려면 추가적인 쿼리가 필요하다.

  1. st_transform(geom, 5189); -- 좌표계 변환 및 좌표 이동
  2. 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 😁

profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글