Geo_Clima / gif_utils.py
gabriela05's picture
Create gif_utils.py
a7b3a29 verified
import os
import xarray as xr
import matplotlib.pyplot as plt
import imageio.v2 as imageio
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import geopandas as gpd
def salvar_figura_por_step(arquivos_nc, output_dir, shape=None):
os.makedirs(output_dir, exist_ok=True)
for arq in arquivos_nc:
try:
ds = xr.open_dataset(arq)
var = list(ds.data_vars)[0]
da = ds[var]
if shape is not None:
da = da.rio.write_crs("epsg:4326")
da = da.rio.clip(shape.geometry, shape.crs, drop=True)
timestamp = str(da.time.values)[:13].replace(":", "").replace("T", "_") if "time" in da.coords else "step"
fig, ax = plt.subplots(figsize=(8, 6), subplot_kw={"projection": ccrs.PlateCarree()})
da.plot(ax=ax, transform=ccrs.PlateCarree(), cmap="Blues", cbar_kwargs={'label': 'mm'})
ax.add_feature(cfeature.COASTLINE)
ax.set_title(f"Precipitação prevista - {timestamp}")
plt.savefig(f"{output_dir}/{timestamp}.png", bbox_inches="tight")
plt.close()
except Exception as e:
print(f"Erro em {arq}: {e}")
def gerar_gif_a_partir_das_imagens(input_dir, output_path, tempo_inicial=None, tempo_final=None, duracao=0.8):
imagens = []
arquivos = sorted(f for f in os.listdir(input_dir) if f.endswith(".png"))
for f in arquivos:
nome = f.split(".")[0]
if tempo_inicial and nome < tempo_inicial:
continue
if tempo_final and nome > tempo_final:
continue
imagens.append(imageio.imread(os.path.join(input_dir, f)))
if imagens:
imageio.mimsave(output_path, imagens, duration=duracao)
return output_path
else:
raise ValueError("Nenhuma imagem encontrada no intervalo especificado.")
def carregar_shape_efc(shp_path):
return gpd.read_file(shp_path)