import boto3 import os import logging from botocore import UNSIGNED from botocore.config import Config BUCKET = "copernicus-dem-30m" OUTPUT_DIR = "./glo30_world" LOG_FILE = "download_world.log" logging.basicConfig( filename=LOG_FILE, level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s", ) console = logging.getLogger("console") console.setLevel(logging.INFO) console.addHandler(logging.StreamHandler()) def log(msg): logging.info(msg) console.info(msg) os.makedirs(OUTPUT_DIR, exist_ok=True) s3 = boto3.client("s3", config=Config(signature_version=UNSIGNED)) log("Inizio scansione di tutte le cartelle globali...") folders = [] paginator = s3.get_paginator("list_objects_v2") # Legge SOLO le directory top-level for page in paginator.paginate(Bucket=BUCKET, Delimiter="/"): for prefix in page.get("CommonPrefixes", []): folder = prefix["Prefix"] # Filtra solo i tile DEM if folder.startswith("Copernicus_DSM_COG_10_") and folder.endswith("_DEM/"): folders.append(folder) log(f"[FOUND] {folder}") log(f"Trovate {len(folders)} cartelle globali") # ----------------------------- # DOWNLOAD SOLO IL DEM PRINCIPALE # ----------------------------- for folder in folders: tif_name = folder[:-1] + ".tif" # rimuove "/" e aggiunge .tif key = folder + tif_name.split("/")[-1] out_path = os.path.join(OUTPUT_DIR, tif_name.split("/")[-1]) if os.path.exists(out_path): log(f"[SKIP] {out_path} già presente") continue log(f"[DOWNLOAD] {key}") try: s3.download_file(BUCKET, key, out_path) log(f"[OK] {key} scaricato") except Exception as e: log(f"[ERROR] {key} → {e}") log("Completato.")