PART 05 / CHAPTER 15
15 · Rasterio란 무엇인가: band·격자·NoData
래스터를 파일·배열·지상 좌표의 세 층으로 이해합니다.
이 페이지에서
학습 목표: 래스터를 파일·배열·지상 좌표의 세 층으로 이해합니다.
준비: 실행 환경 · 도구와 용어. 예제 자료는 별도 표시가 없는 한 합성 자료입니다.
개념
Rasterio는 GeoTIFF 같은 지리참조 래스터를 읽고 쓰는 Python 라이브러리입니다. 공간 파일을 여는 일은 Rasterio가, 읽어 온 셀을 계산하는 일은 주로 NumPy가 맡습니다. NumPy는 같은 자료형의 숫자를 다차원 배열로 저장하고 빠르게 계산하는 라이브러리입니다.
래스터는 행·열로 나눈 격자이고, band는 각 위치에서 측정한 값의 한 층입니다. DEM은 고도 값을 담는 래스터의 예입니다. resolution은 셀의 지상 크기, NoData는 관측되지 않았거나 분석에서 제외할 값을 뜻합니다. CRS와 transform이 있어야 배열의 행·열을 실제 지상 위치에 연결할 수 있습니다.
왜 필요한가
숫자 배열을 PNG로만 저장하면 좌표와 NoData 정보가 사라집니다. 분석 결과를 GIS에서 다시 쓰려면 배열뿐 아니라 위치·단위·유효값 정보를 보존해야 합니다.
핵심 API
rasterio.open(), src.read(1, masked=True), src.crs, src.transform, src.res, src.nodata, src.profile을 확인합니다. Rasterio의 밴드 번호는 1부터, NumPy 인덱스는 0부터 시작합니다.
최소 실행 예제
import numpy as np
from rasterio.io import MemoryFile
from rasterio.transform import from_origin
z = np.array([[10, 11, -9999], [12, 13, 14]], dtype="float32")
profile = dict(driver="GTiff", height=2, width=3, count=1,
dtype="float32", crs="EPSG:5179",
transform=from_origin(953000, 1952000, 2, 2), nodata=-9999)
with MemoryFile() as memory:
with memory.open(**profile) as dst:
dst.write(z, 1)
with memory.open() as src:
arr = src.read(1, masked=True)
assert arr.count() == 5
assert src.res == (2, 2)
print("shape:", arr.shape, "valid mean:", float(arr.mean()))
print("upper-left cell center:", src.xy(0, 0))
조경·도시 실무 예제
2m 격자의 합성 고도 6셀 중 하나는 NoData입니다. 유효한 다섯 셀 평균은 12m입니다. 실제 DEM의 표고 기준이 정표고인지 타원체고인지도 확인해야 BIM 높이와 비교할 수 있습니다.
시각화와 결과 읽기
위에서 아래로 증가하는 행 번호와 북쪽으로 증가하는 지상 y좌표는 방향이 반대일 수 있습니다. 배열 모서리와 셀 중심을 구별해 그림에 표시하세요.
흔한 오류
NoData=-9999를 일반 고도로 평균 내면 틀립니다. read()는 (band,row,col), read(1)은 (row,col)입니다. 해상도 단위는 항상 m가 아니라 CRS에 따릅니다.
연습문제
셀 크기를 5m로 바꾸고 같은 배열의 지상 면적이 얼마나 달라지는지 계산하세요.
전체 예제 내려받기 · 실행: python chapter15.py
다음 단계
16 · 마스킹·자르기·재투영·격자 정렬로 이어집니다.
출처
Rasterio 읽기, Rasterio 지리참조, NumPy 소개. 확인 2026-09-30.
