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