DOI: 10.5281/zenodo.18759623
title: HAXR
title: A multi-station X-band radar dataset recorded in a port environment

description: HAXR is a multi-station X-band radar dataset recorded in a port environment. It contains radar backscatter observations from 13 partially overlapping maritime radar stations, stored as hourly UTC chunks, together with anonymized AIS-derived vessel position reports aligned to the same chunking scheme. The dataset is accompanied by the haxr companion library, which provides a local-cache-based access layer and utilities for working with the files.

Radar measurements are stored in HDF5 files. Each file contains polar-coordinate radar cells defined by their corner coordinates and an associated amplitude value. Time is recorded as UTC time-of-day (TOD) timestamps, and rotation segmentation is provided via cycle groupings. AIS data is provided per station and per hour as anonymized vessel position reports in the same station-local polar coordinate convention. Station positions are provided as relative (x, y)-coordinates, rounded to 10m accuracy.

Content overview

This record contains:



Radar data (*.hdf5): hourly, per-station chunks of X-band radar measurements.

AIS-derived vessel reports (*.csv): hourly, per-station chunks of anonymized vessel positions extracted from AIS messages and expressed relative to the corresponding station.

Station locations (stations.csv): lists the stations' relative coordinates in a local planar (x, y) reference frame, obtained by projecting the original latitude/longitude positions.


Chunking and file naming

All time-varying data is stored in hourly UTC chunks. Each chunk exists per station:



Pattern: <station_name>_hh-UTC.hdf5 and <station_name>_hh-UTC.csv

Examples: altona_08-UTC.hdf5, hohe_schaar_09-UTC.csv


Radar files (*.hdf5)

The radar data are stored in the Hierarchical Data Format HDF5. The files contain a time-ordered stream of reflection measurements ("cells"), stored as arrays with per-cell geometry in polar coordinates:



r1, r2: inner/outer range bounds of a radar cell

az1, az2: azimuth bounds of a radar cell (clockwise, north-up)

tod: time-of-day for each measurement since 00:00 UTC

amp: amplitude value


r1, r2, az1, az2, and tod include units as HDF5 dataset attributes. Amplitude values are taken verbatim from the underlying ASTERIX CAT240 stream and are provided without calibration or conversion to a physical unit. The conversion into the HDF5 representation was performed using pycatzao.

Geometric interpretation: A radar cell corresponds to the polar quadrilateral (r1, az1) → (r2, az1) → (r2, az2) → (r1, az2) → (r1, az1) with associated amp and tod.

Cycle segmentation (cycle/): The cell stream is time-ordered and not inherently mark 360° rotation boundaries. To support rotation-based slicing, the (HDF5) group cycle/ stores two index arrays, cycle/first and cycle/last, whose entries define inclusive index ranges into the cell stream for one-full-rotation windows. Cycles are defined as a sliding window over azimuth steps, so adjacent cycles overlap strongly. (The haxr companion library offers convenience helpers for working with these cycles.)

AIS vessel report files (*.csv)

AIS vessel reports are provided as CSV files alongside the radar data. While the raw input was a single AIS stream, the dataset is organized into one AIS file per station-hour chunk: vessel positions are transformed into station-relative polar coordinates and filtered to vessels within the station's coverage, so the resulting reports are station-specific and align with the hourly chunking.

Each AIS CSV follows this schema:



tod: time-of-day in seconds since 00:00 UTC

uid: unique (pseudonymized) vessel identifier

range (meters): vessel range relative to the station

azimuth (degrees): vessel azimuth relative to the station (clockwise, north-up; same conventin as the radar data)


Anonymization: AIS position reports were extracted from messages of type 1, 2, 3, and 18. The original MMSI is not included; instead, each MMSI is mapped to a stable pseudonymous uid, so the same vessel can be tracked consistently within the dataset.

Station locations (stations.csv)

A single CSV file listing the positions of the 13 radar stations in the port. The station identifiers match the naming used in the hourly chunk filenames.

Locations are provided as relative planar coordinates (x, y) in meters in a local, flat reference frame, obtained by projecting the original latitude/longitude station positions into a station-independent local coordinate system. Coordinates are rounded to a 10m resolution.

Example

In the snippet below we use the haxr companion library to plot the 1000th cycle of amerikahoeft_08-UTC.hdf:

import haxrimport matplotlib.pyplot as plt

def plot_cycle(store, station, split_hour_utc, cycle, file_name="demo.png"):    chunk = store.get_chunk(station=station, split_hour_utc=split_hour_utc)    with store.open(chunk.radar_file) as f:        df = haxr.utilities.load_cycle(f, cycle)        h, az_edges, r_edges = haxr.utilities.fill_histogram(            az=df["az (degree)"], r=df["r (meter)"], weights=df["amp"]        )        x, y, v = haxr.utilities.histogram_to_cartesian_meshgrid(h, az_edges, r_edges)

    fig, ax = plt.subplots(figsize=(3, 3))    ax.pcolormesh(x, y, v, cmap="plasma")    ax.set_aspect("equal")    ax.set_axis_off()

    fig.savefig(file_name, dpi=300)

with haxr.Store(base_url=haxr.DOI.latest) as store:    plot_cycle(store, "amerikahoeft", split_hour_utc=8, cycle=1000)