최근 대용량 위성 이미지 데이터를 처리하면서 타일링 작업에 많은 공수가 들어가는 문제를 겪었습니다.
특히 대규모 이미지 데이터를 웹에서 효율적으로 제공하기 위해 여러 단계의 타일링 작업이 필요했고, 이는 상당한 시간과 리소스를 소모했습니다.
이러한 고민을 하던 중, 유럽 우주국(ESA)에서 제공하는 코페르니쿠스 브라우저에 대해 알게되었습니다.
이 사이트가 별도의 타일링 작업 없이도 위성 이미지를 빠르고 유연하게 제공한다는 사실에 큰 인사이트를 얻었습니다.
조사 결과, 이 서비스는 Cloud Optimized GeoTIFF(COG)라는 포맷을 활용하고 있었습니다.
COG가 어떻게 이런 효율적인 접근을 가능하게 하는지 궁금해졌고, 이 글은 그 학습의 일부를 기록해 두기 위한 개인적인 정리입니다.
공식사이트 를 바탕으로 최대한 이해하기 쉽게 풀어 쓴 글이며, 부족한 부분이 있을 수 있습니다.
COG란 무엇인가?
COG를 이해하기 쉽게 책으로 비유해보겠습니다. 기존의 GeoTIFF는 한 페이지씩 순서대로 읽어야 하는 책과 같습니다. 특정 내용을 찾으려면 처음부터 끝까지 읽어야 하죠. 반면 COG는 목차와 색인이 잘 정리된 책과 같습니다. 원하는 내용을 바로 찾아볼 수 있고, 필요한 부분만 읽을 수 있습니다.
COG의 핵심은 다음 두 기술에 있습니다:
- HTTP Range 요청: 클라이언트가 필요한 파일의 일부분(바이트 범위)만 선택적으로 요청할 수 있습니다.
- GeoTIFF 구조의 최적화: 데이터를 타일 단위로 저장하고, 다중 해상도 오버뷰(Overviews)를 함께 포함합니다.
GeoTIFF 구성 방식
COG는 다음 세 가지 기술을 통해 대용량 이미지의 효율적인 전달을 가능하게 합니다.
1. 타일링 (Tiling)
1) 기존 방식의 한계
기존의 GeoTIFF 파일은 이미지 데이터를 하나의 연속된 스트라이프로 저장했습니다. 이는 마치 긴 종이에 그림을 그린 것과 같습니다. 특정 부분을 보고 싶다면, 전체 종이를 펼쳐야 했습니다. 이는 대용량 이미지를 다룰 때 큰 문제가 되었습니다. 예를 들어, 1GB 크기의 위성 이미지에서 특정 지역만 보고 싶어도 전체 파일을 다운로드해야 했습니다.
2) COG 타일링 방식
COG는 이 문제를 해결하기 위해 이미지를 작은 정사각형 타일로 분할합니다. 각 타일은 독립적으로 접근할 수 있어, 필요한 부분만 선택적으로 로드할 수 있습니다. 이는 마치 큰 퍼즐을 작은 조각들로 나누어 놓은 것과 같습니다. 원하는 부분만 꺼내서 볼 수 있고, 나머지는 그대로 두어도 됩니다.
3) 타일링의 장점
1. 빠른 접근
- 필요한 부분만 선택적으로 로드
- 전체 이미지를 다운로드할 필요 없음
2. 효율적인 메모리 사용
- 필요한 타일만 메모리에 로드
- 시스템 리소스 절약
3. 병렬 처리 가능
- 여러 타일을 동시에 처리
- 처리 속도 향상
2. 오버뷰 (Overviews)
1) 오버뷰의 필요성
대용량 이미지를 웹에서 제공할 때, 사용자의 화면 크기나 네트워크 상태에 따라 적절한 해상도의 이미지를 제공하는 것이 중요합니다. 오버뷰는 이 문제를 해결하기 위해 원본 이미지의 다운샘플링된 버전들을 제공합니다. 이는 마치 지도의 축척을 다르게 한 여러 버전을 준비해두는 것과 같습니다.
2) 오버뷰의 구성 방식
오버뷰는 여러 해상도 레벨로 구성됩니다. 가장 낮은 해상도에서는 전체 이미지를 한 눈에 볼 수 있어서, 마치 나라 전체를 보여주는 지도처럼 대략적인 모양만 파악할 수 있습니다. 중간 해상도는 그보다 더 자세해서, 도시 지도를 보는 느낌입니다. 가장 높은 해상도는 원본 이미지와 거의 같아서 아주 세밀한 부분까지 볼 수 있습니다.
3) 오버뷰의 실제 적용
오버뷰를 사용하면 다음과 같은 이점이 있습니다. 이미지를 처음 불러올 때는 낮은 해상도 (작은 오버뷰)를 먼저 보여줄 수 있어서, 전체 로딩 시간이 훨씬 짧아집니다. 그리고 사용자가 특정 부분을 확대하면 그 부분만 더 선명한 오버뷰로 바꿔서 보여줄 수 있습니다. 덕분에 확대하거나 축소할 때 화면 전환이 자연스럽고 끊김 없이 느껴집니다.
4) 오버뷰의 장점
1. 빠른 초기 로딩
- 작은 오버뷰로 빠른 전체 이미지 확인
2. 효율적인 줌 레벨 관리
- 각 줌 레벨에 맞는 오버뷰 사용
- 부드러운 줌 인/아웃 경험
3. 네트워크 대역폭 절약
- 필요한 해상도만 다운로드
- 불필요한 데이터 전송 방지
+) 타일링과 오버뷰의 조합
1) 두 기술의 시너지
타일링과 오버뷰는 서로 보완적인 관계에 있습니다. 타일링은 이미지를 공간적으로 분할하여 효율적인 접근을 가능하게 합니다. 오버뷰는 이미지를 해상도별로 분할하여 다양한 상황에 맞는 이미지를 제공합니다. 이 두 기술이 결합되면, 대용량 이미지를 효율적으로 처리하고 제공할 수 있습니다.
2) 실제 사용 시나리오
이미지를 처음 불러올 때는 작은 오버뷰를 이용해서 전체 그림을 빠르게 보여줄 수 있습니다. 그리고 사용자가 특정 지역을 확대하면, 그 부분에 해당하는 타일만 불러와서 더 선명하게 고해상도 오버뷰를 보여줍니다. 이미지를 움직이거나 줌 인/아웃할 때, 필요한 타일만 동적으로 불러오기 때문에, 화면이 부드럽고 끊김 없이 느껴집니다.
3) 최적화 고려사항
타일링과 오버뷰를 적용할 때는 몇 가지 고려사항이 있습니다. 타일의 크기는 너무 작으면 타일 수가 많아져 오버헤드가 증가하고, 너무 크면 메모리 사용량이 증가합니다. 오버뷰의 레벨은 너무 적으면 줌 레벨 간 갭이 발생하고, 너무 많으면 파일 크기가 증가합니다. 따라서, 사용 패턴에 맞는 최적의 설정을 찾는 것이 중요합니다.
3. HTTP GET Range Request
1) Range 요청
HTTP 1.1에서 도입된 기능으로, 클라이언트(브라우저, 앱 등)가 서버에 데이터를 요청할 때 파일 전체가 아니라, 필요한 '일부 바이트'만 요청할 수 있게 해주는 기능입니다.
서버가 응답 헤더에 'Accep-Ranges: bytes'를 포함하면, 클라이언트는 원하는 부분(바이트 범위)만 지정해서 요청할 수 있습니다.
이 방식은 Byte Serving이라고도 불리며, 예를 들어 동영상 스트리밍처럼 전체 파일을 다 받지 않고도 일부만 받아서 바로 재생할 수 있게 해줍니다.
2) 클라우드 스토리지와의 관계
Amazon S3, Google Cloud Storage, Microsoft Azure 등 대부분의 클라우드 오브젝트 스토리지는 Range 요청을 기본적으로 지원합니다.
즉, 클라우드에 저장된 파일은 클라이언트가 원하는 부분만 빠르게 받아올 수 있습니다.
COG의 장점과 도입 이유
1. 클라우드 환경에 최적화된 지리공간 데이터 포맷
최근 많은 지리공간(geospatial) 데이터가 S3, Google Cloud Storage와 같은 클라우드 기반 오브젝트 스토리지로 이동하고 있습니다.
하지만 기존 GIS 파일 포맷은 클라우드에 저장할 수 있어도, 웹 맵 타일 서비스 제공, 실시간 데이터 처리 등을 효율적으로 지원하지 못합니다. 대부분의 경우 데이터를 전부 다운로드하거나 별도의 최적화 작업이 필요합니다.
2. COG의 핵심 장점
- 효율적인 데이터 스트리밍: COG는 필요한 데이터 조각만 네트워크로 스트리밍 할 수 있습니다. 전체 파일을 다운로드 하지 않고도, 필요한 부분만 빠르게 접근할 수 있습니다.
- 클라우드 기반 워크플로우 지원: Planet Platform, GBDX 등 주요 온라인 이미지 플랫폼에서 COG를 활용해 이미지를 실시간으로 처리하고 제공합니다. GeoTrellis, Google Earth Engine, IDAHO 등 최신 분산 지리공간 소프트웨어도 COG를 직접 활용해 각 노드가 필요한 부분만 스트리밍하여 처리할 수 있습니다.
- OGC 표준 기반, 높은 호환성: COG는 OGC(Open Geospatial Consortium) 표준의 일부로, 앞으로 더 많은 소프트웨어와 도구에서 네이티브로 지원될 예정입니다. 기존 GeoTIFF 표준을 기반으로 하므로, COG를 지원하지 않는 레거시 소프트웨어에서도 전체 파일을 다운로드해 읽을 수 있습니다.
- 데이터 중복 최소화: COG를 사용하면 데이터 제공자가 여러 포맷으로 파일을 중복 제공할 필요가 없습니다. 하나의 COG 파일만 업로드하면, 스트리밍이 가능한 최신 소프트웨어와, 전체 다운로드가 필요한 레거시 소프트웨어 모드에서 활용할 수 있습니다.
COG 시작하기
데이터 제공자 (Data Provider), 개발자 (Developers) 모두에게 명확한 워크플로우를 제공합니다.
1. 데이터 제공자 (Data Provider)
1) 기존 GeoTIFF를 COG로 변환하기
: 대부분의 경우, 이미 GeoTIFF 포맷으로 데이터를 제공하고 있을 것입니다. 완전히 새로운 포맷을 만들 필요 없이 기존 GeoTIFF를 COG 규격에 맞게 변환하면 됩니다.
- 변환 방법 (대표 예시, GDAL 사용):
gdal_translate in.tif out.tif -co TILED=YES -co COPY_SRC_OVERVIEWS=YES -co COMPRESS=DEFLATE
- TILED=YES: 타일 구조로 저장
- COPY_SRC_OVERVIEWS=YES: 오버뷰(다중 해상도) 복사
- COMPRESS=DEFATE: 압축 적용
이 설정을 적용하면, COG를 지원하는 모든 소프트웨어에서 데이터를 올바르게 읽을 수 있습니다.
2) HTTP Range 요청을 지원하는 서버에 업로드
- 변환된 COG 파일을 HTTP Range 요청을 지원하는 웹 서버에 업로드해야 합니다.
- 가장 쉬운 방법은 Amazon S3, Google Cloud Storage, Azure와 같은 주요 클라우드 오브젝트 스토리지를 활용하는 것입니다.
- 대부분의 최신 웹 서버도 기본적으로 Range 요청을 지원하므로, 별도의 추가 설정 없이 바로 사용할 수 있습니다.
- 필요하다면 다양한 인증 프로토콜도 적용할 수 있습니다 (GDAL VSI 문서 참고)
2. 개발자 (Developers)
1) COG 읽기 (Reading a Cloud Optimized GeoTIFF)
- C/C++ 또는 Python 개발자
- COG의 장점을 최대한 활용하려면 GDAL 라이브러리와 VSI Curl 기능을 사용하는 것이 가장 쉽고 빠릅니다.
- 대부분의 지리공간 소프트웨어가 GDAL을 기반으로 하므로, GDAL을 활용하면 COG 지원이 자연스럽게 이루어집니다.
- 자세한 사용법은 GDAL Wiki의 How to read it with GDAL 섹션을 참고하시길 바랍니다.
- Java 개발자
- Java2D 프레임워크와 잘 통합되는 순수 Java 리더(GeoTools, Apache SIS 등)를 사용할 수 있습니다.
- 파일 시스템, HTTP, S3 등 다양한 환경에서 COG의 특성을 활용할 수 있습니다.
2) COG 생성
- GDAL 3.1 이상: 내장된 COG 프로바이더를 사용해 타일링 및 오버뷰(다중 해상도) 생성이 자동으로 처리됩니다.
gdal_translate input.tif output_cog.tif -of COG -co COMPRESS=LZW
- 구버전 GDAL: 아래와 같이 옵션을 직접 지정해 변환할 수 있습니다.
gdal_translate in.tif out.tif -co TILED=YES -co COPY_SRC_OVERVIEWS=YES -co COMPRESS=DEFLATE
- rio-cogeo 플러그인 사용: Python 환경에서는 rio-cogeo 플러그인으로도 손쉽게 COG를 생성할 수 있습니다.
rio cogeo create in.tif out.tif --cog-profile deflate
3) OpenLayers에서 불러오기
- OpenLayers는 기본적으로 GeoTIFF 파일을 직접 읽을 수 있는 기능을 제공합니다.
- COG는 GeoTIFF의 일종이므로, HTTP Range 요청을 지원하는 서버(예: S3, GCS, Azure 또는 Range 지원 웹서버)에 업로드 된 COG 파일이라면 OpenLayers에서 바로 사용할 수 있습니다.
레이어 추가 예시
import GeoTIFF from 'ol/source/GeoTIFF';
import {Map, View} from 'ol';
import {TileLayer} from 'ol/layer';
// COG 파일의 URL (HTTP Range 지원 서버에 있어야 함)
const cogUrl = 'https://your-bucket.s3.amazonaws.com/your-cog.tif';
const map = new Map({
target: 'map', // HTML element id
layers: [
new TileLayer({
source: new GeoTIFF({
sources: [
{
url: cogUrl,
},
],
}),
}),
],
view: new View({
center: [0, 0], // EPSG:3857 좌표계 기준
zoom: 2,
}),
});
4) 주의점
- 서버에 올린 파일이 공개 (Public) 되어 있어야 OpenLayers 등에서 접근할 수 있습니다.
- 또한 인증이 필요한 경우에는 Signed URL(임시 접근 URL)을 생성해서 사용할 수 있습니다.
출처