-
Notifications
You must be signed in to change notification settings - Fork 3
Propagation Maps
VOACAP-Style Coverage Maps with Maidenhead Grid Overlay
The Propagation Maps feature provides VOACAP-compatible signal strength and reliability predictions visualized on an interactive map with Maidenhead grid square alignment.
What You Get:
- Reliability (REL) Maps - Circuit reliability percentage (0-100%)
- Signal Strength (SDBW) Maps - Signal-to-noise ratio in dB
- Maidenhead Grid Alignment - Perfect for amateur radio operators
- Interactive Display - Click grid squares for detailed predictions
- Mode-Specific Predictions - WSPR, FT8, CW, SSB presets
- Space-Efficient Design - Fullscreen map interface
1. Reliability (REL) Maps Shows circuit reliability percentage based on signal fading statistics and required SNR threshold.
Color Scale:
- 🔴 Red (90-100%): Excellent propagation
- 🟠 Orange (70-90%): Good propagation
- 🟡 Yellow (50-70%): Fair propagation
- 🟢 Green (30-50%): Marginal propagation
- 🔵 Blue (10-30%): Poor propagation
- ⚪ Gray (0-10%): Unlikely propagation
2. Signal Strength (SDBW) Maps Shows signal-to-noise ratio in decibels.
Color Scale:
- 🔴 Red (>40 dB): S9+ signals
- 🟠 Orange (30-40 dB): S9 signals
- 🟡 Yellow (20-30 dB): S7 signals
- 🟢 Green (10-20 dB): S5 signals
- 🔵 Blue (0-10 dB): S3 signals
- ⚪ Gray (<0 dB): Weak signals
Automatic configuration for common amateur radio modes:
| Mode | Bandwidth | Required SNR | VOACAP Match |
|---|---|---|---|
| WSPR | 6 Hz | -28 dB | 3 dB/Hz ✓ |
| FT8 | 50 Hz | -21 dB | 19 dB/Hz ✓ |
| CW | 500 Hz | +6 dB | 13 dB/Hz ✓ |
| SSB | 2700 Hz | +10 dB | 38 dB/Hz ✓ |
These match VOACAP's bandwidth specifications exactly for accurate predictions.
cd Dashboard
python generate_propagation_maps.pyThis creates map files in Dashboard/propagation_maps/:
map_20m_SSB_1800Z.json
map_20m_FT8_1800Z.json
map_40m_FT8_0000Z.json
map_15m_FT8_1800Z.json
First Generation Time: ~5-10 minutes per map (25,000+ grid points)
Option A: Via Dashboard Server
cd Dashboard
python server.pyThen open: http://localhost:8000/propagation_maps.html
Option B: Direct File Access
Open Dashboard/propagation_maps.html directly in your browser.
Controls:
- Band Selection: 40m, 20m, 17m, 15m, 10m
- Mode Selection: WSPR, FT8, CW, SSB
- Display Toggle: Reliability ↔ Signal Strength
- Time Selection: Hourly UTC (0-23)
- Refresh: Generate new predictions
Click any grid square for detailed popup:
Grid: FN74
Distance: 4,689 km
SNR: 26.2 dB
Reliability: 82.9%
Mode: 2F2 (2 hops)
from Dashboard.generate_propagation_maps import generate_propagation_map
# Your station
TX_LAT = 44.374
TX_LON = -64.300
# Generate map
map_data = generate_propagation_map(
tx_lat=TX_LAT,
tx_lon=TX_LON,
frequency=14.074, # 20m FT8
mode='FT8',
utc_hour=18,
month=11,
ssn=77,
tx_power=80.0,
map_range_deg=60.0, # ±60° coverage
resolution='medium' # 2° x 1° grid squares
)
# Access predictions
for pred in map_data['predictions']:
print(f"{pred['grid']}: SNR={pred['snr_db']:.1f} dB, "
f"REL={pred['reliability']:.1f}%")from src.dvoacap.prediction_engine import PredictionEngine
from Dashboard.mode_presets import apply_mode_preset
engine = PredictionEngine()
# Automatically configure for FT8
apply_mode_preset(engine, 'FT8')
# Now engine.params.bandwidth_hz = 50
# And engine.params.required_snr = -21
# Or manually set
engine.params.bandwidth_hz = 2700 # SSB
engine.params.required_snr = 10 # 10 dB SNR{
"metadata": {
"generated": "2025-11-17T23:30:00Z",
"tx_location": {"lat": 44.374, "lon": -64.300},
"frequency_mhz": 14.074,
"mode": "FT8",
"ssn": 77,
"bandwidth_hz": 50,
"required_snr": -21,
"grid_count": 25652,
"successful_predictions": 24891
},
"statistics": {
"snr": {
"min": -5.2,
"max": 45.3,
"mean": 28.7,
"median": 30.1
},
"reliability": {
"min": 12.3,
"max": 98.7,
"mean": 76.2,
"median": 81.5
}
},
"predictions": [
{
"grid": "FN74",
"lat": 44.5,
"lon": -64.0,
"distance_km": 45.2,
"snr_db": 42.1,
"reliability": 95.3,
"signal_dbw": -68.2,
"loss_db": 142.5,
"mode": "1F2",
"hops": 1
}
]
}| Resolution | Grid Points | Generation Time | File Size |
|---|---|---|---|
| Coarse (field) | ~1,000 | 1-2 min | 50-100 KB |
| Medium (square) | ~25,000 | 5-10 min | 200-500 KB |
| Fine (subsquare) | ~250,000 | 50-100 min | 2-5 MB |
Recommendation: Use medium resolution for most applications.
- Loading Time: <1 second
- Rendering: Instant with Leaflet
- Memory Usage: ~10 MB per map
- Browser Support: All modern browsers
# Coarse: 10° x 5° field-level squares
map_data = generate_propagation_map(..., resolution='coarse')
# Medium: 2° x 1° square-level (default)
map_data = generate_propagation_map(..., resolution='medium')
# Fine: 5' x 2.5' subsquare-level
map_data = generate_propagation_map(..., resolution='fine')# Local coverage (±30°)
map_data = generate_propagation_map(..., map_range_deg=30.0)
# Continental coverage (±60°)
map_data = generate_propagation_map(..., map_range_deg=60.0)
# Global coverage (±90°)
map_data = generate_propagation_map(..., map_range_deg=90.0)Generate maps for multiple scenarios:
bands = [(7.074, '40m'), (14.074, '20m'), (21.074, '15m')]
modes = ['WSPR', 'FT8', 'CW', 'SSB']
hours = [0, 6, 12, 18]
for (freq, band), mode, hour in itertools.product(bands, modes, hours):
map_data = generate_propagation_map(
tx_lat=TX_LAT, tx_lon=TX_LON,
frequency=freq, mode=mode, utc_hour=hour,
month=MONTH, ssn=SSN
)
# Save or process map_data| Feature | VOACAP | DVOACAP-Python | Status |
|---|---|---|---|
| REL Maps | ✅ Static PNG | ✅ Interactive | Enhanced |
| SDBW Maps | ✅ Static PNG | ✅ Interactive | Enhanced |
| Maidenhead Grid | ❌ Not aligned | ✅ Perfect alignment | New |
| Mode Presets | ❌ Manual entry | ✅ Auto-config | New |
| Bandwidth Parameter | ✅ Yes | ✅ Yes | Fixed |
| Click for Details | ❌ No | ✅ Yes | New |
| Export Format | PDF/PNG | JSON + HTML | Enhanced |
Option 1: Navigation Link
<a href="propagation_maps.html" class="nav-link">
📊 Propagation Maps
</a>Option 2: Embedded Tab
<div class="tab-content" id="maps-tab">
<iframe src="propagation_maps.html"
style="width:100%;height:100%;border:none;">
</iframe>
</div>Option 3: Flask Route
@app.route('/maps')
def maps_page():
return send_from_directory('Dashboard', 'propagation_maps.html')Error: Map data not found: map_20m_SSB_1800Z.json
Solution: Generate maps first:
cd Dashboard
python generate_propagation_maps.pyProblem: Takes >10 minutes to generate
Solutions:
- Use coarse resolution for wide areas
- Reduce map_range_deg (e.g., 30° instead of 60°)
- Run overnight for large batches
- Cache generated maps (reuse for same conditions)
Problem: Browser uses >500 MB RAM
Solutions:
- Close unused tabs
- Reduce map_range_deg
- Use coarse/medium resolution
- Restart browser periodically
Planned features:
- Real-time Generation - API endpoint for on-demand maps
- Animation - 24-hour time-lapse playback
- Path Overlay - Show specific DX paths on map
- Contour Lines - Add MUF/FOT/LUF contours
- 3D Visualization - Height-coded reliability surface
- Export - Save maps as PNG/PDF
- Compare Mode - Side-by-side WSPR vs SSB
- VOACAP Online: voacap.com
- Maidenhead System: Wikipedia
-
DVOACAP Validation: See
VOACAP_VALIDATION_FINDINGS.md -
Implementation Details: See
Dashboard/PROPAGATION_MAPS_README.md
- VOACAP: Original propagation model by NTIA/ITS
- DVOACAP: Pascal implementation by Alex Shovkoplyas (VE3NEA)
- DVOACAP-Python: Python port with map enhancements
- Leaflet: Interactive mapping library
Last Updated: 2025-11-18 Status: Production Ready Tested With: 20m/40m/15m on SSB/FT8/CW/WSPR modes