3단계 · GDAL 레시피
웹 형태 변환
브라우저가 바로 읽는 포맷으로 변환. 뷰어별 처리 방식.
방식·도구 고르기
통째 파일이 무거울 때: ① 타일로 굽기(파일) → 화면 범위 조각만 받음. ② 그래도 브라우저 그리기 부담 → WMS(서버)로 서버가 그림까지. 갱신·조회·연동이 필요하면 크기와 상관없이 서버.
2D 벡터 · 데이터 상태별 (크기 기준은 어림)
| 데이터 상태 | 방식 | 고르는 이유 · 형태 |
|---|---|---|
| 수 MB 이하 · 피처 수만 개 이하 | 파일 | GeoJSON 통째: 한 번 받고 끝. 클릭·필터를 브라우저에서 바로. |
| 수십 MB 이상 · 피처 수십만 개 | 파일 | MVT·PMTiles: 줌·화면 범위 타일만. 통째 GeoJSON은 파싱·메모리로 첫 화면 지연. |
| 서버 없이 큰 데이터 배포 | 파일 | PMTiles 한 파일 + Range 요청. 타일 수만 개 올리기 없음. |
| 자주 갱신 (DB에서 관리) | 서버 | martin: PostGIS 테이블을 요청 때 MVT로. 수정 즉시 반영. |
| 속성 조회 · 표준 연동 | 서버 | GeoServer WFS(조건 조회)·WMS(서버 그림). QGIS·타 시스템 연동. |
카드 안 도구 선택 → 아래 단계·결과 전환. ?: 고르는 기준·장단점.
파일 방식
맞는 경우
- 갱신 드문 데이터 (연 1회 공개 등)
- 서버 운영 없는 배포: 정적 호스팅·CDN
- 미리 구운 타일 → 요청마다 연산 없음, 동시 접속에 강함
한계
- 원본이 바뀌면 다시 굽기
- 속성 조건 조회 불가 → 받은 범위 안 클라이언트 필터만
- 타일 수만~수백만 개 → 올리기·저장 부담 (PMTiles 한 파일로 완화)
결과를 파일로 구워 정적 호스팅. 브라우저가 파일을 직접 읽음.
도구
GDAL · 장점
- SHP·GPKG·GML·FGB 등 대부분 입력
- 좌표계 변환·속성 정리·타일 굽기를 한 도구로
- 결과가 정적 파일 → 서버 불필요
단점
- MVT 폴더 = 파일 수백~수만 개 → 올리기 부담
- 줌별 단순화·밀집 제어가 tippecanoe보다 약함
- 빈 타일 미생성 → 범위 안 빈 칸은 404
tippecanoe · 장점
- 줌별 자동 단순화·밀집 피처 솎기
- PMTiles 한 파일 → 정적 호스팅 + Range 요청
- GeoJSON·FlatGeobuf 직접 입력
단점
- SHP·GPKG는 GeoJSON 추출 먼저
- Cesium 미지원 (벡터타일)
- 피처 적으면 최대 줌 추정(-zg)이 낮음 → 줌 지정 필요
PostGIS + Python · 장점
- 추출·좌표계·정리를 SQL 한 번에
- ST_AsMVT = martin 등 타일 서버와 같은 방식 → 서버 전환 쉬움
- 공간 인덱스로 큰 데이터 처리
단점
- DB 기동·적재 단계 추가
- 파일로 굽는 스크립트 직접 작성 (pg_mvt.py)
- 구운 뒤 DB가 바뀌면 다시 실행
서버 방식
맞는 경우
- 자주 바뀌는 데이터: DB 수정 즉시 반영
- 속성 조건 조회: WFS (CQL_FILTER)
- WMS·WFS 표준 요구: GIS 소프트웨어·타 기관 시스템 연동
- 저사양 단말: WMS는 서버가 그림까지 → 브라우저는 이미지만
- 접근 권한·사용량 관리
한계
- 서버 상시 운영: 메모리·DB·보안 패치
- 요청마다 연산 → 타일 캐시(GeoWebCache 등) 없으면 동시 접속에 약함
- 구성 요소 증가: DB + 서버 + 프록시
떠 있는 서버에 발행. 요청마다 서버가 응답 생성.
도구
GeoServer · 장점
- WMS·WMTS·WFS 표준 → GIS 소프트웨어·타 기관 연동
- OGC API Features: WFS 후속, 주소만으로 GeoJSON
- SLD로 서버에서 스타일
- 국내 현장 사용 많음
단점
- Java 서버 상시 운영
- 설정 단계 많음 (작업공간·저장소·스타일·레이어)
- 타일 캐시 없으면 요청마다 그림
martin · 장점
- Rust → 가볍고 빠름
- 설정 거의 없음 (표 자동 발견)
- MVT → 스타일은 브라우저에서
단점
- 시작할 때만 표 탐색 → 새 표는 재시작
- MVT만 (WMS·WFS 없음)
- Cesium 미지원 (벡터타일)
GDAL 요약 파일 방식
- 걸린 시간
- -
- 결과 용량
- -
- 파일 수
- -
- 그릴 수 있는 뷰어
- 4 / 4
변환 단계
1GeoJSON 내보내기 (OGC API Features 경로)GDAL/OGR C++, MIT, v3.13.3공간데이터 변환 표준 엔진. 래스터(GDAL)·벡터(OGR) 수백 가지 포맷.자세히 보기
ogr2ogr -f GeoJSON /out/ogc/collections/trdar/items.json /work/trdar.gpkg -lco RFC7946=YES -lco COORDINATE_PRECISION=7-lco RFC7946=YES: 브라우저 표준 GeoJSON. COORDINATE_PRECISION=7: 좌표 7자리. /collections/{id}/items: OGC API Features 도형 데이터를 /collections/{id}/items 같은 정해진 주소로 주고받는 웹 표준. WFS의 후속. 서버 방식은 GeoServer가 실제 제공, 파일 방식은 같은 구조의 정적 파일. 자세히 Features 경로, 실서버 이전 용이.
2MVT 벡터타일 분할GDAL/OGR C++, MIT, v3.13.3공간데이터 변환 표준 엔진. 래스터(GDAL)·벡터(OGR) 수백 가지 포맷.자세히 보기
ogr2ogr -f MVT /out/tiles /work/trdar.gpkg -dsco MINZOOM=11 -dsco MAXZOOM=16 -dsco COMPRESS=NO줌별 타일 피라미드 (XYZ) 줌 단계별로 256px 조각으로 미리 잘라 둔 지도. 줌 1단계마다 조각 수 4배. 자세히.pbf 타일 → 보이는 영역만 요청(대용량 대비). MINZOOM=11·MAXZOOM=16: 줌 범위. COMPRESS=NO: gzip 없이 저장.
3무결성 확인 (타일 전후 피처 수)GDAL/OGR C++, MIT, v3.13.3공간데이터 변환 표준 엔진. 래스터(GDAL)·벡터(OGR) 수백 가지 포맷.자세히 보기
n() { ogrinfo -ro -q "$@" | awk '/ = /{print $NF}'; } b=$(n /work/trdar.gpkg -dialect SQLite -sql "SELECT count(DISTINCT name) FROM trdar") [ -n "$b" ] || { echo "피처 수 읽기 실패: name"; exit 1; } echo "변환 전: 피처 $b" for z in $(seq 11 16); do set -- $(n /out/tiles/$z -dialect SQLite -sql "SELECT count(DISTINCT name), count(*) FROM trdar"); echo "줌 $z: 피처 $1, 조각 $2"; done줌마다 타일 속 고유 name 수 = 남은 피처, 전체 행 = 조각(타일 경계에서 잘려 여러 타일에 든 것 포함). 피처가 변환 전보다 적으면 그 줌에서 표시용 결과와 원본 웹 결과물은 화면용 사본. 타일 좌표 반올림, 경계 잘림, 작은 도형 제거로 원본과 달라질 수 있음 → 조회·계산은 원본 쪽 데이터로. 자세히(너무 작은 도형·밀집 제거). 줌 하나의 타일 전체 = GDAL 레이어 하나.
결과물
GeoJSONGeoJSON
상권 전체 한 파일. 소규모 데이터에 가장 단순.
MVT 벡터타일MVT 벡터타일
보이는 영역 타일만 요청. 대용량에 유리.
뷰어별 처리 · GDAL
OpenLayers 2D미검증
- 결과물
- MVT 벡터타일 (tiles/{z}/{x}/{y}.pbf)
- 처리
VectorTileLayer + VectorTileSource(MVT)
MapLibre 2.5D미검증
- 결과물
- MVT 벡터타일 (tiles/{z}/{x}/{y}.pbf)
- 처리
vector 소스 + fill·line·circle
MapLibre + Deck.gl 3D미검증
- 결과물
- MVT 벡터타일 (tiles/{z}/{x}/{y}.pbf)
- 처리
MVTLayer
CesiumJS 3D미검증
- 결과물
- GeoJSON (ogc/collections/trdar/items.json)
- 처리
GeoJsonDataSource- 메모
- MVT 미지원 → GeoJSON 사용.
직접 처리: 원본과 같은 형식을 그대로 읽음. 변환 후 처리: 바꾼 결과물을 읽음. 일부 기능만: 그리지만 빠지는 기능 있음(카드의 주의). 미검증: 성공한 실행 기록 없음.