mcpField
R
remote-sensing-analysis

remote-sensing-analysis

github.com/muendデータ・データベース3777 回インストール2 週間前に更新
リポジトリ

remote-sensing-analysis について

地球観測画像の分析スキルです。データ検索、校正、マスキングから分類と検証までの手順を案内します。処理ベースラインの確認、画像の比較可能性、再現可能な根拠を重視します。

主な機能

  1. 01STAC による画像検索
  2. 02処理レベルと校正ベースラインの確認
  3. 03雲・影・品質不良ピクセルのマスキング
  4. 04スペクトル指数と特徴量の計算
  5. 05空間的に独立したデータによる分類と検証
  6. 06マニフェスト・指標・エラーマップの記録

活用シーン

  1. 01地表反射率画像の分析準備
  2. 02異なる日付の衛星画像の比較
  3. 03土地被覆の分類と検証
  4. 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 で水を模倣します — インデックスを相互に、そしてトゥルーカラーと照合してください。

分類ワークフロー

  1. 相互排他的で、画像上で分離可能なクラスによる凡例を定義します。
  2. シーン全体に空間的に分散した学習サンプルを収集し、バージョン管理されたベクターファイルとして記録します。
  3. 特徴量: バンド + インデックス + テクスチャ (GLCM) + マルチデートの場合は時系列統計。ディープラーニングのルートでは、geo-deep-learning に引き渡します。
  4. 空間的に独立したテストセットで検証し (ml-experiment-standards → references/spatial-cv-protocol.md を参照)、クラスごとの F1/IoU と混同行列を報告します — 全体精度だけでは希少クラスの失敗が隠れてしまいます。
  5. 誤りをマッピングします。誤分類の空間プロットは、全体指標では隠れてしまう系統的な問題 (地形の影、都市と裸地の混同) を明らかにします。

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 の混入、あるいはセンサー解像度を超える主張がある結果は却下します。
  • 成果物: 分析可能な画像または特徴量、処理マニフェスト、マスク、派生プロダクト、検証指標と誤りマップ、再現可能なコード、および制限事項。
  • ソースの鮮度: 実行時に 権威あるソースレジストリ を参照して、プロダクト、キャリブレーション、カタログの変更を確認してください。

コメント