QSO Map

The Map tab plots your logged contacts on an interactive Mapbox map, showing great-circle paths from your station to each contact.


Your Station Location

Your station is plotted using the best available location source:

Pin Color Source Accuracy
Purple Geocoded from your address (city, state, zip via Mapbox) High
Deep pink Calculated from your grid square center Medium

Click the station pin to see a popup showing which source is being used and your available location data.

If neither your address nor grid square is configured, an alert appears when you open the Map tab: "Your station address or grid square has not been set." Set these in Station Settings to enable operator plotting.

A Center on QTH button (top-right) flies the map back to your station location at zoom level 10.


Contact Plotting

Each logged contact appears as a marker with a great-circle path line back to your station:

Marker Color Source Meaning
Green Address-based (geocoded from QRZ data) High accuracy
Yellow Grid-based (center of Maidenhead square) Medium accuracy

Contacts without any location data are excluded from the map.

Great-Circle Lines

Path lines are colored by the primary band used in the contact. If no band is recorded, the line is gray. One line is drawn per contact (not per QSO), keeping the map clean even with large logs.


POTA Park Plotting

QSOs with POTA references are plotted at the park location instead of the operator's home address. These appear as green tree icons.

  • Aggregated labels show the park reference and total QSO count: US-3094 (4)
  • Hover shows a per-operator breakdown with mode details:
    (19) W1AW (19 CW)
    (2) K0ABC (2 SSB)
    
  • Park coordinates are fetched from /api/pota-locations, which checks Redis first and falls back to the POTA API for cache misses. Results are cached in your browser's sessionStorage for the duration of your session.

Home QSO Aggregation

Non-reference QSOs (contacts without a POTA park reference) are grouped by callsign. Instead of one marker per QSO, you see one marker per unique contact:

  • Count labels like W1AW (3) show how many QSOs you've had with that station
  • Hover popup shows: operator name (if available), city/grid, and mode breakdown (e.g., "19 CW, 2 SSB")

Band and Mode Legend

A legend overlay appears in the top-right corner showing all bands and modes present in your QSO data. Each band has a color-coded dot matching its line color on the map.

Band Colors

Band Color
160m Purple
80m Light blue
60m Dark purple
40m Rose
30m Deep blue
20m Teal
17m Violet
15m Cyan
12m Maroon
10m Sage green
6m Dark teal
2m Gold

Filtering

  • Click a legend item to toggle that band or mode on/off. Hidden items appear dimmed with strikethrough text.
  • Shift+click to solo a single item — all others are hidden. Shift+click the same item again to restore everything.

Toggling is instant — map layers update in real time via Mapbox filter expressions.


Click-to-Filter

Click any marker on the map to jump to the Logbook tab with the search pre-filtered:

  • Click a POTA park marker → filters logbook to that park reference (e.g., US-3094)
  • Click a contact marker → filters logbook to that callsign (e.g., W1AW)

This uses the same search engine as the Logbook & Search power bar.


Performance

The map is optimized for large logs:

  • Debounced refresh (300ms) — rapid successive changes (adding/editing QSOs) coalesce into a single map rebuild
  • Decoupled display actions — pagination, search, and filter changes in the logbook don't trigger map re-renders
  • GeoJSON feature caching — the map fingerprints your QSO data (count + latest timestamp). If the data hasn't changed (e.g., switching tabs or toggling theme), cached features are reused instead of reprocessing
  • Parallelized geocoding — contact addresses are geocoded in batches of 8 concurrently
  • Deduplicated lines — one line feature per contact, colored by primary band, rather than one per QSO

A loading spinner overlay appears while QSO data is being processed.


Map Initialization

The map initializes lazily — it doesn't load until you first click the Map tab. The Mapbox token is fetched from /api/mapbox-key (kept server-side, not embedded in your browser). When you switch away and back, map.resize() is called to handle any container size changes.

The map style automatically matches your theme (light or dark). Changing themes re-renders the map with the appropriate Mapbox style.


Related