diff options
author | Jonas Gunz <himself@jonasgunz.de> | 2024-10-14 02:23:10 +0200 |
---|---|---|
committer | Jonas Gunz <himself@jonasgunz.de> | 2024-10-14 02:23:10 +0200 |
commit | 663edde231af9ad4a782c5438027ef7f839806ea (patch) | |
tree | 3e0d6745e5b1c633a76e404a56b734caddcf6b37 /metchart/plotter/vertical_from_grib.py | |
parent | 9e5f1d17a4b0165bd4a3218ca24a159012ea49bd (diff) | |
download | meteo_toolbox-663edde231af9ad4a782c5438027ef7f839806ea.tar.gz |
package with python
Diffstat (limited to 'metchart/plotter/vertical_from_grib.py')
-rwxr-xr-x | metchart/plotter/vertical_from_grib.py | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/metchart/plotter/vertical_from_grib.py b/metchart/plotter/vertical_from_grib.py new file mode 100755 index 0000000..c632b0b --- /dev/null +++ b/metchart/plotter/vertical_from_grib.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +import os + +import datetime +import json + +import matplotlib.pyplot as plt + +import xarray as xr +from metpy.units import units +import metpy.calc as mpcalc +import numpy as np + +import skewt + +from . import misc + +config = { + 'source':'dwd_icon-eu/combined.grib2', + 'plots':[ + { + 'lat':47.9626, + 'lon':11.9964, + 'name':'Antersberg', + 'analysis':'lcl' + }, + ] +} + +def run(data, plots, output='.'): + misc.create_output_dir(output) + index = [] + + for plot in plots: + index.append(_plot(data, output, **plot)) + + return index + +def _plot(data, output, name, lat=None, lon=None, analysis=None): + for_temp = data[['r', 't', 'u', 'v']] + + if not (lat is None and lon is None): + for_temp = for_temp.sel(latitude=lat, longitude=lon, method='nearest') + + index = [] + + for step in for_temp.coords['step']: + this_step = for_temp.sel(step=step) + + p = this_step.coords['isobaricInhPa'].values * units.hPa + T = this_step.t.values * units.K + relHum = this_step.r.values * units.percent + Td = mpcalc.dewpoint_from_relative_humidity(T, relHum) + u = this_step.u.values * (units.m / units.s) + v = this_step.v.values * (units.m / units.s) + + valid = misc.np_time_convert(step.valid_time.values) + init = misc.np_time_convert(step.time.values) + + valid_str = valid.strftime('%d %b %Y - %HUTC') + init_str = init.strftime('%d %b %Y - %HUTC') + hours_since_init_str = str(int(this_step.step.values / np.timedelta64(1,'h'))).zfill(2) + + skt = skewt.Skewt(p=p, T=T, Td=Td) + skt.addWindUV(u, v) + skt.addInfo(f'{name} INIT+' + hours_since_init_str) + skt.addInfo(f"VALID: {valid_str}") + skt.addInfo(f"INIT : {init_str}") + skt.addInfo(f"LAT {lat} LON {lon}") + + if analysis is not None: + skt.addAnalysis(shade=True, analysis=analysis) + + if '_description' in data.attrs: + skt.addInfo(data.attrs['_description']) + + init_for_filename = init.strftime('%Y-%m-%d-%HUTC') + + outname = f'skewt_{name}_{init_for_filename}+{hours_since_init_str}.png' + skt.plot(filename=os.path.join(output, outname)) + + plt.close('all') + + index.append( + { + 'file': outname, + 'init': init_str, + 'valid': valid_str, + 'valid_offset': hours_since_init_str, + 'display_name': name, + 'id': name + } + ) + + with open(os.path.join(output, f'skewt_{name}.index.json'), 'w') as f: + f.write(json.dumps(index, indent=4)) + + return {'name': name, 'indexfile': f'skewt_{name}.index.json', 'list_title': 'Location'} + +if __name__ == '__main__': + run(**config) |