🌊 From SAR Data to Actionable Maps: Building an Open-Source Flood Detection Pipeline with Python 封面圖

Aditya Singh

光學衛星在洪水期間無法使用,因為,嗯,雲太多了。Sentinel-1 SAR 可以穿透雨和黑夜,但其資料有雜訊、複雜,且充滿「永久水域」,這些其實並非洪水。

我建置了一個端到端管線,將原始 SNAP GeoTIFF 轉換為乾淨、可操作的洪水地圖。以下是我解決 SAR 處理中三大痛點的方法。

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]

進入全螢幕模式 退出全螢幕模式

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))

進入全螢幕模式 退出全螢幕模式

3. QGIS「黑色背景」錯誤

匯出透明 GeoTIFF 是一場惡夢。如果依賴標準 Alpha 通道,QGIS 常會將「透明」像素渲染為純黑色。

解決方法:我使用單頻段柵格搭配專用 NoData 值 (255),而非 RGBA。QGIS 會自動將 NoData 視為透明。

# 1 = 已淹水,255 = NoData (QGIS 中透明)
overlay = np.where(final_flood_raster == 1, 1, 255).astype(np.uint8)

進入全螢幕模式 退出全螢幕模式

結果

此管線輸出:

  • 向量資料:帶有精確面積計算 (km²) 的 GeoJSON/Shapefile。
  • 互動式地圖:帶有衛星/街道切換的 Folium HTML 地圖。
  • QGIS 就緒柵格:匯入後立即可用的乾淨疊加層。

🚀 立即嘗試

完整筆記本為開源。它處理從斑點清理到最終視覺化的所有步驟。

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

Python #GeoAI #RemoteSensing #OpenSource #ClimateTech