PostGIS에서 입체 폴리곤을 만들고 체적을 구하기

DHL
4 min readJul 20, 2023

--

QGIS는 거들뿐

개요

건물 2D Polygon을 LOD 1.0 수준의 박스 형태 3D로 만드는 것은 ST_Extrude를 이용하여 쉽게 만들 수 있다.

그런데, 처음부터 입체 형태의 좌표가 주어지는 상황에서 3D Polygon을 만들고 체적(부피)을 구해야 하는 상황인 경우에는 이보다 복잡해진다.

가장 간단한 샘플 데이터를 가지고 방법을 살펴보자.

먼저 PostGIS에서 3D를 처리하기 위한 sfcgal 익스텐션을 설치한다.

CREATE EXTENSION postgis_sfcgal;

다음, 입체 폴리곤 지오메트리를 담을 빈 테이블을 만든다.

-- 테이블 구조 생성 
CREATE TABLE cone (
id SERIAL PRIMARY KEY,
geom GEOMETRY(POLYHEDRALSURFACEZ, 4326)
);

3D 폴리곤이 되기 위한 가장 간단한 모양인 삼각뿔 지오메트리를 위의 테이블에 추가한다.

-- 입체 삼각뿔 형태의 지오메트리 생성  
INSERT INTO cone (geom)
VALUES (
ST_GeomFromEWKT('SRID=4326;POLYHEDRALSURFACE Z (
((1.0 1.0 0.0, 2.0 1.0 0.0, 1.5 1.5 2.0, 1.0 1.0 0.0)),
((2.0 1.0 0.0, 1.5 2.0 0.0, 1.5 1.5 2.0, 2.0 1.0 0.0)),
((1.5 2.0 0.0, 1.0 1.0 0.0, 1.5 1.5 2.0, 1.5 2.0 0.0)),
((1.0 1.0 0.0, 1.5 2.0 0.0, 2.0 1.0 0.0, 1.0 1.0 0.0))
)')
);

2D Polygon에서의 도형 오류와 마찬가지로 스파게티 구조가 되면 오류가 발생하므로, 좌표의 순서가 꼬이지 않도록 만들어야 하고, 각 폴리곤끼리 폐합이되어야 한다. 기본적인 얘기지만 이렇게 데이터(좌표)를 준비하는 게 가장 어려운 일이 될 수 있다.

참고로, POLYHEDRALSURFACE Z는 삼각형만 되는 것은 아니고 사각형도 가능하다.

생성 결과 확인

위의 테이블을 QGIS에서 띄우면 2D로는 이렇게 보인다.

QGIS 2D 지도창에서 보는 삼각뿔 (위에서 내려다보는 평면도)

QGIS에서 3D로 보려면 GIS2THREEJS라는 플러그인을 설치하면 편리하게 확인해볼 수 있다.

QGIS2THREEJS를 이용한 입면도 조회

마지막으로, 이 3D Polygon의 체적을 구해보자. 체적을 구하기 위해서는 먼저 Solid 형식으로 바꿔줘야 Volume을 구할 수 있다. 또한 Solid가 잘 만들어진 상황에서는 2개 이상의 3D Polygon간의 중첩분석 등도 가능할 것이다.

-- 체적값을 구하기 
SELECT ST_Volume(ST_MakeSolid(geom)) as volume FROM cone;
체적값 조회

--

--