Eesti Vabariigi meteoroloogiliste radarite andmed
Eestis radariandmed tulevad kahelt radarilt: Harku radar, Sürgavere radar. Radarite omavaheline kaugus on 115 km. Sürgavere radari asukoht on Sürgavere küla, Põhja-Sakala vald, Viljandi maakond, laius: N 58°28´56´´, pikkus: E 25°31´7´´. Mõõtmiste algus oli 2008 aastal. Mõõteraadius on 250 km.
Harku radari asukoht on Paldiski mnt. 245, Tallinn, Harju maakond, laius: N 59°23´53´´, pikkus: E 24°36´10´´. Mõõtmiste algus oli 2009 aastal. Mõõteraadius on 250 km.
Radarite peamised tehnilised näitajad omavahel kattuvad. Radarite tootja on Vaisala Oy. Radarid töötavad 24 tundi ööpäevas. Radaritarkvara eri sõlmedes kasutatakse kellaajana UTC aega.
Radariandmed võivad olla esitatud polaarkujul või georefereeritud ühtlasele võrgule interpoleeritud kujul (Cartesiuse kuju). Polaarkujul andmete puhul on abstsiss range bin-id alustades radari asukohast, ordinaat on asimuudinurk (asimuut - nurk Põhjale suunatud joone ja objektile suunatud joone vahel). Cartesiuse kujul andmete puhul sõltub abstsissi ja ordinaadi arv vastavalt valitud võrgusammule ja lahutusvõimele, mille väärtused võivad olla suvalised. Reaalsed väärtused leiab metainfost.
Radariandmed on esitatud .h5 formaadis failidena. Radariandmed on jagatud kaheks tüübiks:
- Toorandmed – kõikide võimalike mõõtmiste, mida radarid teevad, abil kogutud andmed.
- Produktid – toorandmetest tehtud konkreetset ilmanähtust kirjeldavad andmed. Avalikustatud produktid omakorda on jagatud neljaks tüübiks: radiaalsuunaline tuule kiirus, peegelduvus, kajatipp (echo-top - pilvede ülemise piiri kõrgus), sajuintensiivsuse komposiitprodukt. Vastavalt enda soovile toorandmetest saab genereerida teisi produkte ka.
Avalikustatud produktide ja toorandmetega failid on kätte saadavad viieminutilise ajasammuga.
- Radariandmete filtreerimine ja kvaliteet
Radareid hooldatakse ja kalibreeritakse lähtuvalt tootja soovitustest üldjuhul korra aastas, aga sellest hoolimata võib esineda kõrvalekaldeid andmete kvaliteedis lähtuvalt ilmastikuoludest ja tehnilistest tõrgetest. Vigade arvu ja tõenäosuse vähendamiseks kasutatakse lisa võimalusi, sealhulgas programmeerimiskood.
Kuna radarid vastavalt nende tööprintsibidele skaneerimise käigus fikseerivad mitte ainult ilmanähtuste kirjeldamiseks vajalikke objekte (veetilgad õhus, jääkristallid jne), vaid ka erinevat müra (linnud, lennukid jne), siis radariandmete niinimetatud puhastamiseks kasutatakse filtreid.
Filtreerimist kasutatakse toorandmete puhul. Toorandmetele rakendatakse sõltuvalt andmete tüübist ja radari asukohast erinevaid filtrite parameetreid, et eemaldada ebavajalikku müra. Rakendatud filtrite parameetreid koos piirmäärade väärtustega näeb toorandmetega failis asukohas "dataset -> data -> how" (parameetrite seletusi saab leida rahvusvahelisest juhendist EUMETNET OPERA weather radar information model for implementation with the HDF5 file format.).
KAURi radarid on osa rahvusvahelisest koostöövõrgustikust. Radarifailid avalikustatakse Euroopa Liidu direktiiviga ettenähtud HDF5 formaadis, mis tagab radariandmete kooskõla teiste Euroopa Liidu riikide poolt avalikustatud radariandmetega.
2. Radariandmetega faili nimetuse ehitus
Radariandmetega faili nimi on esitatud järgmisel kujul:
RRR(RR).yyyymmddHHMM(SS).VOL.XXXX.h5
- RRR(RR). – Radari nimetuse esimesed 3-5 tähte enne esimest punkti (HAR/eehar – Harku radarilt saadud andmed, SUR/eesyr – Sürgavere radarilt saadud andmed, comp – sademete komposiitprodukt);
- yyyymmdd – kuupäev AAAAKKPP formaadis, kõik kuupäeva osad nullidega polsterdatud;
- HHMM(SS) – kellaaeg ttmmss formaadis (UTC aeg), toorandmetega failidel sekundid puuduvad;
- .VOL – kolm tähte faili nimi lõpus (nt "CAP", "VOL") viitavad produkti tüübile:
- CAP – viide sademete komposiitproduktile või peegelduvusele (sõltub faili nime esimesest tähest);
- VOL – viide toorandmetele;
- TOP – viide echo-topile;
- PPI – viide radiaalsuunalisele tuule kiirusele
- XXXX – viimased neli kohta on suvalised arvud, toorandmetega failidel puuduvad;
- .h5 – faili formaat, h5 on OdimH5 (HDF5) lühend.
3. Radariandmete visualiseerimine
Allpool on esitatud koodinäide, kuidas saab visualiseerida OdimH5 formaadis olevaid radariandmeid, kasutades Python keelt:
import xarray as xr
import wradlib as wrl
import numpy as np
from numpy import f2py
import pandas as pd
import matplotlib.pyplot as plt
import glob
import warnings
warnings.filterwarnings('ignore')
from pathlib import Path
import cartopy.crs as ccrs
import cartopy.feature as cfeature
path = f'/Users/...' #teekond kuni kaustani radarifailidega (toorandmed)
HAR_h5 = sorted(glob.glob(f'{path}HAR*.h5'))
SUR_h5 = sorted(glob.glob(f'{path}SUR*.h5'))
path2 = f'/Users/...' #teekond kuni kaustani radarifailidega (komposiit sademed)
comp_h5 = sorted(glob.glob(f'{path2}comp*'))
Radariandmetega faili sisu saab kuvada allpool oleva koodi abil (kuna terve sisu on väga pikk, "print" koodist on #-ga varjatud):
f1 = wrl.io.read_opera_hdf5(HAR_h5[0])
#[...]-des asub radarifailidega kaustas oleva ning huvipakkuva radarifaili indeks (alustades nullist)
#for key in f1.keys():
#print(key, '->', f1[key])
f2 = wrl.io.read_opera_hdf5(comp_h5[0])
#for key in f2.keys():
#print(key, '->', f2[key])
Ülespool on esitatud Python koodi abil radarifailist välja võetud radariandmed ja metaandmed. Põhjalikke parameetrite (atribuutide) seletusi saab leida rahvusvahelisest juhendist: EUMETNET OPERA weather radar information model for implementation with the HDF5 file format. Juhendi viimase versiooni saamiseks saab kasutada www.google.com otsingu
- Radariandmetega faili struktuur
Radari toorandmetega faili struktuuri saab kuvada allpool oleva koodi abil (kuna terve struktuur on väga pikk, "print" koodist on #-ga varjatud):
#for k in f1.keys():
#print(k)
#Osa radari toorandmetega faili struktuurist on esitatud allpool:
for k in f1.keys():
if "dataset2" in k:
print(k)
dataset2/data1/data dataset2/data1/how dataset2/data1/what dataset2/data10/data dataset2/data10/what dataset2/data11/data dataset2/data11/what dataset2/data2/data dataset2/data2/how dataset2/data2/what dataset2/data3/data dataset2/data3/how dataset2/data3/what dataset2/data4/data dataset2/data4/how dataset2/data4/what dataset2/data5/data dataset2/data5/how dataset2/data5/what dataset2/data6/data dataset2/data6/what dataset2/data7/data dataset2/data7/what dataset2/data8/data dataset2/data8/what dataset2/data9/data dataset2/data9/what dataset2/how dataset2/what dataset2/where
Radari produktidega faili struktuuri saab kuvada allpool oleva koodi abil:
for l in f2.keys():
print(l)
dataset1/data1/data dataset1/what how what where
HDF5-failis on olemas juurtasand (root), mis sisaldab kõiki failis olevaid hierarhiliselt struktureeritud andmeid. Juur grupis metaandmed on jagatud kolmeks grupiks: what, where, how. Metaandmed, mis kirjeldavad antud faili sisu, aega ja kohta, mida see esindab, on kirjas grupis what. Metaandmed, mis kirjeldavad faili geograafilisi omadusi (sh projektsioon, nurkkoordinaadid, mõõtmed, skaalad) kogutakse gruppi where. What ja where gruppide atribuudid on kohustuslikud. Atribuudid, mis üheselt kirjeldavad täiendavalt andmeid / produkti omadusi, nagu radarisüsteem, kasutatud algoritm ja kvaliteediga seotud metaandmed, salvestatakse how gruppi. How grupi atribuudid on valikulised ehk soovituslikud. Toorandmetega failid (VOL) ja peegelduvuse kohta andmetega failid sisaldavad mitme kõrgusnurga mõõtmisi ühes failis (seda nimetatakse volume failiks), eri mõõtmised on jagatud alamgruppidesse, näiteks dataset1, dataset2 kuni datasetn, kus n on skaneeritud kõrgusnurkade arv. Eri mõõtmised iseennast asuvad alamgruppides, näiteks data1, data2 kuni datak, kus k on ühel skaneeritud kõrgusnurgal eri mõõtmiste arv. See on dataset grupi alamgrupp. Produktidega (peale peegelduvuse) failides on ainult konkreetse produktiga seotud andmemaatriksid ja kohane metaandmestik. What, where, how grupid võivad olla kas üldised või kohalikud. Üldistes gruppides asuvad atribuudid, mis kirjeldavad kogu faili ehk kõiki failis sisaldavaid andmestike. Üldised gruppid asuvad otseselt root grupis. Kohalikes gruppides asuvad atribuudid, mis kirjeldavad iga andmestikku või andmestikke gruppi eraldi. Kohalikud grupid asuvad andmestikuga või andmestikke grupiga koos ühes kaustas.
/
/root eksisteerib alati; root grupi nimetus on sama nagu faili nimi; ühendab endas kõiki ülejäänud struktuurielemente
/what üldine - sisaldab üldist infot mõõtmiskuupäeva ja –kellaaja ning failis sisalduvate andmete tüüpide kohta; see on root grupi alamgrupp / kohalik - sisaldab kõrgusnurga või produkti raames selle andmemaatriksi mõõtedetaile; see on dataset või datanr alamgrupp
/where üldine - sisaldab mõõtmisega seotud geograafilisi detaile, näiteks radari geograafilised koordinaadid või andmetega kaetud ala nurgakoordinaadid (sõltuvalt produktist); toorandmete puhul on andmed polaarkujul, produktid on ühtlase võrgusammuga georefereeritud võrgustikuna; see on root grupi alamgrupp / kohalik - eksisteerib peamiselt toorandmetega failides; sisaldab toorandmetes kõrgusnurga skaneeringu detaile, nagu näiteks kõrgusnurga väärtus või asimuudisuunaline ruumiline lahutusvõime; see on dataset või datanr alamgrupp
/how üldine - sisaldab üldisemalt radari mõõtetehnilisi detaile, näiteks signaaliprotsessori kaod või antenni võimenduse parameetrid; see on root grupi alamgrupp / kohalik - eksisteerib peamiselt toorandmetega failides; sisaldab väga detailseid süsteemi tehnilisi parameetreid ühe kõrgusnurga raames; see on dataset või datanr alamgrupp
/dataset1 toorandmetega failid ning peegelduvuse kohta andmetega failid sisaldavad mitme kõrgusnurga mõõtmisi ühes failis (nimetatakse volume failiks), eri mõõtmised on jagatud alamgruppidesse, näiteks dataset1, dataset2 kuni datasetn, kus n on skaneeritud kõrgusnurkade arv; see on root grupi alamgrupp
/dataset1/data1 toorandmetega failid ning peegelduvuse kohta andmetega failid sisaldavad mitme kõrgusnurga mõõtmisi ühes failis, eri mõõtmised on jagatud alamgruppidesse, näiteks dataset1, dataset2 kuni datasetn, kus n on skaneeritud kõrgusnurkade arv; eri mõõtmised iseennast asuvad alamgruppides, näiteks data1, data2 kuni datak, kus k on ühel skaneeritud kõrgusnurgal eri mõõtmiste arv; see on dataset grupi alamgrupp
/dataset1/data1/data sisaldab mõõdetud andmeid andmemaatriksi kujul; see on datanr alamgrupp
/
print("Üldise what grupi parameetrid (atribuudid): ", "\n", f1['how'])
Üldise what grupi parameetrid (atribuudid): {'FiniteBandwithLoss': 0.0, 'RAC': 0.016, 'RXlossH': 0.0, 'RXlossV': 0.0, 'TXlossH': 0.0, 'TXlossV': 0.0, 'TXtype': b'magnetron', 'antgainH': 0.0, 'antgainV': 0.0, 'beamwH': 0.9500000439584255, 'beamwV': 0.9500000439584255, 'freeze': 2.0, 'gasattn': 0.016, 'poltype': b'simultaneous-dual', 'scan_count': 11, 'simulated': b'False', 'software': b'IRIS', 'sw_version': b'9.0', 'system': b'VAISWRM200', 'towerheight': 16.0, 'wavelength': 5.32}
print("Üldise what grupi parameetrid (atribuudid): ", "\n", f1['what'])
Üldise what grupi parameetrid (atribuudid): {'date': b'20230424', 'object': b'PVOL', 'source': b'WIGOS:0-233-2-26038,WMO:26038,RAD:EE40,PLC:Harku,NOD:eehar', 'time': b'230500', 'version': b'H5rad 2.3'}
print("Üldise where grupi parameetrid (atribuudid): ", "\n", f1['where'])
Üldise where grupi parameetrid (atribuudid): {'height': 49.0, 'lat': 59.39767001196742, 'lon': 24.602100010961294}
Radari toorandmed on esitatud polaarkujul.
#print("Kohaliku how grupi parameetrid (atribuudid): ", "\n", f1['dataset2/how'])
print("Kohaliku what grupi parameetrid (atribuudid): ", "\n", f1['dataset2/what'])
Kohaliku what grupi parameetrid (atribuudid): {'enddate': b'20230424', 'endtime': b'230549', 'product': b'SCAN', 'startdate': b'20230424', 'starttime': b'230528'}
print("Kohaliku where grupi parameetrid (atribuudid): ", "\n", f1['dataset2/where'])
Kohaliku where grupi parameetrid (atribuudid): {'a1gate': 154, 'elangle': 1.3, 'nbins': 833, 'nrays': 360, 'rscale': 300.0, 'rstart': 0.0}
print("Maatriks radariandmetega: ", "\n", f1['dataset2/data1/data'])
Maatriks radariandmetega: [[34024 33961 31379 ... 0 0 0] [34025 33783 31736 ... 0 0 0] [34021 35862 35812 ... 0 0 0] ... [34623 33750 30790 ... 0 0 0] [34018 33789 30622 ... 0 0 0] [34018 33861 30380 ... 0 0 0]]
print("Kohaliku how grupi parameetrid (atribuudid): ", "\n", f1['dataset2/data1/how'])
Kohaliku how grupi parameetrid (atribuudid): {'LOG': 1.375}
print("Kohaliku what grupi atribuudid: ", "\n", f1['dataset2/data1/what'])
Kohaliku what grupi atribuudid: {'gain': 0.01, 'nodata': 65535.0, 'offset': -327.68, 'quantity': b'TH', 'undetect': 0.0}
- 'gain': produktipõhine tõusu koefitsient. Andmete maatriks teisendatakse vastavalt valemile: quantity = offset + gain * raw_value
- 'nodata': puuduvaid andmeid indikeeriv väärtus. See atribuut on alati ujukoma arv, isegi kui andmed ise võivad olla muus vormingus
- 'offset': produktipõhine vabaliikme koefitsient. Andmete maatriks teisendatakse vastavalt valemile: quantity = offset + gain * raw_value
- 'quantity': viide füüsilisele suurusele ja mõõtühikule
- 'undetect': toorväärtus, mida kasutatakse mõõtmistuvastuslävest allapoole jäävate alade tähistamiseks (kiiratakse, kuid midagi ei ole tuvastatud). See atribuut on alati float, isegi kui kõnealused andmed on teises vormingus
print(f1['dataset2/data1/what'])
print(list(f1['dataset2/data1/what'].values()))
gain = list(f1['dataset2/data1/what'].values())[0]
offset = list(f1['dataset2/data1/what'].values())[2]
print("dataset2/data1 gain: ", gain)
print("dataset2/data1 offset:", offset)
{'gain': 0.01, 'nodata': 65535.0, 'offset': -327.68, 'quantity': b'TH', 'undetect': 0.0} [0.01, 65535.0, -327.68, b'TH', 0.0] dataset2/data1 gain: 0.01 dataset2/data1 offset: -327.68
dbz2 = f1['dataset2/data1/data']
dbz2 = dbz2*gain + offset
dbz2.shape
(360, 833)
print("Üldise where grupi parameetrid (atribuudid): ", "\n", f2['where'])
Üldise where grupi parameetrid (atribuudid): {'LL_lat': 56.48834379574241, 'LL_lon': 20.354150207505985, 'LR_lat': 56.58861017046463, 'LR_lon': 29.760049907697866, 'UL_lat': 61.33568305549931, 'UL_lon': 20.354150207505985, 'UR_lat': 61.33568305549932, 'UR_lon': 29.760049907697866, 'projdef': b'+proj=merc +a=6371000 +lat_0=68 +lon_0=25', 'xscale': 359.0699999999791, 'xsize': 1500, 'yscale': 346.70327721950633, 'ysize': 1500}
Radari produktid on esitatud georefereeritud ühtlasele võrgule interpoleeritud kujul ehk Cartesiuse koordinadistiku abil.
print("Üldise what grupi parameetrid (atribuudid): ", "\n", f2['what'])
Üldise what grupi parameetrid (atribuudid): {'date': b'20230109', 'object': b'COMP', 'source': b'ORG:231', 'time': b'072503', 'version': b'H5rad 2.2'}
print("Üldise how grupi parameetrid (atribuudid): ", "\n", f2['how'])
Üldise how grupi parameetrid (atribuudid): {'endepochs': 1673249103, 'freeze': 0.0, 'nodes': b'eesyr,eehar', 'polarization': b'H+V', 'software': b'IRIS', 'startepochs': 1673249103, 'sw_version': b'8.13.7.8', 'task': b'CCOMPEST '}
print("Kohaliku what grupi parameetrid (atribuudid): ", "\n", f2['dataset1/what'])
Kohaliku what grupi parameetrid (atribuudid): {'enddate': b'20230109', 'endtime': b'072503', 'gain': 1.0, 'nodata': 65535.0, 'offset': 0.0, 'prodpar': 500.0, 'product': b'PCAPPI', 'quantity': b'RATE', 'startdate': b'20230109', 'starttime': b'072503', 'undetect': 0.0}
print("Maatriks radariandmetega: ", "\n", f2['dataset1/data1/data'])
Maatriks radariandmetega: [[65535. 65535. 65535. ... 65535. 65535. 65535.] [65535. 65535. 65535. ... 65535. 65535. 65535.] [65535. 65535. 65535. ... 65535. 65535. 65535.] ... [65535. 65535. 65535. ... 65535. 65535. 65535.] [65535. 65535. 65535. ... 65535. 65535. 65535.] [65535. 65535. 65535. ... 65535. 65535. 65535.]]
plt.figure(figsize=(12, 12))
plt.imshow(dbz2, vmin=0, vmax=dbz2.max(), cmap='Spectral_r')
<matplotlib.image.AxesImage at 0x1eb0e42e100>

dbz3 = f2['dataset1/data1/data']
dbz3[dbz3>30000] = np.nan
LL_lon = f2['where']['LL_lon'] #Alumise vasakpoolse nurga pikkuskraad
UR_lon = f2['where']['UR_lon'] #Ülemise parempoolse nurga pikkuskraad
LL_lat = f2['where']['LL_lat'] #Alumise vasakpoolse nurga laiuskraad
UR_lat = f2['where']['UR_lat'] #Ülemise parempoolse nurga laiuskraad
res = 300 # bin lahutusvõime meetrites
ranges = np.arange(0, dbz3.shape[1]*res, res)
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection=ccrs.PlateCarree())
img_extent = [LL_lon, UR_lon, LL_lat, UR_lat]
ax.set_extent(img_extent, crs=ccrs.PlateCarree())
ax.coastlines(resolution='10m')
ax.add_feature(cfeature.BORDERS)
ax.imshow(dbz3, cmap='Spectral_r', extent=img_extent, transform=ccrs.PlateCarree())
ax.set_aspect('auto')

4. Spikker andmete töötlemiseks
Radariandmete töötlemiseks saab kasutada ka mitut Pythoni teeki. Järgmine loetelu ei ole kõikehõlmav, kuid annab mõningase lähtepunkti:
Radariandmete visualiseerimise näide Cartopy, xarray teeki abil on esitatud ülespool. Veel üks näide, kuidas kasutada teeki loetelust, on tehtud Soome Meteoroloogia Instituudi poolt - Visualising HDF5-files.
Tuleb pöörata tähelepanu sellele, et OdimH5 formaat pidevalt arendatakse ning mõned parameetrid (abribuudid) lisatakse juurde, mõned kustutatakse maha.