-
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月17日T23: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