Visualización avanzada de datos meteorológicos 3D usando modelos ECMWF Copernicus
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
1 pip install cfgrib cartopy netCDF4 geopandas
1 import netCDF4 as nc2 import numpy as np3 import matplotlib.pyplot as plt4 import cartopy.crs as ccrs5 import cartopy.feature as cfeature67 # Ruta del archivo .nc (cambia esto por la ubicación de tu archivo)8 file_path = "/content/drive/MyDrive/3c7785ed8c7cf99c2ae80fafa694aef4.nc"910 # Cargar el archivo NetCDF411 dataset = nc.Dataset(file_path, mode="r")1213 # Obtener las variables necesarias14 t2m = dataset.variables['t2m'][0, :, :] # Seleccionar el primer 'valid_time'15 lat = dataset.variables['latitude'][:]16 lon = dataset.variables['longitude'][:]1718 # Convertir a Celsius19 t2m_celsius = t2m - 273.152021 # Crear la figura y el mapa22 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())2425 # Agregar características al mapa26 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')3132 # Dibujar la temperatura33 c = ax.pcolormesh(lon, lat, t2m_celsius, cmap='coolwarm', transform=ccrs.PlateCarree())3435 # Agregar barra de color36 cbar = plt.colorbar(c, orientation='horizontal', pad=0.05)37 cbar.set_label('2m Temperature (°C)')3839 # Título del gráfico40 plt.title("2m Temperature from ECMWF")4142 # Mostrar el gráfico43 plt.show()4445 # Cerrar el dataset46 dataset.close()
1 import numpy as np2 import xarray as xr3 import cfgrib4 import geopandas as gpd5 import matplotlib.pyplot as plt6 import cartopy.crs as ccrs7 import cartopy.feature as cfeature8 import warnings910 # Ignorar advertencias específicas11 warnings.filterwarnings("ignore", category=FutureWarning)12 warnings.filterwarnings("ignore", category=UserWarning)1314 # Ruta del archivo GRIB (modifica según tu ubicación)15 file_path = "/content/drive/MyDrive/53ff69f95521585163052af17eefd0c1.grib"1617 # Ruta del archivo GeoJSON (modifica según tu ubicación)18 geojson_path = "/content/drive/MyDrive/DEPARTAMENTOS_PY_CNPV2022.geojson.txt"1920 # Cargar el dataset GRIB21 data = xr.open_dataset(file_path, engine='cfgrib')2223 # Extraer temperatura y coordenadas24 lons = data.longitude.values25 lats = data.latitude.values26 temp = data.stl2.values[0] - 273.15 # Convertir de Kelvin a Celsius2728 # Cargar el archivo GeoJSON29 gdf = gpd.read_file(geojson_path)3031 # Crear la figura con una proyección ortográfica centrada en Sudamérica32 fig = plt.figure(figsize=(12, 12))33 ax = fig.add_subplot(111, projection=ccrs.Orthographic(central_longitude=-60, central_latitude=-15))3435 # Agregar características del mapa36 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='-')4041 # Dibujar el límite del mapa42 ax.gridlines(draw_labels=False, linestyle="--", color="gray", alpha=0.5)4344 # Proyectar los datos de temperatura45 vmin, vmax = -40, 4046 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)4849 # Agregar barra de colores50 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))5354 # Agregar título55 plt.title('ERA5-Pressure-levels, Daily Mean Temperature at 1000 hPa\n2025-02-07 (UTC)')5657 # Mostrar el gráfico58 plt.show()
1 import numpy as np2 import xarray as xr3 import cfgrib4 import geopandas as gpd5 import matplotlib.pyplot as plt6 import cartopy.crs as ccrs7 import cartopy.feature as cfeature8 import warnings910 # Ignorar advertencias específicas11 warnings.filterwarnings("ignore", category=FutureWarning)12 warnings.filterwarnings("ignore", category=UserWarning)1314 # Ruta del archivo GRIB (modifica según tu ubicación)15 file_path = "/content/drive/MyDrive/53ff69f95521585163052af17eefd0c1.grib"1617 # Ruta del archivo GeoJSON (modifica según tu ubicación)18 geojson_path = "/content/drive/MyDrive/DEPARTAMENTOS_PY_CNPV2022.geojson.txt"1920 # Cargar el dataset GRIB21 data = xr.open_dataset(file_path, engine='cfgrib')2223 # Extraer temperatura y coordenadas24 lons = data.longitude.values25 lats = data.latitude.values26 temp = data.stl2.values[0] - 273.15 # Convertir de Kelvin a Celsius2728 # Cargar el archivo GeoJSON29 gdf = gpd.read_file(geojson_path)3031 # Crear la figura con un zoom más adecuado32 fig = plt.figure(figsize=(15, 10))33 ax = fig.add_subplot(111, projection=ccrs.PlateCarree())3435 # Configurar la extensión del mapa para Sudamérica36 ax.set_extent([-85, -30, -60, 15], crs=ccrs.PlateCarree())3738 # Agregar características del mapa39 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='-')4344 # Agregar límites de los departamentos desde el GeoJSON45 gdf.boundary.plot(ax=ax, edgecolor="black", linewidth=1.2, transform=ccrs.PlateCarree())4647 # Proyectar los datos con un rango de temperatura adecuado48 vmin, vmax = -40, 4049 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)5152 # Agregar barra de colores53 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))5657 # Agregar título58 plt.title('ERA5-Pressure-levels, Daily Mean Temperature at 1000 hPa\n2025-02-07 (UTC)')5960 # Mostrar el gráfico61 plt.show()