光学卫星在洪水期间无用,因为,嗯,多云。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]
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.