|
2 | 2 | Utilities |
3 | 3 | """ |
4 | 4 |
|
| 5 | +import os |
| 6 | +import tempfile |
| 7 | + |
5 | 8 | from django.apps import apps |
| 9 | +from django.conf import settings |
6 | 10 | from django.contrib.auth import get_user_model |
7 | 11 | from django.core.mail import EmailMessage, send_mail |
8 | 12 | from dms2dec.dms_convert import dms2dec |
@@ -235,3 +239,55 @@ def normalize_dms2dec(data): |
235 | 239 | if "°" in data: |
236 | 240 | return dms2dec(data) |
237 | 241 | return data |
| 242 | + |
| 243 | + |
| 244 | +def create_opengribs_bounding_box(longitude, latitude): |
| 245 | + """ |
| 246 | + Calculate Bounding Box for GRIBS file download. |
| 247 | + """ |
| 248 | + return { |
| 249 | + "long_min": longitude - 1, |
| 250 | + "long_max": longitude + 1, |
| 251 | + "lat_min": latitude - 1, |
| 252 | + "lat_max": latitude + 1, |
| 253 | + } |
| 254 | + |
| 255 | + |
| 256 | +def request_opengribs_file(bounding_box): |
| 257 | + """ |
| 258 | + Request GRIBS file on opengribs.org |
| 259 | + """ |
| 260 | + request = requests.get( |
| 261 | + url=( |
| 262 | + f"http://grbsrv.opengribs.org/getmygribs2.php?osys=Unknown&ver=1.2.6&model=icon_p25_&" |
| 263 | + f"la1={bounding_box['lat_min']}&la2={bounding_box['lat_max']}&" |
| 264 | + f"lo1={bounding_box['long_min']}&lo2={bounding_box['long_max']}&" |
| 265 | + f"intv=3&days=8&cyc=last&par=W;&wmdl=none&wpar=h;d;p;" |
| 266 | + ) |
| 267 | + ) |
| 268 | + return request.json()["message"]["url"] |
| 269 | + |
| 270 | + |
| 271 | +def get_opengribs_file(url): |
| 272 | + """ |
| 273 | + Get OpenGRIBS file and save to disk. |
| 274 | + """ |
| 275 | + response = requests.get(url, stream=True) |
| 276 | + if response.status_code != 200: |
| 277 | + return |
| 278 | + total_size = int(response.headers.get("content-length", 0)) |
| 279 | + os.makedir(os.path.join(settings.SIMULATION_ROOT, "input")) |
| 280 | + filename = os.path.join(settings.SIMULATION_ROOT, "input", url.split("/")[-1]) |
| 281 | + with open(filename, "wb") as f: |
| 282 | + for chunk in response.iter_content(chunk_size=1024): |
| 283 | + f.write(chunk) |
| 284 | + return filename |
| 285 | + |
| 286 | + |
| 287 | +def get_opengribs_data(longitude, latitde): |
| 288 | + """ |
| 289 | + Get data from OpenGRIBS |
| 290 | + """ |
| 291 | + bbox = create_opengribs_bounding_box(longitude, latitude) |
| 292 | + download_url = request_opengribs_file(bbox) |
| 293 | + return get_opengribs_file(download_url) |
0 commit comments