파이썬에서 Rasterio 기반 래스터 데이터 다루기

2026. 2. 3. 12:46·GIS/01. GIS TIL

2026.02.02 - [GIS/01. GIS TIL] - 파이썬에서 GeoPandas 기반 벡터 데이터 다루기

 

파이썬에서 GeoPandas 기반 벡터 데이터 다루기

2026.02.01 - [GIS/01. GIS TIL] - GIS 분석을 위한 환경설정(with conda, uv) GIS 분석을 위한 환경설정(with conda, uv)Geospatial 데이터를 다루는 유튜브에서 OpenSource Geospatial 전문가 유튜버의 영상을 자주 시청했다

dalleeoppaa.tistory.com

이전 글에서는 GeoPandas 기반으로 벡터 데이터 다루기에 대해 알아봤고 이번 글에서는 래스터 데이터를 다룰 수 있는 Rasterio를 알아보자.

1️⃣ Rasterio 기초

1-1. 래스터 데이터란?

래스터 데이터는 세계를 픽셀(셀)의 격자로 나타내는 지리공간 데이터의 기본 유형입니다. 격자의 각 픽셀
은 다음과 같은 지리적 정보를 나타내는 값을 포함합니다:

  • 고도 (디지털 고도 모델에서)
  • 온도 (기후 데이터에서)
  • 반사율 값 (위성 이미지에서)
  • 토지 피복 유형 (분류 지도에서)

래스터 데이터의 주요 특성은 다음과 같습니다:

  1. 공간 해상도: 실제 세계 단위로 각 픽셀의 크기 (예: 30미터)
  2. 범위: 래스터가 커버하는 지리적 영역
  3. 좌표 참조 시스템(CRS): 픽셀 격자가 실제 세계 좌표와 어떻게 관련되는지
  4. 밴드 수: 일부 래스터는 여러 밴드를 가지고 (RGB 이미지처럼), 다른 것들은 단일 밴드를 가집니다 (고도
    데이터처럼)

1-2. Rasterio를 사용하는 이유

  • 메모리 효율성 : 청크 단위로 데이터를 읽어 대용량 데이터셋 처리 가능
  • 지리공간 인식 : 데이터의 공간 참조 정보를 유지
  • 통합 : 다른 파이썬 라이브러리와 원활하게 작동
  • 성능 : 지리공간 연산에 고도로 최적화된 GDAL로 구축

2️⃣ Rasterio 실습

2-1. 데이터 불러오기

import rasterio
import rasterio.plot
import geopandas as gpd
import numpy as np
import matplotlib.pyplot as plt
# Set font family to AppleGothic for Korean support
plt.rc('font', family='AppleGothic')
# Fix minus sign display issue
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams["figure.dpi"] = 150
raster_path = (
    "https://github.com/opengeos/datasets/releases/download/raster/dem_90m.tif"
)

src = rasterio.open(raster_path)
print(src)

# 전체 메타데이터 확인하기
print("raster's metadata")
for key, value in src.meta.items():
    print(f"{key}: {value}")

# 좌표계 확인하기
print(f"CRS: {src.crs}")

# 래스터의 픽셀 크기
print(f"pixel size (x, y): {src.res}")
# 래스터의 차원
print(f"rasters's dimension: {src.width} x {src.height} pixel")
# 바운더리 확인하기
print(f"geometry boundary: {src.bounds}")

# 데이터 타입
print(f"data type: {src.dtypes}")
# 밴드 개수
print(f"band count: {src.count}")

2-2. 아핀 변환(Affine Transformation)

GIS의 아핀 변환은 래스터 데이터에서 픽셀 좌표를 실제 공간상의 지리 좌표로 대응시키기 위한 변환 관계를 의미한다.

print("Affine Transformation")
print(src.transform)

행렬이 의미하는 실제 수식

  • X=90.00*col + 0.00*row − 13442488.34
  • Y=0.00*col − 90.00*row + 4668371.58

픽셀 해상도

  • 한 픽셀 = 90m * 90m

좌표 원점

  • 13442488.34 -> 좌상단 픽셀의 X좌표
  • 4668371.58 -> 좌상단 픽셀의 Y좌표
  • 즉, 래스터의 (0, 0) 픽셀이 이 위치에 있음

2-3. 래스터 데이터 시각화

rasterio.plot.show(src)

3️⃣ 컬러맵 시각화

컬러맵(cmap)은 래스터 데이터를 더욱 효과적으로 시각화 할 수 있게 만들어준다. 일반적인 컬러맵에는 다음과 같이 표현된다.

  • `terrain` : 고도 데이터에 적합, 직관적인 색상으로 낮은 값에서 높은 값을 보여줌
  • `viridis` : 지각적으로 균일한 컬러맵으로 일반적인 용도에 적합
  • `gray` : 단일 밴드 데이터 시각화에 유용
  • `RdYlBu` : 빨강-노랑-파랑으로 양수와 음수 값을 보여주는데 적합

(1) terrain 컬러맵

# 컬러바 추가
elev_band = src.read(1)
plt.figure(figsize=(8,8))
plt.imshow(elev_band, cmap="terrain")
plt.colorbar(label="고도(미터)", shrink=0.5)
plt.title("지형 컬러맵이 적용된 DEM")
plt.show()

(2) 다중 밴드 시각화(멀티 밴드)

다중 밴드 래스터(위성 이미지)로 작업할 때 개별 밴드를 시각화하거나 결합하여 합성 이미지를 만들 수 있다.

raster_path = "https://github.com/opengeos/datasets/releases/download/raster/LC09_039035_20240708_90m.tif"
src = rasterio.open(raster_path)
rasterio.plot.show((src, 1), cmap="gray", title="밴드 1")

(3) RGB 합성

위성 이미지의 경우 Red, Green, Blue를 결합하여 트루컬러 합성을 만들 수 있습니다.

nir_band = src.read(5)
red_band = src.read(4)
green_band = src.read(3)

# 밴드들을 단일 배열로 스택
rgb = np.dstack((nir_band, red_band, green_band)).clip(0, 1)

# 스택된 배열 플롯
plt.figure(figsize=(8, 8))
plt.imshow(rgb)
plt.title("NIR, Red, Green 밴드 결합")
plt.show()

(4) 다중 패널 플롯 생성

모든 밴드를 시각화하기 위해 각 밴드를 해당 이름과 함께 표시하는 다중 패널 플롯을 생성하기

band_names = ["Coastal Aerosol", "Blue", "Green", "Red", "NIR", "SWIR1", "SWIR2"]

fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(8, 10))
axes = axes.flatten() # 효율적인 for문 반복을 위해 2D축 배열을 1D로 평탄화

for band in range(1, src.count):
    data = src.read(band)
    ax = axes[band - 1]
    im = ax.imshow(data, cmap="gray", vmin=0, vmax=0.5)
    ax.set_title(f"밴드 {band_names[band - 1]}")
    fig.colorbar(im, ax=ax, label="반사율(Reflectance)", shrink=0.5)

plt.tight_layout()
plt.show()

4️⃣ 벡터 데이터 오버레이

래스터 데이터와 벡터 데이터를 함께 올려서 시각화하는 방법

# 래스터 데이터 로드
raster_path = (
"https://github.com/opengeos/datasets/releases/download/raster/dem_90m.tif")
src = rasterio.open(raster_path)
# 벡터 데이터 로드
vector_path = ("https://github.com/opengeos/datasets/releases/download/places/dem_bounds.geojson")
gdf = gpd.read_file(vector_path)
gdf = gdf.to_crs(src.crs) # 래스터와 동일한 CRS 보장

# 플롯 생성
fig, ax = plt.subplots(figsize=(8,8))
rasterio.plot.show(src, cmap="terrain", ax=ax, title="벡터 오버레이가 있는 DEM")
gdf.plot(ax=ax, edgecolor="red", facecolor="none", linewidth=2)
plt.show()

5️⃣ NDVI(식생 지수) 시각화

여러 밴드를 조작해서 계산을 할 수 있다. 일반적으로 잘 알려진 식생지수 계산 공식은 다음과 같다.

  • NDVI = (NIR - Red) / (NIR + Red)
# 여러 밴드 스택
raster_path = "https://github.com/opengeos/datasets/releases/download/raster/LC09_039035_20240708_90m.tif"
src = rasterio.open(raster_path)

nir_band = src.read(5)
red_band = src.read(4)
green_band = src.read(3)

# 밴드들을 단일 배열로 스택
rgb = np.dstack((nir_band, red_band, green_band)).clip(0, 1)
print(rgb.shape)

  • NIR, Red, Green 밴드 값을 변수에 할당하고 단일 배열로 스택해준다.
# NDVI계산
ndvi = (nir_band - red_band) / (nir_band + red_band)
ndvi = ndvi.clip(-1, 1)

plt.figure(figsize=(8, 8))
plt.imshow(ndvi, cmap="RdYlGn", vmin=-1, vmax=1)
plt.colorbar(label="NDVI", shrink=0.75)
plt.title("NDVI")
plt.xlabel("열 번호")
plt.ylabel("행 번호")
plt.show()

 

'GIS > 01. GIS TIL' 카테고리의 다른 글

[GIS] Python에서 TileDB 사용하여 LiDAR 데이터 활용하기  (0) 2026.03.21
파이썬에서 GeoPandas 기반 벡터 데이터 다루기  (0) 2026.02.02
GIS 분석을 위한 환경설정(with conda, uv)  (0) 2026.02.01
PostGIS 공간쿼리 기초 연습 (2)  (0) 2026.01.30
PostGIS 공간쿼리 기초 연습 (1)  (0) 2026.01.29
'GIS/01. GIS TIL' 카테고리의 다른 글
  • [GIS] Python에서 TileDB 사용하여 LiDAR 데이터 활용하기
  • 파이썬에서 GeoPandas 기반 벡터 데이터 다루기
  • GIS 분석을 위한 환경설정(with conda, uv)
  • PostGIS 공간쿼리 기초 연습 (2)
dalleeoppaa
dalleeoppaa
DA, GIS 공부 기록
  • dalleeoppaa
    달래오빠
    dalleeoppaa
  • 전체
    오늘
    어제
    • 분류 전체보기 (111) N
      • GIS (22)
        • 01. GIS TIL (13)
        • 02. OpenSource Geo Data (6)
        • 03.사이드 프로젝트 (1)
      • 프로젝트 (6)
        • 01. 상권분석 지도 (3)
        • 02. olist 고객 RFM 분석 (3)
      • PointCloud (1) N
      • 프로그래밍 언어 (56)
        • 01. Python (1)
        • 02. SQL (49)
        • 03. C++ (2)
        • 04. TIL (4)
      • 데이터분석 (23)
        • 01. Google Cloud Platform (1)
        • 02. GA4 & GTM (1)
        • 03. LookerStudio (4)
        • 04. Apach Spark (7)
        • 05. 데이터 시각화 (10)
      • 인턴 (2)
        • 01. NPL (2)
        • 02. TIL (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    데이터분석가
    데이터분석가코테
    프로그래머스코테
    postgresql연습
    MySQL
    spatialdata
    프로그래머스
    태블로부트캠프
    sql코테
    코딩테스트
    프로그래머스SQL
    태블로신병훈련소
    GIS
    프로그래머스lv3
    SQL
    solvesql
    PostgreSQL
    데이터분석취준
    데이터분석
    태블로연습
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
dalleeoppaa
파이썬에서 Rasterio 기반 래스터 데이터 다루기
상단으로

티스토리툴바