remote-sensing-analysis について
地球観測画像の分析スキルです。データ検索、校正、マスキングから分類と検証までの手順を案内します。処理ベースラインの確認、画像の比較可能性、再現可能な根拠を重視します。
主な機能
- 01STAC による画像検索
- 02処理レベルと校正ベースラインの確認
- 03雲・影・品質不良ピクセルのマスキング
- 04スペクトル指数と特徴量の計算
- 05空間的に独立したデータによる分類と検証
- 06マニフェスト・指標・エラーマップの記録
活用シーン
- 01地表反射率画像の分析準備
- 02異なる日付の衛星画像の比較
- 03土地被覆の分類と検証
- 04SAR による洪水マッピングや監視
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ muend/ geoai-skills --skill remote-sensing-analysisインストール後、Claude Code で/remote-sensing-analysisを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yamlreferences/authoritative-sources.md
詳細
リモートセンシング解析
目的: 生の地球観測画像を、根拠のある分析プロダクトへと変換すること。ここでの失敗モードは微妙です — 補正されていない DN を反射率として扱う、雲を土地被覆変化として数える、誤ったバンドでインデックスを計算する — そのため、このスキルはチェックを前段に置きます。
データアクセス (STAC ファースト)
プロバイダーごとのポータルではなく STAC API 経由で検索してください。ワークフローが統一され、スクリプト化できます:
import pystac_client
import odc.stac
catalog = pystac_client.Client.open("https://earth-search.aws.element84.com/v1")
items = catalog.search(
collections=["sentinel-2-l2a"],
bbox=[27.0, 38.3, 27.4, 38.6],
datetime="2025-05-01/2025-09-30",
query={"eo:cloud_cover": {"lt": 20}},
).item_collection()
ds = odc.stac.load(items, bands=["red", "nir", "scl"], resolution=10, chunks={})
主要なコレクション: sentinel-2-l2a (10 m 光学、地表面反射率)、landsat-c2-l2 (30 m、1982年→)、sentinel-1-grd (SAR、天候に依存しない)。Microsoft Planetary Computer はほとんどをミラーしています (planetary_computer の署名が必要)。大陸規模/全球規模の範囲や数十年にわたるスタックには、ダウンロードする代わりに google-earth-engine へルーティングしてください。再現性のためにコレクション + アイテム ID + 検索パラメーターを記録してください。
処理レベルの規律
| レベル | 意味 | 解析可能? |
|---|---|---|
| L1C / L1TP | 大気上端 (TOA) | インデックスはまあまあ可; 日付間の比較はリスクあり |
| L2A / L2SP | 地表面反射率 (BOA) | はい — 既定の選択 |
| GRD (SAR) | 検波振幅 | 地形補正 + スペックルフィルターが必要 |
どのレベルを使用したかを常に明記してください。TOA と BOA のシーンを 1 つのコンポジットや時系列に混在させないでください。Landsat Collection 2 L2 はスケールファクターを適用する必要があります (reflectance = DN * 0.0000275 - 0.2)。
Sentinel-2 のベースライン不連続 — 上記のレベルチェックを通過します
2022年1月25日 から適用された処理ベースライン 04.00 は、負の地表面反射率をエンコードできるように、定数 BOA_ADD_OFFSET (現在は −1000) を L2A のデジタル数値に加算しました。その日付を挟んだ 2 つのシーンはどちらも L2A です: 上記のレベルチェックでは何も問題を検出しませんが、それらの DN は 1000 離れています。それらを差分すると、実際の変化として読み取られ、その後適用するあらゆるマスク、しきい値、精度レポートをすり抜ける系統的な反射率シフトが生じます。
- −1000 や 10000 をハードコードするのではなく、各プロダクトのメタデータから
BOA_ADD_OFFSETとQUANTIFICATION_VALUEを読み取ってください。どちらもバンドごとであり、ベースラインは以前にも変更されています。 reflectance = (DN + BOA_ADD_OFFSET) / QUANTIFICATION_VALUEで変換してください。- マニフェストには、プロダクトレベルだけでなく、すべてのシーンの処理ベースラインを記録してください。2 つの L2A シーンというだけでは十分な記述ではありません。
- 二重に補正しないでください。 調和済みコレクション — Earth Engine の
COPERNICUS/S2_SR_HARMONIZEDやいくつかの商用ミラー — は、ベースライン以降のデータをすでに 2022 年以前の範囲に戻しています。オフセットを再度適用すると、誤差を除去するのではなく反転させてしまいます。 - どちらかのシーンのベースラインが文書化されていない場合、その比較は根拠がありません。2022 年以前または以降と仮定するのではなく、その旨を述べてください。
雲と品質のマスキング — 何よりも先に
- Sentinel-2: SCL バンドでマスクしてください (クラス 3 雲影、8-9 雲、10 巻雲、11 雪を除外 — 4 植生、5 裸地、6 水域、7 未分類は慎重に保持)。
- Landsat C2:
QA_PIXELビットフィールド (雲、影、巻雲ビット) をデコードしてください。 - マスキング後のシーンごとの有効ピクセルの % を報告してください。有効率が約 60% 未満のシーンは通常、除外に値します。
- ギャップのないプロダクトには、単一シーンをつまみ食いするのではなく、季節ごとの中央値コンポジットを構築してください。
スペクトルインデックス
地表面反射率で計算し、ゼロ除算を防ぎ、バンドを明示的に指定してください — バンド番号はセンサー間で異なります (NIR は Sentinel-2 では B8、Landsat 8/9 では B5):
import numpy as np
import xarray as xr
def normalized_diff(a: xr.DataArray, b: xr.DataArray) -> xr.DataArray:
"""(a - b) / (a + b) with zero-denominator protection."""
return xr.where(a + b == 0, np.nan, (a - b) / (a + b))
ndvi = normalized_diff(ds.nir, ds.red) # vegetation
ndwi = normalized_diff(ds.green, ds.nir) # open water (McFeeters)
ndbi = normalized_diff(ds.swir16, ds.nir) # built-up
解釈のガードレール: NDVI のしきい値はシーンと季節に依存します。ヒストグラムを確認せずに「NDVI > 0.3 = 植生」をハードコードしないでください。水は NDBI を混乱させます; 影は NDWI で水を模倣します — インデックスを相互に、そしてトゥルーカラーと照合してください。
分類ワークフロー
- 相互排他的で、画像上で分離可能なクラスによる凡例を定義します。
- シーン全体に空間的に分散した学習サンプルを収集し、バージョン管理されたベクターファイルとして記録します。
- 特徴量: バンド + インデックス + テクスチャ (GLCM) + マルチデートの場合は時系列統計。ディープラーニングのルートでは、
geo-deep-learningに引き渡します。 - 空間的に独立したテストセットで検証し (
ml-experiment-standards→references/spatial-cv-protocol.mdを参照)、クラスごとの F1/IoU と混同行列を報告します — 全体精度だけでは希少クラスの失敗が隠れてしまいます。 - 誤りをマッピングします。誤分類の空間プロットは、全体指標では隠れてしまう系統的な問題 (地形の影、都市と裸地の混同) を明らかにします。
SAR に関する注意事項 (Sentinel-1)
前処理: オービットファイル → 熱雑音除去 → キャリブレーション (σ⁰) → 地形補正 (DEM を用いた Range-Doppler) → スペックルフィルタ (Lee/Refined Lee) → dB 変換。統計処理は dB で行います。VV/VH 比は水と植生の強力な判別指標です。SAR は雲を透過するため、洪水マッピングや継続的なモニタリングに適しています。
落とし穴チェックリスト
- 一貫した大気補正を行わずに、異なる日付のシーンを比較する。
- 2022-01-25 のベースライン変更をまたいで Sentinel-2 のシーンを混在させる際に、
BOA_ADD_OFFSETを適用しない — あるいは、すでにハーモナイズされたコレクションに再度適用してしまう。 - Sentinel-2 の 20 m→10 m バンド混在を無視する (B11/B12 はネイティブで 20 m)。
- スケールファクターなしで整数 DN に対してインデックスを計算する → 無意味な範囲になる。
- 線形単位での SAR のメディアンコンポジット (統計処理は dB で行う)。
- 同じ圃場/ポリゴンから学習用とテスト用のピクセルを取得する → 精度がリークする。
- 再投影後の nodata マスクを忘れる (エッジがゼロになる → 偽の土地被覆)。
実行契約
- ワークフロー: 現象とスケールを定義し、センサー、プロダクトレベル、日付を選択し、キャリブレーション、マスク、CRS、解像度をハーモナイズし、特徴量を導出し、分析し、空間的に検証し、来歴を公開します。
- 判断ルール: 画像の準備と古典的な分析にはこのスキルを、明示的な時系列差分には変化検出を、ニューラルネットワークの学習にはディープラーニングを、アーカイブ規模の実行には Earth Engine を使用します。
- 検証プロトコル: マスクと有効カウントを検査し、シーンごとにスケールファクター、オフセット、処理ベースラインを確認し、バンド解像度を確認し、出力を重ね合わせ、空間的に独立した検証を使用し、誤りをマッピングし、季節的またはセンサー感度をテストします。
- 失敗モード: 雲や影のリーク、比較不能な処理レベル、文書化されていない、または一致しない処理ベースライン、リサンプリングによるアーティファクト、ラベルリーク、nodata の混入、あるいはセンサー解像度を超える主張がある結果は却下します。
- 成果物: 分析可能な画像または特徴量、処理マニフェスト、マスク、派生プロダクト、検証指標と誤りマップ、再現可能なコード、および制限事項。
- ソースの鮮度: 実行時に 権威あるソースレジストリ を参照して、プロダクト、キャリブレーション、カタログの変更を確認してください。