🌊 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 经常将“透明”像素渲染为纯黑色。

解决方法:我不使用 RGBA,而是使用带有专用 NoData 值(255)的单波段栅格。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