개요
몇개월 동안 업로드가 뜸해서 글 연습 겸 타일에 대해 당연하다고 여길 수도 있지만 처음 마주하면 낯선 타일의 '크기' 개념을 정리하겠다.
본문
최근에 실무에서 raster 타일을 mbtiles라는 형식으로 만들어달라는 요청이 있었다. 음. 타일의 일종인가 보다.
sqlite에서 쓰고, db에서 타일을 관리할 수 있는 개념인가 보다.
그렇게 어렵지 않은 요청이다. gdal로 간단히 처리할 수 있었다.
mbtiles 변환하기
mbtiles 자체는 다음과 같이 변환한다.
gdal_translate -of MBTILES -co ZOOM_LEVEL_STRATEGY=AUTO input.tif output.mbtiles
여기서 주목해야 할 변수는 ZOOM_LEVEL_STRATEGY=AUTO이다.gdal_translate 자체는 절대 zoom level을 설정할 수 있는 기능이 없다.
(여기서 gemini 1패)
그렇다면 저 변수는 무엇인가? 저건 '이미지의 resolution 정보를 기반으로 이미지가 tile zoom level의 몇 레벨에 해당하는지' 계산 전략을 정하는 변수이다. 줌 레벨 설정하기는 다음 항목에서 다루겠다.
참고로 gdal2tiles라는 오픈소스가 있다. 좀 오래되기도 했고, 이 것을 설치하고 빌드하고 별의별 짓을 다 해봤는데 broken dependency 때문에 사용하지 않았다. 빠른 일처리를 위해 gemini 찬스를 좀 써보려고 했는데, 그것의 조언과 실제 상황은 달랐다. (gemini 2패)
zoom level 설정하기
여기에 한가지 더 요청 사항이 있었다.
zoom level을 10에서 20까지로 만들어 주세요.
결론부터 말하자면 이 요청 사항은 불가능한 요청이었다.
이 요청을 가능하게 만들려면 다음과 같이 주문해야 한다.
데이터의 width, height를 고려해 zoom level 설정 가능값의 최대 ~ 최소값 이내에서 설정해 주세요.
이게 무슨 말인지 이제 예제 데이터를 통해 설명하겠다.
데이터는 sentinel-2 데이터를 사용하겠다. (접속 링크 : https://browser.dataspace.copernicus.eu/)
해당 데이터 크기는 가로 세로 11492로 동일하다.
그리고 zoom level을 부여하는 gdal 명령어는 아래와 같다.
gdaladdo -r average example_converted.mbtiles 2 4 8 16 32 64 128 256 512
내가 생성할 수 있는 최대 줌 레벨 수는?
tile의 개념은 하나의 큰 덩어리를 가로 세로로 등분해서 내려가는 방식이다.

이렇게 계속 등분하면서 내려간다.
등분하는 데에는 규칙도 있다. 어느 줌 레벨에서 시작하던 가장 숫자가 낮은(해상도가 낮은) 줌레벨의 이미지 크기는 256 * 256에 근사한다.
그러니까 타일의 크기 말이다. 타일의 크기에는 정해진 표준은 없지만, 대부분의 오픈 소스에서 256으로 상정하고 쓰기 때문에 그에 맞춰 쓴다.
gdaladdo는 default로 256을 상정하고, 타일 크기가 256 이하로 내려가면 타일 생성을 멈춘다.
링크
내가 생성할 수 있는 최소 줌 레벨 수는?
다시 본론으로 돌아와서, 그래서 gdaladdo는 등분을 하라는 명령으로 뒤에 2의 제곱수를 입력으로 넣으라고 명시한다.
gdalinfo로 확인했을 때는 resolution이 10m이고, 따라서 max zoom level이 14로 나왔다.
2의 제곱수로 min(w,h)를 나눴을 때, 최소가 되는 제곱수의 지수를 x라고 할 때 min zoom level은 max_zoom_level - x가 된다.
결론은 최소 zoom level은 raster의 크기에 따라 정해진다.
따라서 해당 이미지는 최대 14, 최소 8의 zoom level을 가지게 된다.
gdalinfo로 생성된 타일의 크기를 보면 좀 더 쉽게 이해할 수 있다.
아래는 각 줌 레벨별로 생성된 타일 크기를 보여주는 부분이다.

결론
정리하면, 최대 줌 레벨은 이미지의 해상도에 따라 결정되고, 최소 줌 레벨은 이미지의 크기에 따라 결정된다.
최대 줌 레벨은 원본 이미지의 해상도에 따라 정해둔 값이 있기 때문이고, 타일 생성 방법은 원본 이미지를 등분해서 내려가는 방식이기 때문에 이미지의 크기에 따라 결정된다.
gdaladdo는 이번 작업을 하면서 처음 쓰게 된 툴인데, 편하려고 쓴 gemini가 오답을 알려줘서 조금 헤맸다.
결국 나를 구원한 것은 gdal 공식 문서였다.
뱀발 - ai 에이전트
글 중간 중간에 gemini를 디스하는 글들이 보이는데 사실 gemini 보다는 생성형 ai의 한계를 디스하고 싶었다.
질문을 하면 그에 대한 쌍으로 그럴싸한 답을 내놓는 방식인 '생성형'이 지금 ai 에이전트의 원리다.
이걸 생각하지 않고 무작정 답으로 믿어버리는 경우가 많다.
특히 내가 '이거 왜 이렇게 구현했어요?' 라고 하면 'gpt가 이렇게 짜래요.'
혹은 고객이 'gpt가 이게 맞다고 하던데요' 라고 하면 나는 속절없이 그게 왜 답이 아닌지에 대해 시간을 더 쓰게 된다.
gpt 결과에 대해 검증을 하지 않으면, 검증하는데 드는 비용은 결국 상대방, 더 나아가서 결국 단체가 비용을 더 쓰게 된다고 생각한다.
무지성으로 쓰는게 아니라 핵심 개념과 방향을 얻고, 주체적으로 정보를 골라 써야 할 것이다.
그러니까 'gpt가 맞다고 하는데요' 라고 하면 여러 방면으로 상대에게 매우 실례가 되기 때문에 지양하자.
'GIS' 카테고리의 다른 글
| [GIS]국토지리원, EPSG:5179(UTM-K), QGIS (0) | 2025.01.15 |
|---|---|
| [GeoTIFF] GeoTIFF 파일의 corner coordinates를 구하자 (0) | 2024.10.30 |
| [GeoPandas] 사용 시 알아두면 좋은 점들 (0) | 2024.08.05 |
| [GeoTIFF] GEOS projection을 따르는 위성 영상을 EPSG:4326으로 재투영하는 방법 (1) | 2024.08.04 |
| GeoTransform과 GeoReference (0) | 2024.05.18 |