diff --git a/DownloadCurrents.py b/DownloadCurrents.py index 54a258a..3eeb327 100644 --- a/DownloadCurrents.py +++ b/DownloadCurrents.py @@ -26,12 +26,13 @@ import bz2 import subprocess import pygrib import re -from datetime import date +from datetime import date,timedelta -def build_url(base_url, basename): +def build_url(base_url, basename,previousday=0): # today = datetime.datetime.utcnow().strftime("%d%m%y") - today = date.today().strftime("%y%m%d") - filename = f"{basename}_{today}-12.grb.bz2" + today = date.today() + target = (today - timedelta(previousday)).strftime("%y%m%d") + filename = f"{basename}_{target}-12.grb.bz2" grib_filename = filename.replace(".bz2", "") return base_url + filename, filename, grib_filename @@ -165,12 +166,12 @@ def main(): merged_filename = "merged.grb" url, bz2_filename, grib_a_filename = build_url("https://openskiron.org/gribs_wrf_4km/","Dunkirk_4km_WRF_WAM") - #download_file(url, bz2_filename) - #decompress_bz2(bz2_filename, grib_a_filename) + download_file(url, bz2_filename) + decompress_bz2(bz2_filename, grib_a_filename) url, bz2_filename, grib_b_filename = build_url("https://openskiron.org/gribs_wrf_4km/","Hastings_4km_WRF_WAM") - #download_file(url, bz2_filename) - #decompress_bz2(bz2_filename, grib_b_filename) + download_file(url, bz2_filename) + decompress_bz2(bz2_filename, grib_b_filename) extract_surface_current(grib_a_filename,"surfacea.grb") extract_surface_current(grib_b_filename,"surfaceb.grb") diff --git a/downloader.py b/downloader.py new file mode 100644 index 0000000..dd62e85 --- /dev/null +++ b/downloader.py @@ -0,0 +1,43 @@ +import subprocess +import os +from datetime import datetime, timedelta + +class CopernicusDownloader: + def __init__(self, user, pwd): + self.user = user + self.pwd = pwd + self.dataset_id = "cmems_mod_ibi_phy_anfc_0.027deg-2D_PT1H-m" + self.service_id = "IBI_ANALYSISFORECAST_PHY_005_001-TDS" + self.motu_url = "https://nrt.cmems-du.eu/motu-web/Motu" + + def download(self, lat_min, lat_max, lon_min, lon_max, days, output_dir): + today = datetime.utcnow() + start_date = today.strftime("%Y-%m-%dT00:00:00") + end_date = (today + timedelta(days=days)).strftime("%Y-%m-%dT23:00:00") + os.makedirs(output_dir, exist_ok=True) + + output_name = f"copernicus_{start_date[:10]}_{end_date[:10]}.nc" + output_path = os.path.join(output_dir, output_name) + + cmd = [ + "motuclient", + "--motu", self.motu_url, + "--service-id", self.service_id, + "--product-id", self.dataset_id, + "--longitude-min", str(lon_min), + "--longitude-max", str(lon_max), + "--latitude-min", str(lat_min), + "--latitude-max", str(lat_max), + "--date-min", start_date, + "--date-max", end_date, + "--variable", "uo", + "--variable", "vo", + "--variable", "zos", + "--variable", "thetao", + "--out-dir", output_dir, + "--out-name", output_name, + "--user", self.user, + "--pwd", self.pwd + ] + + subprocess.run(cmd, check=True) diff --git a/iface.py b/iface.py new file mode 100644 index 0000000..fc3f51b --- /dev/null +++ b/iface.py @@ -0,0 +1,132 @@ +import tkinter as tk +from tkinter import ttk +from tkinter import filedialog +from PIL import Image, ImageTk +import threading +from downloader import CopernicusDownloader + +class MapSelector: + def __init__(self, root): + self.root = root + self.root.title("Copernicus Downloader") + + # Image + self.canvas = tk.Canvas(self.root, cursor="cross") + self.canvas.pack(fill=tk.BOTH, expand=True) + + self.original_img = Image.open("map.png") + self.tk_img = ImageTk.PhotoImage(self.original_img) + self.img_id = self.canvas.create_image(0, 0, anchor="nw", image=self.tk_img) + + self.canvas.bind("", self.resize_image) + self.canvas.bind("", self.on_click) + self.canvas.bind("", self.on_drag) + self.canvas.bind("", self.on_release) + + self.start_x = self.start_y = None + self.rect = None + + # Coordonnées + coord_frame = tk.Frame(self.root) + coord_frame.pack(pady=5) + + self.lat1_var = tk.StringVar() + self.lon1_var = tk.StringVar() + self.lat2_var = tk.StringVar() + self.lon2_var = tk.StringVar() + + for i, (label, var) in enumerate([ + ("Lat Min", self.lat1_var), ("Lon Min", self.lon1_var), + ("Lat Max", self.lat2_var), ("Lon Max", self.lon2_var) + ]): + tk.Label(coord_frame, text=label).grid(row=i//2, column=(i % 2) * 2) + tk.Entry(coord_frame, textvariable=var).grid(row=i//2, column=(i % 2) * 2 + 1) + + # Authentification + auth_frame = tk.Frame(self.root) + auth_frame.pack(pady=5) + + self.user_var = tk.StringVar() + self.pwd_var = tk.StringVar() + + tk.Label(auth_frame, text="Utilisateur:").grid(row=0, column=0) + tk.Entry(auth_frame, textvariable=self.user_var).grid(row=0, column=1) + + tk.Label(auth_frame, text="Mot de passe:").grid(row=1, column=0) + tk.Entry(auth_frame, textvariable=self.pwd_var, show="*").grid(row=1, column=1) + + # Durée + self.duration_var = tk.StringVar(value="1") + tk.Label(self.root, text="Durée (jours):").pack() + ttk.Combobox(self.root, textvariable=self.duration_var, values=["1", "2", "3", "4", "5"]).pack(pady=5) + + # Boutons + tk.Button(self.root, text="Télécharger", command=self.start_download).pack(pady=5) + + self.status = tk.Label(self.root, text="") + self.status.pack() + + self.progress = ttk.Progressbar(self.root, orient="horizontal", length=300, mode="indeterminate") + self.progress.pack(pady=5) + + self.display_image() + + def resize_image(self, event): + resized_img = self.original_img.resize((event.width, event.height), Image.Resampling.LANCZOS) + self.tk_img = ImageTk.PhotoImage(resized_img) + self.canvas.itemconfig(self.img_id, image=self.tk_img) + + def latlon_from_xy(self, x, y): + lat_min, lat_max = 45.0, 56.6 + lon_min, lon_max = -9.0, 9.5 + lat = lat_max - (y / self.canvas.winfo_height()) * (lat_max - lat_min) + lon = lon_min + (x / self.canvas.winfo_width()) * (lon_max - lon_min) + return lat, lon + + def on_click(self, event): + self.start_x, self.start_y = event.x, event.y + self.rect = self.canvas.create_rectangle(self.start_x, self.start_y, event.x, event.y, outline="red") + + def on_drag(self, event): + self.canvas.coords(self.rect, self.start_x, self.start_y, event.x, event.y) + + def on_release(self, event): + lat1, lon1 = self.latlon_from_xy(self.start_x, self.start_y) + lat2, lon2 = self.latlon_from_xy(event.x, event.y) + self.lat1_var.set(f"{min(lat1, lat2):.4f}") + self.lat2_var.set(f"{max(lat1, lat2):.4f}") + self.lon1_var.set(f"{min(lon1, lon2):.4f}") + self.lon2_var.set(f"{max(lon1, lon2):.4f}") + + def display_image(self): + resized_img = self.original_img.resize((self.canvas.winfo_width(), self.canvas.winfo_height()), Image.Resampling.LANCZOS) + self.tk_img = ImageTk.PhotoImage(resized_img) + self.canvas.itemconfig(self.img_id, image=self.tk_img) + + def start_download(self): + threading.Thread(target=self.download).start() + + def download(self): + self.status.config(text="Téléchargement en cours...") + self.progress.start() + self.root.update_idletasks() + try: + downloader = CopernicusDownloader(self.user_var.get(), self.pwd_var.get()) + downloader.download( + lat_min=float(self.lat1_var.get()), + lat_max=float(self.lat2_var.get()), + lon_min=float(self.lon1_var.get()), + lon_max=float(self.lon2_var.get()), + days=int(self.duration_var.get()), + output_dir="downloads" + ) + self.status.config(text="Téléchargement terminé avec succès.") + except Exception as e: + self.status.config(text=f"Erreur: {e}") + finally: + self.progress.stop() + +if __name__ == "__main__": + root = tk.Tk() + app = MapSelector(root) + root.mainloop() diff --git a/map.png b/map.png new file mode 100644 index 0000000..3c118ed Binary files /dev/null and b/map.png differ