3단계 · GDAL + mago 3DTerrainer 레시피
웹 형태 변환
브라우저가 바로 읽는 포맷으로 변환. 뷰어별 처리 방식.
방식·도구 고르기
통째 파일이 무거울 때: ① 타일로 굽기(파일) → 화면 범위 조각만 받음. ② 그래도 브라우저 그리기 부담 → WMS(서버)로 서버가 그림까지. 갱신·조회·연동이 필요하면 크기와 상관없이 서버.
지형 · 데이터 상태별 (크기 기준은 어림)
| 데이터 상태 | 방식 | 고르는 이유 · 형태 |
|---|---|---|
| 웹 2.5D 지형 (MapLibre·Deck.gl) | 파일 | Terrain-RGB 타일: 높이를 RGB에 담은 PNG. 뷰어가 메시 생성. |
| 지구본 지형 (CesiumJS) | 파일 | quantized-mesh: 미리 만든 삼각망 + LOD. 지형 위에 3D Tiles·영상 얹기. |
| 음영기복도·고도 색 지도만 (입체 불필요) | 서버 | GeoServer WMS (ShadedRelief·ColorMap): 2D 뷰어 포함 모든 뷰어. |
| 고화질 지형 장면 · 시뮬레이션 | 엔진 | Cesium for Unreal: 같은 quantized-mesh + 영상 덧씌움 + 조명·대기. |
카드 안 도구 선택 → 아래 단계·결과 전환. ?: 고르는 기준·장단점.
파일 방식
맞는 경우
- 갱신 드문 데이터 (연 1회 공개 등)
- 서버 운영 없는 배포: 정적 호스팅·CDN
- 미리 구운 타일 → 요청마다 연산 없음, 동시 접속에 강함
한계
- 원본이 바뀌면 다시 굽기
- 속성 조건 조회 불가 → 받은 범위 안 클라이언트 필터만
- 타일 수만~수백만 개 → 올리기·저장 부담 (PMTiles 한 파일로 완화)
결과를 파일로 구워 정적 호스팅. 브라우저가 파일을 직접 읽음.
도구
GDAL + mago 3DTerrainer · 장점
- Terrain-RGB: MapLibre·Deck.gl 지형
- quantized-mesh: CesiumJS 지형·LOD
- 지오이드 보정·최대 줌 지정 (mago 3DTerrainer)
단점
- 결과 두 벌 → 용량·시간 증가
- mago는 GeoTIFF만 읽음 (.img는 변환 먼저)
- Terrain-RGB 높이 정밀도 0.1m
서버 방식
맞는 경우
- 자주 바뀌는 데이터: DB 수정 즉시 반영
- 속성 조건 조회: WFS (CQL_FILTER)
- WMS·WFS 표준 요구: GIS 소프트웨어·타 기관 시스템 연동
- 저사양 단말: WMS는 서버가 그림까지 → 브라우저는 이미지만
- 접근 권한·사용량 관리
한계
- 서버 상시 운영: 메모리·DB·보안 패치
- 요청마다 연산 → 타일 캐시(GeoWebCache 등) 없으면 동시 접속에 약함
- 구성 요소 증가: DB + 서버 + 프록시
떠 있는 서버에 발행. 요청마다 서버가 응답 생성.
도구
GeoServer · 장점
- ShadedRelief·ColorMap을 서버에서
- 2D 뷰어(OpenLayers)도 지형 표현
- 높이 값 원본 유지
단점
- 입체 지형 아님 (그림)
- 서버 상시 운영
엔진 (Cesium for Unreal)
맞는 경우
- 화질: 조명·그림자·재질·후처리
- 시뮬레이션·VR·다른 3D 에셋과 합성
- 브라우저 메모리 한계를 넘는 장면 (데스크톱 GPU)
한계
- 브라우저 밖: 설치형 앱 빌드 또는 Pixel Streaming
- GPU 필요, 화면 확인 수동
- 3D Tiles·지형만. 2D 벡터·영상은 지형 위 덧씌움(WMS·WMTS·XYZ)
같은 결과 파일(3D Tiles·quantized-mesh)을 언리얼에서 읽음. 엔진 전용 변환 없음.
엔진이 읽는 결과를 만드는 도구
GDAL + mago 3DTerrainer · 장점
- Terrain-RGB: MapLibre·Deck.gl 지형
- quantized-mesh: CesiumJS 지형·LOD
- 지오이드 보정·최대 줌 지정 (mago 3DTerrainer)
단점
- 결과 두 벌 → 용량·시간 증가
- mago는 GeoTIFF만 읽음 (.img는 변환 먼저)
- Terrain-RGB 높이 정밀도 0.1m
GDAL + mago 3DTerrainer 요약 파일 방식
- 걸린 시간
- -
- 결과 용량
- -
- 파일 수
- -
- 그릴 수 있는 뷰어
- 3 / 4
변환 단계
1Terrain-RGB 인코딩GDAL/OGR C++, MIT, v3.13.3공간데이터 변환 표준 엔진. 래스터(GDAL)·벡터(OGR) 수백 가지 포맷.자세히 보기
gdal_calc -A /work/dem_3857.tif --outfile=/work/r.tif --calc="floor((A+10000)*10/65536)" --type=Byte --hideNoData --overwrite --quiet && gdal_calc -A /work/dem_3857.tif --outfile=/work/g.tif --calc="floor((A+10000)*10/256)%256" --type=Byte --hideNoData --overwrite --quiet && gdal_calc -A /work/dem_3857.tif --outfile=/work/b.tif --calc="floor((A+10000)*10)%256" --type=Byte --hideNoData --overwrite --quiet && gdalbuildvrt -separate /work/rgb.vrt /work/r.tif /work/g.tif /work/b.tif높이 = -10000 + (R×65536 + G×256 + B) × 0.1. gdal_calc: 실수 높이 → 0.1m 단위 정수 → R·G·B 세 바이트. gdalbuildvrt -separate: 세 밴드 묶기. 브라우저가 PNG에서 높이로 복원.
2Terrain-RGB 타일 굽기GDAL/OGR C++, MIT, v3.13.3공간데이터 변환 표준 엔진. 래스터(GDAL)·벡터(OGR) 수백 가지 포맷.자세히 보기
gdal raster tile --min-zoom 10 --max-zoom 13 --skip-blank -r nearest --overview-resampling nearest --webviewer none /work/rgb.vrt /out/terrain-rgb-r nearest --overview-resampling nearest: 인코딩 색이 섞이면 엉뚱한 높이 → 평균 대신 최근접. PNG: 무손실 필수. --skip-blank: 빈 타일 생략.
3Cesium용 quantized-mesh 생성mago 3DTerrainer Java 21, MPL-2.0, v1.14.6DEM(GeoTIFF) → Cesium 지형 포맷(quantized-mesh).자세히 보기
mago-3d-terrainer -i /work/dem.tif -o /out/terrain -g EGM2008 -max 13 -qCesium 지형: 높이 이미지 대신 삼각형 메시 타일. 평지는 큰 삼각형, 험지는 작은 삼각형 → 용량 절감. -g EGM2008: 지오이드 → 타원체 높이 보정. -max 13: 최대 줌.
결과물
Terrain-RGB 타일Terrain-RGB 타일
높이를 색으로 담은 PNG 타일. MapLibre·Deck.gl용.
quantized-mesh 타일Quantized-mesh
삼각형 메시 타일(.terrain) + 목록(layer.json). Cesium 전용.
뷰어별 처리 · GDAL + mago 3DTerrainer
OpenLayers 2D미지원
2D 지도 — 지형 입체 미지원.
MapLibre 2.5D미검증
- 결과물
- Terrain-RGB 타일 (terrain-rgb/{z}/{x}/{y}.png)
- 처리
raster-dem 소스 + setTerrain + hillshade
MapLibre + Deck.gl 3D미검증
- 결과물
- Terrain-RGB 타일 (terrain-rgb/{z}/{x}/{y}.png)
- 처리
TerrainLayer — RGB → 높이 디코딩
CesiumJS 3D미검증
- 결과물
- quantized-mesh 타일 (terrain)
- 처리
CesiumTerrainProvider
직접 처리: 원본과 같은 형식을 그대로 읽음. 변환 후 처리: 바꾼 결과물을 읽음. 일부 기능만: 그리지만 빠지는 기능 있음(카드의 주의). 미검증: 성공한 실행 기록 없음.