🌊 From SAR Data to Actionable Maps: Building an Open-Source Flood Detection Pipeline with Python のカバー画像

Aditya Singh

光学衛星は洪水時には役に立ちません。なぜなら…曇っているからです。Sentinel-1 SARは雨や夜でも観測可能ですが、そのデータはノイズが多く複雑で、実際には洪水でない「常時存在する水域」が多く含まれています。

私は生のSNAP GeoTIFFをきれいで実用的な洪水地図に変換するエンドツーエンドのパイプラインを構築しました。以下はSAR処理における3つの最大の課題とその解決策です。

1. 「パディング」の落とし穴

SNAPの出力にはゼロ値の境界が含まれることが多く、これをトリミングしないとヒストグラムが何百万もの0で歪み、自動閾値処理が破綻します。

解決策: 0.0NaNとして扱い、dB変換後に有効なデータ領域のみを厳密にトリミングしてから解析を行います。

# 有効なデータのみにトリミング
rows = np.where(~np.all(np.isnan(dB_full), axis=1))[0]
cols = np.where(~np.all(np.isnan(dB_full), axis=0))[0]
dB = dB_full[rows.min():rows.max()+1, cols.min():cols.max()+1]

Enter fullscreen mode Exit fullscreen mode

2. 新たな洪水域の分離

単純な-17 dB閾値はすべての水を検出します。実際の洪水被害を特定するには、常時存在する河川や湖を除外する必要があります。

解決策: OSMnxを使ってOpenStreetMapから常時存在する水域を取得し、SARグリッドに合わせてラスタライズした後、検出マスクから差し引きます。

# OSMから常時存在する水域を取得
osm_water = ox.features_from_bbox(bbox=bbox, tags={"natural": "water"})
# 検出マスクから差し引く
flood_only = mask_clean & (~binary_dilation(permanent_water, iterations=2))

Enter fullscreen mode Exit fullscreen mode

3. QGISの「黒背景」バグ

透明なGeoTIFFの出力は非常に厄介です。標準のアルファチャンネルに依存すると、QGISはしばしば「透明」ピクセルを黒で描画します。

解決策: RGBAの代わりに専用のNoData値(255)を持つ単一バンドのラスタを使用します。QGISはNoDataを自動的に透明として扱います。

# 1 = 浸水, 255 = NoData (QGISで透明)
overlay = np.where(final_flood_raster == 1, 1, 255).astype(np.uint8)

Enter fullscreen mode Exit fullscreen mode

結果

このパイプラインは以下の出力を生成します:

  • ベクタデータ: 正確な面積計算(km²単位)を含むGeoJSON/Shapefile。
  • インタラクティブマップ: 衛星/ストリート表示を切り替え可能なFolium HTMLマップ。
  • QGIS対応ラスタ: インポート後すぐに使えるクリーンなオーバーレイ。

🚀 試してみる

完全なノートブックはオープンソースです。スペックル除去から最終可視化まで、すべてを処理します。

🔗 [https://github.com/Adityas221b/QGIS-Flood]

Python #GeoAI #RemoteSensing #OpenSource #ClimateTech