Format#

RADOLAN was distributed in binary format for roughly 20 years now. In the last years, especially with the evolving POLARA framework HDF5 based products emerged.

In August 2025 The Deutscher Wetterdienst announced the sunsetting of several products in the legacy binary format to be exchanged with new ODIM_H5 based products after November 30, 2025.

In the following sections all formats are described in great detail.

import io
import tarfile
import warnings

warnings.filterwarnings("ignore")

import matplotlib.pyplot as plt
import numpy as np
import wradlib as wrl
import xarray as xr
Matplotlib is building the font cache; this may take a moment.

ODIM_H5 format#

ODIM_H5 was developed by the EUMETNET Operational Programme for the Exchange of Weather Radar Information (OPERA). The OPERA Data Information Model (ODIM) document can be accessed from their website.

To get an insight of the inner HDF5 layout, we just open the file with xarray.open_datatree() and visualize the structure. You can inspect the different groups, datasets and attributes.

# load radolan files
rw_filename = "../data/hdf5/raa01-rw_10000-latest-dwd---bin.hdf5"
ds = xr.open_datatree(rw_filename)
display(ds)
<xarray.DataTree>
Group: /
β”‚   Attributes:
β”‚       Conventions:  ODIM_H5/V2_3
β”œβ”€β”€ Group: /dataset1
β”‚   β”œβ”€β”€ Group: /dataset1/data1
β”‚   β”‚   β”‚   Dimensions:  (phony_dim_0: 1200, phony_dim_1: 1100)
β”‚   β”‚   β”‚   Dimensions without coordinates: phony_dim_0, phony_dim_1
β”‚   β”‚   β”‚   Data variables:
β”‚   β”‚   β”‚       data     (phony_dim_0, phony_dim_1) uint16 3MB ...
β”‚   β”‚   └── Group: /dataset1/data1/what
β”‚   β”‚           Attributes:
β”‚   β”‚               quantity:  ACRR
β”‚   β”‚               gain:      0.1
β”‚   β”‚               offset:    0.0
β”‚   β”‚               nodata:    65535.0
β”‚   β”‚               undetect:  0.0
β”‚   β”œβ”€β”€ Group: /dataset1/how
β”‚   β”‚       Attributes:
β”‚   β”‚           camethod:  RGA: STANDARD ADJUSTMENT WITH GAUGES
β”‚   └── Group: /dataset1/what
β”‚           Attributes:
β”‚               product:    COMP
β”‚               prodname:   RW
β”‚               startdate:  20250922
β”‚               starttime:  044000
β”‚               enddate:    20250922
β”‚               endtime:    054000
β”œβ”€β”€ Group: /how
β”‚       Attributes:
β”‚           nodes:       'deasb','deboo','deros','dehnr','deumd','depro','deess','def...
β”‚           software:    RADOLAN
β”‚           sw_version:  2.42.0
β”œβ”€β”€ Group: /what
β”‚       Attributes:
β”‚           date:     20250922
β”‚           time:     054000
β”‚           object:   COMP
β”‚           source:   ORG:78,CTY:616,CMT:Deutscher Wetterdienst radolan@dwd.de
β”‚           version:  H5rad 2.3
└── Group: /where
        Attributes: (12/13)
            LL_lat:   45.69642538
            LL_lon:   3.566994635
            LR_lat:   45.68460578
            LR_lon:   16.58086935
            UL_lat:   55.86208711
            UL_lon:   1.46330151
            ...       ...
            UR_lon:   18.73161645
            projdef:  +proj=stere +lat_0=90 +lat_ts=60 +lon_0=10 +a=6378137 +b=635675...
            xscale:   1000.0
            xsize:    1100
            yscale:   1000.0
            ysize:    1200

For this kind of RADOLAN data \(\omega radlib\) implemented a transformation layer to read the data with the same reader as the binary and ASCII format data and present it in the same consistent xarray.Dataset. This functionality is available starting with \(\omega radlib\) version 2.6.0.

ds = xr.open_dataset(rw_filename, engine="radolan")
display(ds)
ds.ACRR.plot()
<xarray.Dataset> Size: 11MB
Dimensions:  (y: 1200, x: 1100, time: 1)
Coordinates:
  * y        (y) float64 10kB -3.623e+06 -3.624e+06 ... -4.821e+06 -4.822e+06
  * x        (x) float64 9kB -5.432e+05 -5.422e+05 ... 5.548e+05 5.558e+05
  * time     (time) datetime64[ns] 8B 2025-09-22T05:40:00
    crs_wkt  int64 8B ...
Data variables:
    ACRR     (y, x) float64 11MB ...
Attributes:
    Conventions:     ODIM_H5/V2_3
    camethod:        RGA: STANDARD ADJUSTMENT WITH GAUGES
    radarlocations:  'deasb','deboo','deros','dehnr','deumd','depro','deess',...
    software:        RADOLAN
    sw_version:      2.42.0
    source:          ORG:78,CTY:616,CMT:Deutscher Wetterdienst radolan@dwd.de
    version:         H5rad 2.3
<matplotlib.collections.QuadMesh at 0x75dcfa01e900>
../_images/233d0a9c65fb428e2b7114b7e8c6b5e886fc2f9bc966523f592b6af1b732d367.png

Data: RADOLAN β€” Deutscher Wetterdienst (DWD). Licensed under CC BY 4.0.

Binary format#

The RADOLAN binary data file format is described in the RADOLAN/RADVOR-OP Kompositformat document. The radolan composite files consists of an ascii header containing all needed information to decode the following binary data block. \(\omega radlib\) provides wradlib.io.read_radolan_composite() to read the data.

The function wradlib.io.parse_dwd_composite_header() takes care of correctly decoding the ascii header. All available header information is transferred into the metadata dictionary.

# load radolan files
rw_filename = "../data/misc/raa01-rw_10000-1408102050-dwd---bin.gz"
import os
print(os.getcwd())
filehandle = wrl.io.get_radolan_filehandle(rw_filename)
header = wrl.io.read_radolan_header(filehandle)
print(header)
/home/docs/checkouts/readthedocs.org/user_builds/radolan-guide/checkouts/latest/notebooks
RW102050100000814BY1620134VS 3SW   2.13.1PR E-01INT  60GP 900x 900MS 62<boo,ros,emd,hnr,umd,pro,ess,asd,neu,nhb,oft,tur,isn,fbg,mem> 
attrs = wrl.io.parse_dwd_composite_header(header)
print(attrs)
{'producttype': 'RW', 'datetime': datetime.datetime(2014, 8, 10, 20, 50), 'radarid': '10000', 'nrow': 900, 'ncol': 900, 'datasize': 1620000, 'formatversion': 3, 'maxrange': '150 km', 'radolanversion': '2.13.1', 'precision': 0.1, 'intervalseconds': 3600, 'radarlocations': ['boo', 'ros', 'emd', 'hnr', 'umd', 'pro', 'ess', 'asd', 'neu', 'nhb', 'oft', 'tur', 'isn', 'fbg', 'mem']}

In the following example, the header information of four different composites is extracted.

# load radolan file
rx_filename = "../data/showcase/legacy/raa01-rx_10000-1408102050-dwd---bin.gz"
ex_filename = "../data/showcase/legacy/raa01-ex_10000-1408102050-dwd---bin.gz"
rw_filename = "../data/showcase/legacy/raa01-rw_10000-1408102050-dwd---bin.gz"
sf_filename = "../data/showcase/legacy/raa01-sf_10000-1408102050-dwd---bin.gz"

rxdata, rxattrs = wrl.io.read_radolan_composite(rx_filename)
exdata, exattrs = wrl.io.read_radolan_composite(ex_filename)
rwdata, rwattrs = wrl.io.read_radolan_composite(rw_filename)
sfdata, sfattrs = wrl.io.read_radolan_composite(sf_filename)

# print the available attributes
print("RX Attributes:")
for key, value in rxattrs.items():
    print(key + ":", value)
print("----------------------------------------------------------------")
# print the available attributes
print("EX Attributes:")
for key, value in exattrs.items():
    print(key + ":", value)
print("----------------------------------------------------------------")

# print the available attributes
print("RW Attributes:")
for key, value in rwattrs.items():
    print(key + ":", value)
print("----------------------------------------------------------------")

# print the available attributes
print("SF Attributes:")
for key, value in sfattrs.items():
    print(key + ":", value)
print("----------------------------------------------------------------")
RX Attributes:
producttype: RX
datetime: 2014-08-10 20:50:00
radarid: 10000
nrow: 900
ncol: 900
datasize: 810000
formatversion: 3
maxrange: 150 km
radolanversion: 2.13.1
precision: 1.0
intervalseconds: 300
radarlocations: ['boo', 'ros', 'emd', 'hnr', 'umd', 'pro', 'ess', 'asd', 'neu', 'nhb', 'oft', 'tur', 'isn', 'fbg', 'mem', 'bdy']
nodataflag: -9999
nodatamask: [     0      1      2 ... 809997 809998 809999]
cluttermask: []
----------------------------------------------------------------
EX Attributes:
producttype: EX
datetime: 2014-08-10 20:50:00
radarid: 10000
nrow: 1500
ncol: 1400
datasize: 2100000
formatversion: 2
maxrange: 128 km
radolanversion: 2.13.1
precision: 1.0
intervalseconds: 300
radarlocations: ['sin', 'rom', 'vir', 'bor', 'nld', 'zav', 'wid', 'sui', 'abv', 'ave', 'tra', 'arc', 'ncy', 'bgs', 'bla', 'sly', 'sem', 'boo', 'ros', 'emd', 'hnr', 'umd', 'pro', 'ess', 'asd', 'neu', 'nhb', 'oft', 'tur', 'isn', 'fbg', 'mem', 'bdy', 'ska']
nodataflag: -9999
nodatamask: [    743     744     745 ... 2099997 2099998 2099999]
cluttermask: []
----------------------------------------------------------------
RW Attributes:
producttype: RW
datetime: 2014-08-10 20:50:00
radarid: 10000
nrow: 900
ncol: 900
datasize: 1620000
formatversion: 3
maxrange: 150 km
radolanversion: 2.13.1
precision: 0.1
intervalseconds: 3600
radarlocations: ['boo', 'ros', 'emd', 'hnr', 'umd', 'pro', 'ess', 'asd', 'neu', 'nhb', 'oft', 'tur', 'isn', 'fbg', 'mem']
nodataflag: -9999
secondary: [   799    800    801 ... 806263 806264 807163]
nodatamask: [     0      1      2 ... 809997 809998 809999]
cluttermask: []
----------------------------------------------------------------
SF Attributes:
producttype: SF
datetime: 2014-08-10 20:50:00
radarid: 10000
nrow: 900
ncol: 900
datasize: 1620000
formatversion: 3
maxrange: 150 km
radolanversion: 2.13.1
precision: 0.1
intervalseconds: 86400
radarlocations: ['boo', 'ros', 'emd', 'hnr', 'umd', 'pro', 'ess', 'asd', 'neu', 'nhb', 'oft', 'tur', 'isn', 'fbg', 'mem']
radardays: ['asd 24', 'boo 24', 'emd 24', 'ess 24', 'fbg 24', 'hnr 24', 'isn 24', 'mem 24', 'neu 24', 'nhb 24', 'oft 24', 'pro 24', 'ros 24', 'tur 24', 'umd 24']
nodataflag: -9999
secondary: [   188    189    190 ... 809566 809567 809568]
nodatamask: [     0      1      2 ... 809997 809998 809999]
cluttermask: []
----------------------------------------------------------------

ASCII format#

The ASCII GIS Format is prepended by a limited header and has two flavours as follows:

  • RADOLAN / reproc (RADARKLIMATOLOGIE) 2001 – 2019

    ncols 900
    nrows 1100
    xllcorner -443462
    yllcorner -4758645
    cellsize 1000
    nodata_value -9999.0
Units: 1.0 mm
  • RADOLAN / recent, 2020 – jetzt :

    ncols 900
    nrows 900
    xllcorner -523462y
    llcorner -4658645
    cellsize 1000
    NODATA_value -1
Units: 0.1 mm

Product and Datetime need to be extracted from the filename, so extra care has to be taken to not tamper with the filenames. Finally, we exploit wradlib.io.open_radolan_mfdataset() to load the data into a consistent xarray.Dataset.

fname = "../data/asc/RW-20221018.tar.gz"
fp = tarfile.open(fname)
names = fp.getnames()
buffer = [io.BytesIO(fp.extractfile(name).read()) for name in names]
for buf, name in zip(buffer, names):
    buf.name = name
ds = wrl.io.open_radolan_mfdataset(buffer)
display(ds)
<xarray.Dataset> Size: 156MB
Dimensions:  (time: 24, y: 900, x: 900)
Coordinates:
  * time     (time) datetime64[ns] 192B 2022-10-18T00:50:00 ... 2022-10-18T23...
  * y        (y) float64 7kB -4.658e+06 -4.657e+06 ... -3.76e+06 -3.759e+06
  * x        (x) float64 7kB -5.23e+05 -5.22e+05 -5.21e+05 ... 3.75e+05 3.76e+05
Data variables:
    RW       (time, y, x) float64 156MB dask.array<chunksize=(1, 900, 900), meta=np.ndarray>
    crs      (time) int64 192B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Attributes:
    radarid:  10000