add works in progress
This commit is contained in:
@@ -26,12 +26,13 @@ import bz2
|
|||||||
import subprocess
|
import subprocess
|
||||||
import pygrib
|
import pygrib
|
||||||
import re
|
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 = datetime.datetime.utcnow().strftime("%d%m%y")
|
||||||
today = date.today().strftime("%y%m%d")
|
today = date.today()
|
||||||
filename = f"{basename}_{today}-12.grb.bz2"
|
target = (today - timedelta(previousday)).strftime("%y%m%d")
|
||||||
|
filename = f"{basename}_{target}-12.grb.bz2"
|
||||||
grib_filename = filename.replace(".bz2", "")
|
grib_filename = filename.replace(".bz2", "")
|
||||||
return base_url + filename, filename, grib_filename
|
return base_url + filename, filename, grib_filename
|
||||||
|
|
||||||
@@ -165,12 +166,12 @@ def main():
|
|||||||
merged_filename = "merged.grb"
|
merged_filename = "merged.grb"
|
||||||
|
|
||||||
url, bz2_filename, grib_a_filename = build_url("https://openskiron.org/gribs_wrf_4km/","Dunkirk_4km_WRF_WAM")
|
url, bz2_filename, grib_a_filename = build_url("https://openskiron.org/gribs_wrf_4km/","Dunkirk_4km_WRF_WAM")
|
||||||
#download_file(url, bz2_filename)
|
download_file(url, bz2_filename)
|
||||||
#decompress_bz2(bz2_filename, grib_a_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")
|
url, bz2_filename, grib_b_filename = build_url("https://openskiron.org/gribs_wrf_4km/","Hastings_4km_WRF_WAM")
|
||||||
#download_file(url, bz2_filename)
|
download_file(url, bz2_filename)
|
||||||
#decompress_bz2(bz2_filename, grib_b_filename)
|
decompress_bz2(bz2_filename, grib_b_filename)
|
||||||
|
|
||||||
extract_surface_current(grib_a_filename,"surfacea.grb")
|
extract_surface_current(grib_a_filename,"surfacea.grb")
|
||||||
extract_surface_current(grib_b_filename,"surfaceb.grb")
|
extract_surface_current(grib_b_filename,"surfaceb.grb")
|
||||||
|
|||||||
43
downloader.py
Normal file
43
downloader.py
Normal file
@@ -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)
|
||||||
132
iface.py
Normal file
132
iface.py
Normal file
@@ -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("<Configure>", self.resize_image)
|
||||||
|
self.canvas.bind("<Button-1>", self.on_click)
|
||||||
|
self.canvas.bind("<B1-Motion>", self.on_drag)
|
||||||
|
self.canvas.bind("<ButtonRelease-1>", 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()
|
||||||
Reference in New Issue
Block a user