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が使われる場面
✅ まとめ
rasterioは、地理空間ラスターデータをPythonで読み込むための基本ツール.open()で安全に読み込み、.read()でNumPy配列化.transformによって、ピクセル ↔ 地理座標の変換が自在- 画像処理・座標処理・可視化の基盤としてとても重要!
📘 次回予告(連載予定)
matplotlibやfoliumを使ったラスタ画像の可視化- rasterioで地理座標範囲を指定して切り出し(clip)
- バンド演算や正規化などのデータ処理
- 新しいGeoTIFFを生成・保存する方法
📎 参考リンク
- 📚 rasterio公式ドキュメント:https://rasterio.readthedocs.io/en/stable/
- 🧪 PyDataのGeoスタック(rasterio, geopandas, pyprojなど)も要注目!
🚀 次の記事を読みたい方は、ブックマーク・読者登録をお願いします!