import osimport requestsimport numpy as npimport rasteriofrom io import BytesIObase_url = "https://data.globalecology.unh.edu/data/MF-CW_v2/GPP/MeanSimulation/"save_dir = r"D:\MF_CW\GPP"annual_dir = os.path.join(save_dir, "Annual_Sum")season_dir = os.path.join(save_dir, "Season_Sum")for d in [save_dir, annual_dir, season_dir]: if not os.path.exists(d): os.makedirs(d)for year in range(1982, 1991): year_data = {} meta = None for month in range(1, 13): file_name = f"MF-CW_GPP_{year}.M{month:02d}.tif" url = base_url + file_name local_path = os.path.join(save_dir, file_name) try: r = requests.get(url, timeout=30) if r.status_code == 200: with rasterio.open(BytesIO(r.content)) as src: data = src.read(1).astype("float32") if meta is None: meta = src.meta.copy() data[data <= 0] = np.nan meta.update(dtype="float32", nodata=np.nan) with rasterio.open(local_path, "w", **meta) as dst: dst.write(data, 1) year_data[month] = data except: pass if len(year_data) == 12: stacked = np.stack([year_data[m] for m in range(1, 13)]) annual_sum = np.nansum(stacked, axis=0) annual_sum[np.all(np.isnan(stacked), axis=0)] = np.nan with rasterio.open(os.path.join(annual_dir, f"GPP_Annual_{year}.tif"), "w", **meta) as dst: dst.write(annual_sum.astype("float32"), 1) spring = np.stack([year_data[m] for m in [3, 4, 5]]) summer = np.stack([year_data[m] for m in [6, 7, 8]]) autumn = np.stack([year_data[m] for m in [9, 10, 11]]) spring_sum = np.nansum(spring, axis=0) summer_sum = np.nansum(summer, axis=0) autumn_sum = np.nansum(autumn, axis=0) spring_sum[np.all(np.isnan(spring), axis=0)] = np.nan summer_sum[np.all(np.isnan(summer), axis=0)] = np.nan autumn_sum[np.all(np.isnan(autumn), axis=0)] = np.nan with rasterio.open(os.path.join(season_dir, f"GPP_Spring_{year}.tif"), "w", **meta) as dst: dst.write(spring_sum.astype("float32"), 1) with rasterio.open(os.path.join(season_dir, f"GPP_Summer_{year}.tif"), "w", **meta) as dst: dst.write(summer_sum.astype("float32"), 1) with rasterio.open(os.path.join(season_dir, f"GPP_Autumn_{year}.tif"), "w", **meta) as dst: dst.write(autumn_sum.astype("float32"), 1)print("All tasks completed.")