HyperAI超神经
Back to Headlines

用Python和DEM数据轻松模拟洪水淹没情况:初学者指南

9 days ago

全球洪水频发且破坏性日益严重,近年来在气候变化的影响下尤为突出。因此,洪水模拟在风险评估和灾害应对中发挥着重要作用,同时也成为先进研究和学术关注的重点。本文将以巴西东北地区为例,通过Python和数字高程模型(DEM)数据来构建一个基础的洪水淹没模型,展示如何模拟水位上升对地表的影响,并通过动画演示其过程。 1. 什么是数字高程模型(DEM) 数字高程模型(DEM)是一种数字表示地球表面的方式,其中每个栅格单元(像素)包含一个高程值,通常不包括植被、建筑物等人造特征。DEM在地图绘制、水文学、环境监测和地球科学等领域广泛应用,为需要详细了解地形和高程的应用提供了基础数据集。 本文使用的DEM数据由美国地质调查局(USGS)的国家地理空间计划提供,空间分辨率为1弧秒(约30米)。该数据覆盖了从南纬6°、西经39°到南纬5°、西经38°的1° × 1°区域,使用WGS84坐标系统(EPSG: 4326)。 2. 使用Python加载和可视化高程数据 首先,我们需要导入必要的库并定义一个加载DEM文件的辅助函数。这个函数会读取高程数据,并检查“无效值”(nodata),这些值表示没有有效的高程数据(如超出覆盖范围或损坏的像素)。如果有无效值,函数会将其替换为np.nan,以便在后续分析和可视化中处理。 ```python 导入库 import rasterio import matplotlib.pyplot as plt import numpy as np from matplotlib.animation import FuncAnimation 加载DEM文件的辅助函数 def load_dem(path): with rasterio.open(path) as src: dem = src.read(1) transform = src.transform nodata = src.nodata if nodata is not None: # 掩码无效值 dem = np.ma.masked_equal(dem, nodata) return dem, transform ``` 接下来,我们使用该函数加载DEM数据并可视化: ```python dem, transform = load_dem("s06_w039_1arc_v3.tif") 计算地理坐标范围 extent = [ transform[2], # 经度最小值 transform[2] + transform[0] * dem.shape[1], # 经度最大值 transform[5] + transform[4] * dem.shape[0], # 纬度最小值 transform[5] # 纬度最大值 ] 使用地理坐标绘制地形图 fig, ax = plt.subplots() img = ax.imshow(dem, cmap='terrain', extent=extent, origin='upper') ax.set_xlabel('经度') ax.set_ylabel('纬度') plt.colorbar(img, label='高程 (米)') plt.title('DEM可视化') plt.show() ``` 3. 使用高程阈值模拟洪水情景 我们可以通过定义一个高度阈值来生成一个二进制掩码,识别所有低于此阈值的区域。以40米为例,我们可以模拟这一区域的洪水影响。 ```python flood_threshold = 40 # 米 flood_mask = (dem <= flood_threshold).astype(int) plt.imshow(flood_mask, extent=extent, cmap='Blues') plt.title(f"洪水区域 (阈值: {flood_threshold}米)") plt.xlabel("经度") plt.ylabel("纬度") plt.show() ``` 4. 动态模拟洪水进程 为了更好地展示洪水的动态进程,我们可以使用matplotlib的FuncAnimation来创建动画。我们通过逐步增加水位来生成新的掩码并在地形图像上叠加,从而形成动态效果。 ```python 水位高度每帧增加5米 flood_levels = np.arange(15, 100, 5) 设置图形和坐标轴 fig, ax = plt.subplots() img = ax.imshow(dem, cmap='terrain', extent=extent, origin='upper') flood_overlay = ax.imshow(np.zeros_like(dem), cmap='Blues', alpha=0.4, extent=extent, origin='upper') title = ax.set_title("") ax.set_xlabel("经度") ax.set_ylabel("纬度") 动画更新函数 def update(frame): level = flood_levels[frame] mask = np.where(dem <= level, 1, np.nan) flood_overlay.set_data(mask) title.set_text(f"洪水高度: {level}米") return flood_overlay, title 创建动画 ani = FuncAnimation(fig, update, frames=len(flood_levels), interval=300, blit=True) plt.tight_layout() plt.show() 保存动画为gif格式 ani.save("flood_simulation.gif", writer='pillow', fps=5) ``` 结论与下一步 本文通过Python和DEM数据构建了一个简单的洪水淹没模型,虽然没有应用最复杂的模拟技术,但这种基于高程阈值的方法对于教育、研究和地理空间数据分析来说是一个很好的起点。读者可以自行尝试使用自己的高程数据,适应特定的背景下,探索增强或扩展这一方法的可能性。 业内人士评价: 专家认为,这种方法简单易懂,适合初学者使用,能够有效展示洪水的视觉影响。此外,它提供了一个可扩展的基础,为更高级的洪水模拟研究打下基础。美国地质调查局(USGS)是全球知名的地理空间数据提供商,拥有丰富的公开数据资源,适用于各类科研和应用项目。

Related Links