개요
스마트시티, 디지털 트윈 등 실세계를 가상공간으로 구현하고자 하는 다양한 시도가 이루어지고 있습니다. 그러나 정교한 가상공간을 만드는 일은 상당한 자원과 시간이 소요됩니다. 물론 구축 후 얻게되는 가치는 추정하기 어려울 정도로 클 것으로 예상됩니다.
프로그웍스는 현재 개방되는 데이터를 가지고 제한적이지만 이의 구현이 가능할 지 확인해 봤습니다. 그래서 국가공간정보포털 오픈마켓을 통해 "건물통합정보"를 다운받아 특정 지역(경기도 성남시 중원구 성남동)의 3D 건물모델을 만들었습니다. 그러나 역시 문제는 원본 데이터의 품질 문제 입니다. 예를 들면 건물의 고도 값이 0 인 것도 많이 존재하고, 층수도 0인것, 지하층수가 0인 것도 있습니다. 신뢰성에 큰 문제가 있습니다.
당연히 제작되는 결과물도 원본 품질에 종속적일 수 밖에 없습니다. 제작한 결과물의 정교함이 아닌 PostGIS를 이용하는 한 가지 사례로써 봐주십시오.
제작 과정
1. 대상 지역 추출 (경기도 성남시 중원구 성남동)
읍면동코드를 이용하여 성남동 경계에 포함되는 건물을 추출합니다. 이 때 ST_GeometryN 함수를 이용하여 멀티폴리곤에서 첫 번째 폴리곤만을 추출합니다. (멀티폴리곤이지만 대부분 하나의 폴리곤만 존재합니다)
PostGIS 3d 변환 함수는 단일파트 형식 Geometry만을 지원합니다.
create table tmp_m41130_002_01 as
with bound as
(select geom as geom2 from n3a_g0110000 where bjcd = '4113310100')
select bd.bld_nm, bd.dong_nm, bd.grnd_flr, bd.ugrnd_flr, bd.height, bd.geom from
(select bld_nm, grnd_flr, ugrnd_flr, height, ST_GeometryN(geom, 1) as geom from m41130_002_1) bd, bound
where st_intersects (bd.geom, bound.geom2) = true;
2. 3D 데이터 생성을 위한 투영좌표계 변환
x, y, z 로 표현되는 형식의 단위 값을 같아야 합니다. Degree 형식의 경위도 좌표는 정확한 높이 값 적용이 어렵습니다. 이에 Linear Unit이 m (미터)를 이용하는 투영좌표계(TM)를 이용하고, 저희는 구글좌표계로 변환했습니다.
( 참고 바로가기 : PostGIS에서 공간테이블 좌표 변환 )
ALTER TABLE tmp_m41130_002_01
ALTER COLUMN geom TYPE geometry(Polygon,3857) USING ST_Transform(ST_SetSRID(geom,4326), 3857);
3. 3D 건물데이터 생성
ST_Extrude 함수를 이용하여 3D 형식 Geometry로 변환합니다. 이 때 Z(높이 값) 적용을 위하여 건물통합 데이터의 "height"속성을 이용하려 했으나 0인 것이 많아 임의로 "grnd_flr(지상층)" 속성에 3.5m 를 곱한 것으로 대체했습니다. 물론 "grnd_flr"속성에도 0인 것이 많아 정확하게 만들어지지는 않습니다.
실제 Query 수행 후 생성된 ST_GeometryType 함수를 이용하여 생성된 Geometry가 "ST_PolyheralSurface" 형식으로 변경된 것을 볼 수 있습니다.
-- 3D 테이블 생성
create table m41130_002_3d as
select bld_nm, grnd_flr, ugrnd_flr, height, ST_Extrude(geom, 0, 0, grnd_flr * 3.5) as geom from tmp_m41130_002_01;
-- Geometry 형식 검사
select ST_GeometryType(geom) as gtype from m41130_002_3d limit 1;
4. 데이터 조회
QGIS 에서 PostGIS를 연결한 후 생성된 테이블을 레이어로 추가합니다. 레이어는 "보기 > 새 3D 맵뷰"에서 볼 수 있습니다.
맺음 말
저희가 게시하는 사용 팁은 오랜 기간의 경험을 통해 얻어진 지식입니다. 정말 자신의 것이 되기 위해서는 공개SW 제작사의 공식 매뉴얼을 통해 함수를 사용하기 위한 제약조건 등의 확인이 필요합니다. 또한 눈으로 얻어지는 것은 없습니다. 실제 해보는 것이 중요합니다. 저희가 게시하는 주제 및 샘플은 공개SW와 공공 개방되는 데이터를 이용하여 제작됩니다. 약간의 수고를 통해 필자의 오랜 노하우를 쉽게 가질 수 있습니다.
언제가는 좋아지겠지만 개방되는 공간정보의 품질이 좋아지기를 간절히 바랍니다. 이 부분이 해결된다면 얻을 수 있는 것이 참 많을 것 같습니다.
'꿀팁 - PostGIS' 카테고리의 다른 글
격자를 이용한 Hot Spot 추출 (0) | 2020.02.07 |
---|---|
PostGIS를 이용한 격자(Rectangular Grid) 만들기 (0) | 2020.02.05 |
PostGIS 에서 Geometry 오류 수정 (3) | 2019.03.26 |
수치지형도 등고선을 이용한 DEM 제작 방법 (2) | 2019.03.22 |
PostGIS에서 Hausdorff 거리를 이용하여 건물통합 건물과 도로명주소 건물 비교 (0) | 2019.03.13 |