Atrás

Análisis Climático Global con Datos ERA5

Análisis Climático Global con Datos ERA5

Descripción

Visualización avanzada de datos meteorológicos 3D usando modelos ECMWF Copernicus

Detalles

Sistema completo para procesamiento y visualización de datos climáticos con: - Carga y procesamiento de formatos GRIB/NetCDF - Visualizaciones 2D/3D con proyecciones cartográficas - Análisis temporal de series climáticas - Integración con datos geoespaciales (GeoJSON) - Animaciones de evolución temporal - Modelado de temperaturas y variables atmosféricas

Tecnologías Utilizadas

Python 3.11XarrayCartopyNetCDF4MatplotlibGeoPandascfgrib

Detalles Técnicos

Instalación de Dependencias

                          
1 pip install cfgrib cartopy netCDF4 geopandas
Imagen técnica - Instalación de Dependencias

Carga de Datos NetCDF4

                          
1 import netCDF4 as nc
2 import numpy as np
3 import matplotlib.pyplot as plt
4 import cartopy.crs as ccrs
5 import cartopy.feature as cfeature
6
7 # Ruta del archivo .nc (cambia esto por la ubicación de tu archivo)
8 file_path = "/content/drive/MyDrive/3c7785ed8c7cf99c2ae80fafa694aef4.nc"
9
10 # Cargar el archivo NetCDF4
11 dataset = nc.Dataset(file_path, mode="r")
12
13 # Obtener las variables necesarias
14 t2m = dataset.variables['t2m'][0, :, :] # Seleccionar el primer 'valid_time'
15 lat = dataset.variables['latitude'][:]
16 lon = dataset.variables['longitude'][:]
17
18 # Convertir a Celsius
19 t2m_celsius = t2m - 273.15
20
21 # Crear la figura y el mapa
22 fig, ax = plt.subplots(figsize=(10, 5), subplot_kw={'projection': ccrs.PlateCarree()})
23 ax.set_extent([lon.min(), lon.max(), lat.min(), lat.max()], crs=ccrs.PlateCarree())
24
25 # Agregar características al mapa
26 ax.add_feature(cfeature.COASTLINE)
27 ax.add_feature(cfeature.BORDERS, linestyle=':')
28 ax.add_feature(cfeature.LAND, edgecolor='black')
29 ax.add_feature(cfeature.LAKES, edgecolor='black')
30 ax.add_feature(cfeature.RIVERS, edgecolor='blue')
31
32 # Dibujar la temperatura
33 c = ax.pcolormesh(lon, lat, t2m_celsius, cmap='coolwarm', transform=ccrs.PlateCarree())
34
35 # Agregar barra de color
36 cbar = plt.colorbar(c, orientation='horizontal', pad=0.05)
37 cbar.set_label('2m Temperature (°C)')
38
39 # Título del gráfico
40 plt.title("2m Temperature from ECMWF")
41
42 # Mostrar el gráfico
43 plt.show()
44
45 # Cerrar el dataset
46 dataset.close()
Imagen técnica - Carga de Datos NetCDF4

Visualización con Cartopy y GRIB

                          
1 import numpy as np
2 import xarray as xr
3 import cfgrib
4 import geopandas as gpd
5 import matplotlib.pyplot as plt
6 import cartopy.crs as ccrs
7 import cartopy.feature as cfeature
8 import warnings
9
10 # Ignorar advertencias específicas
11 warnings.filterwarnings("ignore", category=FutureWarning)
12 warnings.filterwarnings("ignore", category=UserWarning)
13
14 # Ruta del archivo GRIB (modifica según tu ubicación)
15 file_path = "/content/drive/MyDrive/53ff69f95521585163052af17eefd0c1.grib"
16
17 # Ruta del archivo GeoJSON (modifica según tu ubicación)
18 geojson_path = "/content/drive/MyDrive/DEPARTAMENTOS_PY_CNPV2022.geojson.txt"
19
20 # Cargar el dataset GRIB
21 data = xr.open_dataset(file_path, engine='cfgrib')
22
23 # Extraer temperatura y coordenadas
24 lons = data.longitude.values
25 lats = data.latitude.values
26 temp = data.stl2.values[0] - 273.15 # Convertir de Kelvin a Celsius
27
28 # Cargar el archivo GeoJSON
29 gdf = gpd.read_file(geojson_path)
30
31 # Crear la figura con una proyección ortográfica centrada en Sudamérica
32 fig = plt.figure(figsize=(12, 12))
33 ax = fig.add_subplot(111, projection=ccrs.Orthographic(central_longitude=-60, central_latitude=-15))
34
35 # Agregar características del mapa
36 ax.add_feature(cfeature.LAND, edgecolor='black')
37 ax.add_feature(cfeature.OCEAN)
38 ax.add_feature(cfeature.COASTLINE)
39 ax.add_feature(cfeature.BORDERS, linestyle='-')
40
41 # Dibujar el límite del mapa
42 ax.gridlines(draw_labels=False, linestyle="--", color="gray", alpha=0.5)
43
44 # Proyectar los datos de temperatura
45 vmin, vmax = -40, 40
46 mesh = ax.imshow(temp, extent=[lons.min(), lons.max(), lats.min(), lats.max()]
47 transform=ccrs.PlateCarree(), cmap='coolwarm', origin='upper', vmin=vmin, vmax=vmax)
48
49 # Agregar barra de colores
50 cbar = plt.colorbar(mesh, orientation='horizontal', pad=0.05, extend='both')
51 cbar.set_label('Temperature (°C)')
52 cbar.set_ticks(np.arange(vmin, vmax + 10, 10))
53
54 # Agregar título
55 plt.title('ERA5-Pressure-levels, Daily Mean Temperature at 1000 hPa\n2025-02-07 (UTC)')
56
57 # Mostrar el gráfico
58 plt.show()
Imagen técnica - Visualización con Cartopy y GRIB

Visualización con Cartopy y GeoJSON

                          
1 import numpy as np
2 import xarray as xr
3 import cfgrib
4 import geopandas as gpd
5 import matplotlib.pyplot as plt
6 import cartopy.crs as ccrs
7 import cartopy.feature as cfeature
8 import warnings
9
10 # Ignorar advertencias específicas
11 warnings.filterwarnings("ignore", category=FutureWarning)
12 warnings.filterwarnings("ignore", category=UserWarning)
13
14 # Ruta del archivo GRIB (modifica según tu ubicación)
15 file_path = "/content/drive/MyDrive/53ff69f95521585163052af17eefd0c1.grib"
16
17 # Ruta del archivo GeoJSON (modifica según tu ubicación)
18 geojson_path = "/content/drive/MyDrive/DEPARTAMENTOS_PY_CNPV2022.geojson.txt"
19
20 # Cargar el dataset GRIB
21 data = xr.open_dataset(file_path, engine='cfgrib')
22
23 # Extraer temperatura y coordenadas
24 lons = data.longitude.values
25 lats = data.latitude.values
26 temp = data.stl2.values[0] - 273.15 # Convertir de Kelvin a Celsius
27
28 # Cargar el archivo GeoJSON
29 gdf = gpd.read_file(geojson_path)
30
31 # Crear la figura con un zoom más adecuado
32 fig = plt.figure(figsize=(15, 10))
33 ax = fig.add_subplot(111, projection=ccrs.PlateCarree())
34
35 # Configurar la extensión del mapa para Sudamérica
36 ax.set_extent([-85, -30, -60, 15], crs=ccrs.PlateCarree())
37
38 # Agregar características del mapa
39 ax.add_feature(cfeature.LAND, edgecolor='black')
40 ax.add_feature(cfeature.OCEAN)
41 ax.add_feature(cfeature.COASTLINE)
42 ax.add_feature(cfeature.BORDERS, linestyle='-')
43
44 # Agregar límites de los departamentos desde el GeoJSON
45 gdf.boundary.plot(ax=ax, edgecolor="black", linewidth=1.2, transform=ccrs.PlateCarree())
46
47 # Proyectar los datos con un rango de temperatura adecuado
48 vmin, vmax = -40, 40
49 mesh = ax.imshow(temp, extent=[lons.min(), lons.max(), lats.min(), lats.max()]
50 transform=ccrs.PlateCarree(), cmap='coolwarm', origin='upper', vmin=vmin, vmax=vmax)
51
52 # Agregar barra de colores
53 cbar = plt.colorbar(mesh, orientation='horizontal', pad=0.05, extend='both')
54 cbar.set_label('Temperature (°C)')
55 cbar.set_ticks(np.arange(vmin, vmax + 10, 10))
56
57 # Agregar título
58 plt.title('ERA5-Pressure-levels, Daily Mean Temperature at 1000 hPa\n2025-02-07 (UTC)')
59
60 # Mostrar el gráfico
61 plt.show()
Imagen técnica - Visualización con Cartopy y GeoJSON

Descargas