EOReader:光学・SAR衛星データをセンサー問わず統一APIで読み込む Python ライブラリ
bash ファイル名.sh を実行してください(中身を一度確認してから実行すると安心です)。
(macOS / Linux 環境が必要) EOReader:光学・SAR衛星データをセンサー問わず統一APIで読み込む Python ライブラリ
ひとことでいうと
EOReader は、Sentinel-2 や Landsat、COSMO-SkyMed、ICEYE など数十種類の衛星センサーを同じコードで扱える Python ライブラリです。光学センサー(太陽光を使って撮影するタイプ)と SAR センサー(電波を自ら発射して撮影するタイプ)の両方に対応しています。バンド(波長帯)の読み込みや、植生・水域などを示す指数の計算、雲のマスク処理、標高データの取得まで、センサーの種類を意識せず同じ書き方で実装できます。Apache 2.0 ライセンスのオープンソースで、フランスのコペルニクス緊急管理サービス(CEMS)のオペレーターである SERTIT が開発・維持しています。衛星データをよく扱う研究者・エンジニア・現場担当者にとって、コード量を大幅に減らせる頼もしいツールです。
こんな人におすすめ
1. 緊急マッピング・災害対応の担当者 洪水や火災、地滑りなどの被災状況を複数のセンサーで素早く把握したい場面に向いています。SAR センサーは雲が厚い日や夜間でも観測できるため、光学センサーが使えない状況でも切り替えて対応できます。センサーごとにコードを書き直す手間がなくなるので、緊急時の対応スピードが上がります。
2. 衛星データ解析・リモートセンシングの研究者
NDVI(植生指数)や EVI(大気補正付き植生指数)などのスペクトル指数を spyndex との連携で即座に計算できます。データ構造は xarray と geopandas ベースのまま使えるので、機械学習のパイプラインにもそのまま渡せます。センサーを統一した形で扱えるため、再現性の高い研究コードを書きやすいのも利点です。
3. GIS エンジニア・データパイプライン開発者 内部 STAC カタログ(地理空間データを検索・アクセスしやすくする仕様)を自動生成する機能を備えており、古い衛星データも含めて一元管理できます。AWS S3 や S3 互換ストレージからの読み込みもサポートしているため、クラウド上に衛星データ基盤を構築する際にも活用できます。
インストール・使い方
Step 1:pip でインストールする
ターミナル(文字を入力してパソコンに命令を送る画面)を開き、以下のコマンドをコピー&ペーストして実行してください。
pip install eoreader
これで EOReader 本体と、地理空間データを扱うための主要ライブラリ(geopandas・xarray・rasterio など)が一緒にインストールされます。rasterio は OS によって手順が異なる場合があるため、うまくいかないときは公式ドキュメントを参照してください。
Step 2:conda でインストールする(より安定した方法)
地理空間系ライブラリは依存関係が複雑なため、パッケージ管理ツールの conda(コンダ)を使う方法も用意されています。
conda config --env --set channel_priority strict
conda install -c conda-forge eoreader
conda-forge というコミュニティが管理するチャンネルからインストールすると、GDAL(地理空間データを扱う基盤ライブラリ)などの依存関係が自動で解決されるため、環境構築が安定します。conda が入っていない場合は Miniconda をまず導入するとスムーズです。
Step 3:光学センサー(Sentinel-2)のデータを読み込む
Python ファイルまたは Jupyter Notebook に以下を記述します。
from eoreader.reader import Reader
from eoreader.bands import RED, GREEN, BLUE, NDVI, CLOUDS
# Reader オブジェクト(製品を開くための窓口)を作成
reader = Reader()
# 製品フォルダを指定して開く(衛星の種類は自動で判別される)
s2_prod = reader.open("S2B_MSIL1C_20181126T022319_N0207_R103_T51PWM_20181126T050025.SAFE")
# NDVI・緑バンド・雲マスクを読み込む
bands = s2_prod.load([NDVI, GREEN, CLOUDS])
# RGB の 3 バンドをまとめて GeoTIFF(地理情報付き画像ファイル)として保存
stack = s2_prod.stack([RED, GREEN, BLUE], stack_path="s2_rgb_stack.tif")
reader.open() にフォルダパスを渡すだけで、Sentinel-2 かどうかを自動的に判別してくれます。バンドは RED や NDVI のような分かりやすい名前で指定できます。
Step 4:SAR センサー(Sentinel-1)のデータを読み込む
SAR データも、光学データとほぼ同じ書き方で扱えます。
from eoreader.reader import Reader
from eoreader.bands import VV, VH, VV_DSPK, VH_DSPK
reader = Reader()
s1_prod = reader.open("S1B_EW_GRDM_1SDH_20200422T080459_20200422T080559_021254_028559_784D.zip")
# VV・VH という 2 種類の偏波(電波の振動方向)を読み込む
bands = s1_prod.load([VV, VH])
# デスペックルフィルタ(ノイズ除去)済みのスタックを保存
stack = s1_prod.stack([VV_DSPK, VH_DSPK], stack_path="s1_stack.tif")
SAR 製品の正射投影(地図に正しく重ねるための補正)やキャリブレーションには、ESA(欧州宇宙機関)が無償公開しているソフトウェア SNAP の
gptコマンドが必要です。SNAP をインストールしたあと、gptの実行ファイルがある場所をシステムの PATH(コマンド検索パス)に追加してください。
動かしてみた
Python 3.12.13 の環境で pip install eoreader を実行したところ、パッケージのインストールは正常に完了しました。インストール後すぐにインポートを試したところ、バンド定数の参照も問題なく動作することが確認できています。
from eoreader.bands import RED, GREEN, BLUE, NDVI, VV, VH
print(RED, GREEN, BLUE) # → RED GREEN BLUE
print(NDVI) # → NDVI
print(VV, VH) # → VV VH
RED や NDVI、VV といったバンド名が正しく認識されており、ライブラリが期待どおりに読み込まれていることが分かります。Reader クラスのインスタンス化も正常に完了し、実際の衛星データファイルを用意すれば reader.open() から即座にバンド読み込みに進める状態でした。パッケージ情報ファイル(eoreader.egg-info)の内容からも、正しくインストールされた状態であることが確認できました。
ブラウザで試す(デモ)
実際の衛星データがなくても、ブラウザ上で EOReader の機能を確認できるデモが用意されています。対応しているコンステレーション(衛星群)の一覧や、センサーごとに使えるバンド・スペクトル指数・クラウドバンドをインタラクティブに表示できます。サンプルコードも自動生成されるため、「自分が使いたいセンサーに対応しているか」「どんなバンドが使えるか」を手軽に事前確認できます。
実践のコツ:はじめの一歩
EOReader を初めて使うときは、次の手順を踏むとスムーズに始められます。
- まず利用できるバンドを確認する:
reader.open()で製品を開いたあと、prod.get_existing_bands()を呼び出すと、そのデータで実際に使えるバンドの一覧が分かります。 - コンステレーションと日時を確認する:
prod.constellationでセンサー名、prod.datetimeで観測日時を確認できます。複数センサーのデータを混在させて処理するときに役立ちます。 - 座標参照系(CRS)を確認する:
prod.crs()で地図投影法が分かります。異なるデータを重ね合わせる前に必ず確認しましょう。 - DEM バンドを使う場合は事前設定が必要: 標高データ(DEM)を含む処理をするときは、環境変数
EOREADER_SAR_DEFAULT_RESや DEM ファイルのパスを先に設定しておく必要があります。 - SAR データは SNAP のインストールを忘れずに: SAR 製品を正しく処理するには ESA の SNAP ソフトウェアが必要です。インストールして
gptコマンドにパスを通しておきましょう。 - conda 環境を使うと依存関係の問題が起きにくい: 地理空間系ライブラリのバージョン衝突を防ぐため、新しい conda 環境を作ってからインストールするのがおすすめです。
reader = Reader()
prod = reader.open("your_product_path")
# 製品のメタ情報を確認する
print(prod.get_existing_bands()) # 使えるバンド一覧
print(prod.constellation) # センサー名
print(prod.datetime) # 観測日時
print(prod.crs()) # 座標参照系
活用例
- 洪水検知パイプライン: Sentinel-1(SAR)と Sentinel-2(光学)を同一コードで処理し、水域マスクを自動生成します。SAR は雨天・夜間でも観測できるため、雲に隠れた被災域もカバーできます。
- 農業モニタリング: Landsat 8/9 と Sentinel-2 の NDVI を統一 API で計算し、時系列解析に活用できます。HLS(Harmonized Landsat-Sentinel:ランドサットとセンチネルを調和させた統合データ)にも対応しており、観測頻度を高めた解析が可能です。
- 内部 STAC カタログの構築: 大量の衛星アーカイブを EOReader で読み込み、
stac機能で統一フォーマットのカタログに変換できます。AWS S3 や S3 互換ストレージ上に直接カタログを作成することもできます。 - マルチセンサーを使った都市洪水抽出: COSMO-SkyMed、RADARSAT、ICEYE など複数の SAR センサーを同一アルゴリズムで処理し、U-Net ベースの CNN(畳み込みニューラルネットワーク)への入力を統一する研究事例が GeoPython 2023 で報告されています。
- 学術研究コードの再現性向上: センサーの違いをライブラリが吸収してくれるため、論文のコードをほかの研究者が別のセンサーデータで再現しやすくなります。
- クラウドネイティブな衛星データ基盤の整備: AWS や S3 互換ストレージ上のデータを直接読み込めるため、ローカルにデータをダウンロードしなくてもパイプラインを動かせる基盤を構築できます。
用語とポイント解説
SAR(合成開口レーダー) 自ら電波を発射してその反射を受信するタイプのセンサーです。かんたんに言うと「自前のライトを持って撮影するカメラ」のようなもので、太陽光や天候に依存しないため、雲が厚い日や夜間でも観測できます。洪水や火山噴火など緊急時の観測で特に威力を発揮します。
光学センサー 太陽光の反射や地表からの熱放射を検出するタイプのセンサーです。かんたんに言うと「普通のカメラに似た仕組み」で、可視光・近赤外・短波赤外など複数の波長帯(バンド)を持っています。雲があると観測できないという制約があります。
スペクトル指数 複数のバンドを組み合わせた計算式で求める数値指標です。かんたんに言うと「波長の組み合わせで植物の元気さや水の有無を数字で表したもの」です。代表例として NDVI(植生)・EVI(植生・大気補正版)・MNDWI(水域)などがあります。
NDVI(正規化植生指数) 近赤外バンドと赤バンドの差分比から植物の量や健全度を示す指数です。かんたんに言うと「緑が多くて元気な場所ほど値が高くなる指標」で、農業モニタリングや森林調査によく使われます。値は −1 から +1 の範囲を取り、0.5 以上であれば植生が豊かな場所を示すことが多いです。
DEM(数値標高モデル) 地表の高さ情報をデジタルデータにしたものです。かんたんに言うと「地形の凸凹を数値で表した地図」で、EOReader では傾斜や斜面の向きなどを導出するバンドとして利用できます。衛星画像の正射補正(高さによるズレを補正すること)にも使われます。
STAC(SpatioTemporal Asset Catalog) 地理空間データを検索・アクセスしやすくするための標準仕様です。かんたんに言うと「衛星データの図書館の目録ルール」のようなもので、この形式でカタログを作ると異なるツール間でもデータを共通して扱えるようになります。EOReader には STAC カタログを自動生成する機能が組み込まれています。
xarray ラベル(名前)の付いた多次元配列を扱うための Python ライブラリです。かんたんに言うと「バンド名や時刻・座標といった情報を一緒に持てるデータ構造」で、衛星データのように複数の次元が絡むデータを扱うのに適しています。EOReader が返すデータは xarray 形式なので、機械学習パイプラインとの連携もスムーズです。
GeoTIFF 地理参照情報(どの場所を撮影したか・どの座標系かなど)を内包した TIFF 形式の画像ファイルです。かんたんに言うと「地図情報つきの画像ファイル」で、衛星データの標準的な保存フォーマットとして広く普及しています。GIS ソフトウェアや Python の地理空間ライブラリでそのまま開いて利用できます。
conda-forge オープンソースコミュニティが管理する conda 用パッケージのチャンネル(配布場所)です。かんたんに言うと「地理空間ライブラリが揃っている信頼性の高いパッケージの棚」で、GDAL や rasterio のような複雑な依存関係も自動で解決してくれます。地理空間系の Python 環境を整えるには conda-forge 経由のインストールが定番の方法です。
ぜひ災害対応時のマルチセンサー解析や、農業・環境モニタリングの自動化パイプラインなどに活用してみてはいかがでしょうか。