光学衛星は洪水時には役に立ちません。なぜなら…曇っているからです。Sentinel-1 SARは雨や夜でも観測可能ですが、そのデータはノイズが多く複雑で、実際には洪水でない「常時存在する水域」が多く含まれています。
私は生のSNAP GeoTIFFをきれいで実用的な洪水地図に変換するエンドツーエンドのパイプラインを構築しました。以下はSAR処理における3つの最大の課題とその解決策です。
1. 「パディング」の落とし穴
SNAPの出力にはゼロ値の境界が含まれることが多く、これをトリミングしないとヒストグラムが何百万もの0で歪み、自動閾値処理が破綻します。
解決策: 0.0をNaNとして扱い、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]
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.