먼저 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에서 3D로 보려면 GIS2THREEJS라는 플러그인을 설치하면 편리하게 확인해볼 수 있다.
마지막으로, 이 3D Polygon의 체적을 구해보자. 체적을 구하기 위해서는 먼저 Solid 형식으로 바꿔줘야 Volume을 구할 수 있다. 또한 Solid가 잘 만들어진 상황에서는 2개 이상의 3D Polygon간의 중첩분석 등도 가능할 것이다.
-- 체적값을 구하기
SELECT ST_Volume(ST_MakeSolid(geom)) as volume FROM cone;