Simulando la inundación de inundaciones con Python y Datos de elevación: una guía para principiantes

se han vuelto más frecuentes y devastadores en todo el mundo, con los efectos del cambio climático en las últimas décadas. En este contexto, el modelado de inundaciones tiene un papel importante en la evaluación de riesgos y las operaciones de respuesta a desastres, al tiempo que sigue siendo un enfoque clave de la investigación avanzada y los estudios académicos.

En este artículo, construiremos un modelo básico de inundación de inundación utilizando Python y un modelo de elevación digital (DEM). Utilizaremos una técnica de relleno de inundación para simular incrementalmente cómo el aumento de los niveles de agua afectan un paisaje y animar el proceso de inundación. Es una forma visual y práctica de explorar datos geoespaciales y riesgos de inundación, incluso sin antecedentes en el modelado hidráulico.

Lo que aprenderás

1. ¿Qué es un modelo de elevación digital (DEM)?

A Modelo de elevación digital (DEM) es una representación numérica de la superficie de la Tierra, donde cada celda (o píxel) en una cuadrícula regular (conocida como datos de trama) contiene un valor de elevación. A diferencia de las imágenes digitales que almacenan información de color, los demócratas almacenan datos de altura, que generalmente excluyen características de superficie como vegetación, edificios y otras estructuras hechas por el hombre.

Los Dem se usan comúnmente en campos como mapeo, hidrología, monitoreo ambiental y ciencias de la tierra. Sirven como un conjunto de datos fundamental para cualquier aplicación que requiera una comprensión detallada del terreno y la elevación.

Muchas fuentes ofrecen datos de DEM gratuitos y confiables, incluido el Mapa nacional de USGS, Data terrestre de la NASAy el Misión de topografía de radar de transbordador (SRTM).

En este artículo, utilizaremos un DEM proporcionado por el Programa Geoespacial Nacional del USGSque está disponible libremente y se lanza en el dominio público.

Nota: Los datos proporcionados por USGS tienen una resolución espacial de 1 arco de segundo (aproximadamente 30 metros en el ecuador).

El área de interés (AOI) en este estudio se encuentra en la región noreste de Brasil. El archivo Dem cubre un mosaico de 1 ° × 1 °, que se extiende desde 6 ° S, 39 ° W a 5 ° S, 38 ° W, y utiliza el sistema de coordenadas WGS84 (EPSG: 4326), como se ilustra a continuación.

Área de interés (imagen del autor que usa Google Maps y QGIS).

2. Cómo cargar y visualizar datos de elevación con Python

Ahora usaremos Python para establecer un entorno viable para visualizar y analizar información inicial sobre datos de DEM. Primero, importemos las bibliotecas necesarias.

# import libraries
import rasterio
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation
  • rasterio: Lee y escribe datos de ráster geoespacial como demócratas.
  • matplotlib.pyplot: Crea visualizaciones estáticas e interactivas.
  • numpy: Maneja operaciones numéricas y datos basados ​​en la matriz.
  • FuncAnimation: Genera animaciones actualizando el marco de los gráficos por marco.

A continuación, usemos el rasterio Biblioteca para abrir y visualizar un archivo DEM del AOI.

# Helper function to load DEM Files
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:
            # Mask no-data values
            dem = np.ma.masked_equal(dem, nodata)

        return dem, transform

La función anterior lee los datos de elevación y verifica si el archivo incluye “valores sin datos”. Los valores de no datos se utilizan para representar áreas sin datos de elevación válidos (por ejemplo, cobertura exterior o píxeles corruptos). Si hay un valor sin datos, la función reemplaza esos píxeles con np.nanhaciendo que sea más fácil manejarlos o ignorarlos en análisis y visualizaciones posteriores.

Visualizando datos de dem

dem = load_dem("s06_w039_1arc_v3.tif")

plt.imshow(dem, cmap='terrain')
plt.title("Digital Elevation Model")
plt.colorbar(label="Elevation (m)")
plt.show()
Dem of the AOI (Crédito: Servicio Geológico de EE. UU.)
  • Uso de coordenadas geográficas en la visualización

Como podemos ver, los ejes están en coordenadas de píxeles (columnas y líneas). Para comprender mejor la inundación de inundaciones, es vital conocer las coordenadas geográficas (latitud y longitud) asociadas con cada píxel de la imagen.

Para lograrlo, utilizaremos los datos del sistema de referencia de coordenadas del archivo Dem. Como se dijo anteriormente, el DEM que estamos usando utiliza el sistema de coordenadas WGS84 (EPSG: 4326).

Podemos adaptar la función auxiliar para cargar archivos DEM de la siguiente manera:

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:
            # Mask nodata values
            dem = np.ma.masked_equal(dem, nodata)

        return dem, transform

La función recupera el transformar Datos del DEM, que es un objeto afín que mapea las posiciones de píxeles (fila, columna) a coordenadas geográficas (latitud y longitud).

Para representar las coordenadas geográficas en los ejes de la trama, será necesario explorar el extent Parámetro del imshow() función.

dem, transform = load_dem("s06_w039_1arc_v3.tif")

# Compute extent from transform
extent = [
    transform[2],                          # xmin (longitude)
    transform[2] + transform[0] * dem.shape[1],  # xmax
    transform[5] + transform[4] * dem.shape[0],  # ymin (latitude)
    transform[5]                          # ymax
]

# Plot with using geographic coordinates
fig, ax = plt.subplots()
img = ax.imshow(dem, cmap='terrain', extent=extent, origin='upper')
ax.set_xlabel('Longitude')
ax.set_ylabel('Latitude')
plt.colorbar(img, label='Elevation (m)')
plt.title('DEM Visualization')
plt.show()

El extent El parámetro se utilizará para definir los límites espaciales de la gráfica DEM utilizando valores derivados de los ráster transform objeto afín. Establece la longitud mínima y máxima (xmin, xmax) y latitud (ymin, ymax) para que la trama muestre coordenadas en los ejes en lugar de los índices de píxeles.

Finalmente, tenemos los siguientes resultados:

Visualización del DEM con coordenadas geográficas (Crédito: Servicio Geológico de EE. UU.).

3. Cómo simular escenarios de inundación con umbrales de elevación

Ahora, demostraremos un método simple pero útil para visualizar escenarios de inundación y simular la inundación. Consiste en definir un umbral de altura y generar una máscara binaria que identifica todas las áreas con elevación por debajo de este nivel.

En este ejemplo, simulamos Inundación en todas las áreas con elevaciones por debajo de 40 metros.

flood_threshold = 40  # meters
flood_mask = (dem <= flood_threshold).astype(int)

plt.imshow(flood_mask, extent=extent, cmap='Blues')
plt.title(f"Flooded Area (Threshold: {flood_threshold}m)")
plt.xlabel("Longitude")
plt.ylabel("Latitude")
plt.show()
Simulación del área inundada (imagen del autor).

Con solo unas pocas líneas de código, podemos visualizar el impacto de diferentes escenarios de inundación en el área de interés (AOI). Sin embargo, debido a que esta visualización es estática, no muestra cómo progresa la inundación con el tiempo. Para lidiar con eso, usaremos matplotlib’s FuncAnimation Para crear una visualización dinámica.

4. Cómo animar la progresión de la inundación con Python

Ahora simularemos un escenario de inundación progresivo aumentando el nivel de agua de forma incremental y generando una nueva máscara en cada paso. Superpondremos esta máscara en la imagen del terreno y la animaremos.

# flood_levels defines how high the flood rises per frame
flood_levels = np.arange(15, 100, 5)

# Set up figure and axes
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("Longitude")
ax.set_ylabel("Latitude")

# Animation function
def update(frame):
    level = flood_levels[frame]
    mask = np.where(dem <= level, 1, np.nan)
    flood_overlay.set_data(mask)
    title.set_text(f"Flood Level: {level} m")
    return flood_overlay, title

# Create animation
ani = FuncAnimation(fig, update, frames=len(flood_levels), interval=300, blit=True)
plt.tight_layout()
plt.show()

# save the output as a gif
ani.save("flood_simulation.gif", writer='pillow', fps=5)
Progresión de inundación (crédito: Servicio Geológico de EE. UU.)

Si está interesado en crear animaciones con Python, este paso a paso tutorial es un gran lugar para comenzar.

Conclusión y próximos pasos

En este artículo, creamos un flujo de trabajo básico para realizar una simulación de inundaciones en Python utilizando datos de elevación de un archivo DEM. Por supuesto, este modelo no implementa las técnicas más avanzadas sobre el tema, aún para la visualización y la comunicación, este método de umbral de elevación ofrece un punto de entrada poderoso y accesible.

Las técnicas de simulación más avanzadas incluyen:

  • Propagación de inundaciones basada en conectividad
  • Dirección de flujo y acumulación
  • Modelado de flujo basado en el tiempo

Sin embargo, este enfoque práctico puede ser de gran beneficio para educadores, estudiantes y analistas que exploran Datos geoespaciales en estudios de respuesta a desastres y modelado ambiental.

El código completo está disponible aquí.

Prometo a los lectores a experimentar con el código utilizando sus propios datos de elevación, adaptarlo a su contexto específico y explorar formas de mejorar o expandir el enfoque.

Referencias

[1] Servicio Geológico de los Estados Unidos. Mapa nacional. Departamento del Interior de EE. UU. Consultado el 17 de mayo de 2025, de https://www.usgs.gov/programs/national-geoSpatial-Program/national-map

[2] Servicio Geológico de los Estados Unidos. ¿Qué es un modelo de elevación digital (DEM)? Departamento del Interior de EE. UU. Consultado el 17 de mayo de 2025, de https://www.usgs.gov/faqs/what-a-digital-elevation-model-dem

[3] Gillies, S. Georreferencing – Documentación de Rasterio (estable). Rasterio. Consultado el 27 de mayo de 2025, de https://rasterio.readthedocs.io/en/stable/topics/georeferencing.html

[4] Gillies, Sean. Affine Transforms – Documentación Rasterio (más reciente). Consultado el 27 de mayo de 2025. https://rasterio.readthedocs.io/en/latest/topics/transforms.html.

Fuente de datos: Los datos de DEM utilizados en este proyecto son proporcionados por el Servicio Geológico de los Estados Unidos (USGS) a través del mapa nacional y se encuentran en el dominio público.