# 항공영상 TIF → TMS 타일 변환 가이드 대용량 항공영상(약 **1TB GeoTIFF**)을 **OpenLayers에서 사용할 TMS 타일**로 변환하는 절차를 정리한다. 본 가이드는 **GDAL 기반 처리**를 기준으로 작성되었으며 다음 환경을 기준으로 한다. * GDAL (OSGeo4W) * OpenLayers 3.x * 좌표계: **EPSG:5187 → EPSG:3857** * 타일 포맷: **JPEG** * 타일 레벨: **16 ~ 20** --- # 전체 작업 흐름 ``` 원본 TIFF │ ├─ 1. tif 정보 확인 │ ├─ 2. JPEG 압축 GeoTIFF 생성 (용량 최적화) │ ├─ 3. 좌표계 변환 (5187 → 3857) │ └─ 4. TMS 타일 생성 ``` --- # 1. TIFF 정보 확인 먼저 원본 TIFF의 메타데이터를 확인한다. ```bash gdalinfo "E:\UJ_2025_10.tif" ``` 확인해야 할 주요 정보 | 항목 | 확인 이유 | | ----------------- | -------------- | | Coordinate System | 좌표변환 필요 여부 확인 | | Pixel Size | 영상 해상도 확인 | | Band Count | RGB인지 확인 | | Image Size | 처리시간 예측 | | Compression | 이미 압축된 파일인지 확인 | ### 주의사항 대용량 TIFF의 경우 아래 정보가 중요하다. * **Band 수** RGB 영상이라면 보통 **3 bands** * **Block Size** 타일 생성 시 성능과 관련됨 * **BigTIFF 여부** 4GB 이상 파일은 BigTIFF 필요 --- # 2. 원본 TIFF 압축 저장 (JPEG 압축) 외장하드의 대용량 TIFF를 **로컬 SSD로 이동하면서 JPEG 압축 GeoTIFF 생성**. ```bash gdal_translate -of GTiff ^ -b 1 -b 2 -b 3 ^ -co COMPRESS=JPEG ^ -co JPEG_QUALITY=70 ^ -co PHOTOMETRIC=YCBCR ^ -co TILED=YES ^ -co BLOCKXSIZE=512 ^ -co BLOCKYSIZE=512 ^ -co BIGTIFF=YES ^ -co NUM_THREADS=ALL_CPUS ^ --config GDAL_CACHEMAX 8192 ^ E:\UJ_2025_10.tif D:\tiffs\UJ_2025_10_extreme.tif ``` ## 옵션 설명 | 옵션 | 설명 | | -------------------- | ---------------- | | -of GTiff | 출력 포맷 GeoTIFF | | -b 1 -b 2 -b 3 | RGB 밴드 선택 | | COMPRESS=JPEG | JPEG 압축 사용 | | JPEG_QUALITY=70 | 압축 품질 (50~80 권장) | | PHOTOMETRIC=YCBCR | JPEG 압축 효율 증가 | | TILED=YES | 타일 구조 TIFF 생성 | | BLOCKXSIZE=512 | 타일 크기 | | BLOCKYSIZE=512 | 타일 크기 | | BIGTIFF=YES | 4GB 이상 파일 지원 | | NUM_THREADS=ALL_CPUS | CPU 멀티코어 사용 | | GDAL_CACHEMAX | 메모리 캐시 (MB) | --- ## 성능 팁 ### JPEG_QUALITY | 값 | 용도 | | -- | ------- | | 90 | 고품질 | | 70 | 일반 항공영상 | | 50 | 최대 압축 | 항공영상 배경지도 용도라면 **70 추천** --- ### BLOCK SIZE 512x512 추천 이유 * GDAL 내부 처리 효율 * 타일 생성 속도 개선 * 디스크 IO 감소 --- ### GDAL_CACHEMAX 메모리 캐시 설정 예시 ``` --config GDAL_CACHEMAX 8192 ``` 의미 ``` 8GB 메모리 사용 ``` --- # 3. 좌표변환 (EPSG:5187 → EPSG:3857) OpenLayers에서 사용하려면 **Web Mercator(3857)** 좌표계로 변환한다. ```bash gdalwarp -s_srs EPSG:5187 -t_srs EPSG:3857 ^ -r bilinear ^ -of GTiff ^ -co COMPRESS=JPEG -co JPEG_QUALITY=70 -co PHOTOMETRIC=YCBCR ^ -co TILED=YES -co BLOCKXSIZE=512 -co BLOCKYSIZE=512 ^ -co BIGTIFF=YES ^ -wm 8192 ^ --config GDAL_NUM_THREADS ALL_CPUS ^ D:\tiffs\UJ_2025_10_extreme.tif D:\tiffs\UJ_2025_10_3857_final.tif ``` --- ## 옵션 설명 | 옵션 | 설명 | | ---------------- | ---------------- | | -s_srs | 원본 좌표계 | | -t_srs | 목표 좌표계 | | -r bilinear | 보간법 | | -wm | warp memory (MB) | | GDAL_NUM_THREADS | 멀티코어 사용 | --- ## 보간법 선택 | 옵션 | 용도 | | -------- | ---------- | | nearest | 범주형 데이터 | | bilinear | 일반 영상 (추천) | | cubic | 고품질 영상 | 항공영상은 **bilinear 추천** --- # 4. TMS 타일 생성 최종적으로 **OpenLayers용 TMS 타일 생성** ```bash gdal2tiles ^ --zoom=16-20 ^ --processes=8 ^ -w openlayers ^ --tmscompatible ^ --tiledriver=JPEG ^ D:\tiffs\UJ_2025_10_3857_final.tif D:\tiles\UJ_2025 ``` --- ## 옵션 설명 | 옵션 | 설명 | | --------------- | ---------------- | | --zoom | 생성 타일 레벨 | | --processes | 멀티프로세스 수 | | -w openlayers | OpenLayers 뷰어 생성 | | --tmscompatible | TMS 방식 타일 | | --tiledriver | JPEG 타일 | --- ## zoom 레벨 선택 일반적인 지도 기준 | Zoom | 용도 | | ----- | ---- | | 12~14 | 광역지도 | | 15~17 | 도시 | | 18~20 | 항공영상 | 항공영상은 ``` 16~20 ``` 추천 --- ## processes 옵션 멀티코어 처리 예시 ``` --processes=8 ``` 주의 CPU 코어보다 많으면 오히려 느려질 수 있음 --- # 최종 결과 | 항목 | 결과 | | ------ | ------- | | 원본파일 | 약 1TB | | 압축파일 | 약 1.8GB | | 압축시간 | 2시간 49분 | | 좌표변환 | 28분 | | TMS 생성 | 14시간 | | TMS 파일 | 약 24GB | --- # 추가 최적화 팁 (매우 중요) ### 1TB 영상 처리 권장 환경 | 항목 | 권장 | | --- | -------- | | RAM | 32GB 이상 | | SSD | NVMe | | CPU | 8core 이상 | --- ### 디스크 IO 병목 방지 가능하면 ``` 외장 HDD → SSD ``` 로 복사 후 작업 --- ### GDAL 병렬 처리 환경변수 추가 가능 ``` set GDAL_NUM_THREADS=ALL_CPUS ``` --- # OpenLayers 사용 예시 ```javascript new ol.layer.Tile({ source: new ol.source.XYZ({ url: '/tiles/UJ_2025/{z}/{x}/{y}.jpg' }) }); ```