PostGIS SFCGAL로 3D 데이터 다루기

3D extrude, 불리언 연산, 그리고 아직 PostGIS가 못 하는 것

류형규 · 2018-12

PostGIS SFCGAL로 3D 데이터 다루기 · 류형규 · 2018-12

이 발표의 목적

  • PostGIS에는 오래 전부터 postgis_sfcgal 확장이 있었지만, 대부분의 사용자는 ST_Extrude 정도밖에 모른다.
  • 이 발표는 SFCGAL이 제공하는 나머지 면들을 훑는다: 3D 교차 · 합집합 · 차집합, 진짜 3D 거리, 부피.
  • 예제는 뉴욕시 건물 풋프린트 + ST_Extrude, 가시화는 QGIS 3.4.
  • 마지막에는 한계 — 오늘날 PostGIS로 3D 서비스를 띄우면 안 되는 부분들을 정리.
PostGIS SFCGAL로 3D 데이터 다루기 · 류형규 · 2018-12

셋업

-- 두 개의 공간 확장을 모두 활성화
CREATE EXTENSION postgis;
CREATE EXTENSION postgis_sfcgal;

-- PostGIS가 연결된 SFCGAL 버전 확인
SELECT postgis_sfcgal_version();
  • postgis_sfcgalCGAL의 SFCGAL 라이브러리를 PostGIS가 얇게 감싼 것.
  • ST_3D...로 시작하면서 솔리드를 반환하거나 다루는 함수는 모두 SFCGAL 백엔드.
PostGIS SFCGAL로 3D 데이터 다루기 · 류형규 · 2018-12

예제 — NYC 건물 풋프린트 추출(extrusion)

-- 2D 풋프린트  →  3D 압출 솔리드 (PolyhedralSurfaceZ)
SELECT
  bldg_id,
  ST_Extrude(geom, 0, 0, height_ft * 0.3048) AS geom3d
FROM nyc_building_footprints;
  • ST_Extrude(geom, dx, dy, dz) 는 2D 폴리곤을 (dx, dy, dz) 벡터를 따라 위로 들어 올린다.
  • 건물의 경우 dz (높이, SRS 단위)만 신경 쓰면 됨.
  • 결과는 PolyhedralSurfaceZ (닫힌 3D 표면) — QGIS 3D와 대부분의 3D 뷰어가 기대하는 형식.
PostGIS SFCGAL로 3D 데이터 다루기 · 류형규 · 2018-12

가시화 — QGIS 3.4 3D Map View

  • 압출된 레이어 우클릭 → 3D View → 렌더러 활성화.
  • 레이어가 여전히 2D라면 building height를 extrusion 속성으로 매핑, 이미 PolyhedralSurfaceZ라면 그대로 사용.
  • 텍스처/셰이딩은 Cesium · deck.gl 같은 전용 3D 뷰어보다 떨어지지만, 기하를 sanity-check 하기엔 충분.
PostGIS SFCGAL로 3D 데이터 다루기 · 류형규 · 2018-12

SFCGAL 불리언 연산 (3D)

-- 두 솔리드의 3D 교차
SELECT ST_3DIntersection(building_a.geom3d, plane.geom3d);

-- 3D 합집합/차집합도 가능
SELECT ST_3DUnion(a.geom3d, b.geom3d);
SELECT ST_3DDifference(a.geom3d, b.geom3d);
  • 셋 모두 솔리드 · 다면체 표면에서만 동작 (2D 폴리곤 ✗).
  • 활용: 지형 메시로 건물 클리핑, 가시성 볼륨 계산, 내부 공동 도려내기.
  • 메시가 복잡해질수록 비싸진다 — SFCGAL은 정확하지만 빠르지 않다.
PostGIS SFCGAL로 3D 데이터 다루기 · 류형규 · 2018-12

알아둘 만한 다른 3D 함수

함수 역할
ST_3DDistance 진짜 3D 유클리드 거리 (XY 투영 거리 ✗)
ST_Volume 닫힌 솔리드의 부피
ST_3DArea 다면체 표면의 표면적
ST_StraightSkeleton 2D 스켈레톤 — 지붕 생성 후 압출에 유용
ST_ApproximateMedialAxis 근사 메디얼 축 — 스켈레톤 기반 모델링
PostGIS SFCGAL로 3D 데이터 다루기 · 류형규 · 2018-12

한계와 고려사항

  • 3D 공간 인덱스가 없다. 기본 GIST 인덱스는 BBox2D 기반. 3D BBox는 별도 작업이 필요하며, 그렇지 않으면 모든 쿼리가 sequential scan.
  • WFS-3D 출력이 일등시민 아님. PostGIS는 3D를 저장할 수 있지만 GeoServer / MapServer는 WFS 경로에서 3D를 깎거나 2D로 투영한다 (FOSS4G 2017 발표 참고).
  • SFCGAL은 단일 스레드. 모든 3D 연산이 단일 PostgreSQL 워커 안에서 돈다 — 큰 ST_3DIntersection에서 병렬 스캔 이득이 없다.
  • 위상 검증 없음. 입력 솔리드가 닫혀있고 방향이 일관됨을 가정 — 깨진 입력 → 알아보기 힘든 CGAL 에러.
PostGIS SFCGAL로 3D 데이터 다루기 · 류형규 · 2018-12

정리

  • 저장 · 기본 기하 쿼리 수준에서는 PostGIS + SFCGAL이 그럭저럭 쓸 만한 3D 백엔드.
  • 풍부한 3D 서비스 제공 (스트리밍, LOD, 3D Tiles) 까지 가려면 PostGIS는 저장소 역할로 두고 전용 3D 서버(CesiumJS + 3D Tiles 파이프라인)와 조합하자. WFS만으로는 안 된다.
  • QGIS 3.4 3D 뷰는 sanity-check용으로 훌륭하지만, 최종 사용자용 3D GIS는 아직 아니다.
PostGIS SFCGAL로 3D 데이터 다루기 · 류형규 · 2018-12

참고

감사합니다.

PostGIS SFCGAL로 3D 데이터 다루기 · 류형규 · 2018-12