プログラミングを頑張る土木系専攻大学院生のブログ

主にプログラミングについて開発備忘録的な形で投稿しています。

Pythonで地理情報データをあつかう(rasterioを使ったラスタデータの読み込み)

キーワード: Python , rasterio , GIS , ラスタデータ

都市データの可視化や環境解析、リモートセンシングなど、地理情報データ(GIS)の活用は年々広がっています。

本記事では、Pythonでラスタ(画像形式の地理データ)を扱うための定番ライブラリ「rasterio」について、基本操作から実例までを詳しく解説します。

📘 公式ドキュメント:
👉 https://rasterio.readthedocs.io/en/stable/


🔰 rasterioとは?

rasterio は、GeoTIFFをはじめとするラスタ形式の地理空間データを、Pythonで直感的かつ高速に扱えるライブラリです。

  • GeoTIFF、.img、.asc など、多くの形式に対応
  • NumPyとシームレスに連携
  • GDAL(地理空間データ抽象ライブラリ)をPythonから安全に利用できる
  • メタデータ、位置情報(CRS)、アフィン変換(後で解説します!)なども簡単に取得可能

「地理情報のある画像データ(衛星画像、標高データなど)を読む・処理・書き出す」ことに特化しています。


🗺 本記事で扱う内容

  • rasterioによるGeoTIFFの読み込み
  • バンド情報や座標情報の取得
  • アフィン変換(transform)の理解と使い方
  • ピクセル座標と地理座標の変換

📚 シリーズ記事一覧(予定)

  • [今回] rasterioでGeoTIFFを読み込む・基本情報を取得
  • 🔜 rasterio × matplotlib でラスタ画像を表示する
  • 🔜 地理座標の範囲で画像を切り出す(クリッピング
  • 🔜 rasterioで新しいGeoTIFFを書き出す

📂 1. GeoTIFFファイルの読み込み

import rasterio

# ファイルのパス
tif_path = 'example.tif'

with rasterio.open(tif_path) as src:
    print(src)  # 基本情報を表示

🧾 2. ファイルの基本情報を確認する

with rasterio.open(tif_path) as src:
    print("ファイルパス:", src.name)
    print("バンド数:", src.count)
    print("画像サイズ(高さ, 幅):", src.height, src.width)
    print("座標参照系(CRS):", src.crs)
    print("アフィン変換:", src.transform)
    print("データ型(dtype):", src.dtypes)
    print("バンド名:", src.descriptions)

✅ 出力例(3バンドGeoTIFF)

ファイルパス: example.tif  
バンド数: 3  
画像サイズ(高さ, 幅): 512 512  
座標参照系(CRS): EPSG:32648  
アフィン変換: | 30.00, 0.00, 405000.00|  
               | 0.00,-30.00, 2073000.00|  
データ型: ['uint16', 'uint16', 'uint16']  
バンド名: ('Red', 'Green', 'Blue')  

🖼 3. バンドデータをNumPy配列として読み取る

with rasterio.open(tif_path) as src:
    band1 = src.read(1)  # 1番目のバンド(インデックスは1から)
    print("バンド1の形状:", band1.shape)
    print("最小値:", band1.min(), "最大値:", band1.max())

band1 は NumPyの2次元配列なので、画像処理や統計処理がそのまま可能です。


📌 4. よく使う属性まとめ

属性名 内容
src.count バンド数
src.width, src.height 画像サイズ(ピクセル数)
src.crs 座標参照系(EPSGなど)
src.transform アフィン変換行列(位置・解像度)
src.dtypes バンドごとのデータ型
src.descriptions バンドの説明(名前)
src.read(i) i番目のバンドをNumPy配列で取得(1始まり)

🧭 5. アフィン変換(transform)の仕組み

rasterio.transform プロパティは、ラスタ画像のジオリファレンス(地理参照)情報を表す = 「画像のどのピクセルが、どの地理座標に対応しているか」

📌 「画像のピクセル座標 (列番号, 行番号) → 地理座標(x, y)」 に変換できる。

🔍 transformとは?

.transform プロパティは、ピクセルの位置(行列番号)と地理座標の関係を表すアフィン変換行列です。

たとえば: 入力

with rasterio.open(tif_path) as src:
    print("アフィン変換:", src.transform)

出力

アフィン変換(30.0, 0.0, 405000.0,
       0.0, -30.0, 2073000.0)

これは次のように解釈できます:

パラメータ 意味
a ピクセル幅(x方向解像度) 30.0
b x方向の回転(通常0) 0.0
c 左上ピクセルのx座標 405000.0
d y方向の回転(通常0) 0.0
e ピクセル高さ(y方向解像度・通常負) -30.0
f 左上ピクセルのy座標 2073000.0

📐 ピクセル → 地理座標の変換式

x = a * col + b * row + c
y = d * col + e * row + f

※ 回転がない場合、簡単に:

x = a * col + c
y = e * row + f

🧪 6. ピクセル (100, 200) の地理座標を求める

from rasterio import open

with open('example.tif') as src:
    transform = src.transform
    col, row = 100, 200
    x, y = transform * (col, row)
    print(f"地理座標: ({x}, {y})")

🔁 7. 逆変換(地理座標 → ピクセル

row_col = ~transform * (x, y)
print(f"ピクセル位置: {row_col}")

~transform によって逆変換が可能です。地理座標から対応する画素位置を知るときに便利!


🔧 transformが使われる場面

  • 地図へのオーバーレイ表示(座標一致が必要)
  • 特定の緯度経度からピクセルを抽出
  • QGISなどGISツールとの連携
  • 書き出すGeoTIFFに正確な位置情報を埋め込む

✅ まとめ

  • rasterio は、地理空間ラスターデータをPythonで読み込むための基本ツール
  • .open() で安全に読み込み、.read() でNumPy配列化
  • .transform によって、ピクセル ↔ 地理座標の変換が自在
  • 画像処理・座標処理・可視化の基盤としてとても重要!

📘 次回予告(連載予定)

  • matplotlibfoliumを使ったラスタ画像の可視化
  • rasterioで地理座標範囲を指定して切り出し(clip)
  • バンド演算や正規化などのデータ処理
  • 新しいGeoTIFFを生成・保存する方法

📎 参考リンク


🚀 次の記事を読みたい方は、ブックマーク・読者登録をお願いします!