Radio Coverage + Congressional Districts: Use Cases¶
Updated: January 2026
Dataset Overview¶
| Metric | Count |
|---|---|
| Radio stations | 2,012 |
| Coverage contours | 15,979 |
| District coverage relationships | 38,431 |
| Districts with coverage | 441 (100%) |
By service type: - FM: 15,049 contours - AM: 930 contours
Use Case 1: Campaign Media Buying Intelligence¶
Question: Which radio stations reach the most swing district voters?
Approach:
- Query stations by district overlap percentage to find optimal ad buys
- Identify stations that span multiple competitive districts for cost efficiency
- Rank by district_pct (how much of the district is covered) vs contour_pct (how much of the station's reach is in that district)
Example Query:
-- Stations covering multiple competitive districts
SELECT
s.callsign,
s.frequency,
s.power_kw,
COUNT(DISTINCT c.geoid) as districts_reached,
AVG(c.district_pct) as avg_coverage
FROM radio_stations s
JOIN radio_district_coverage c ON s.facility_id = c.facility_id
WHERE c.district_pct > 10 -- Meaningful coverage
GROUP BY s.facility_id, s.callsign, s.frequency, s.power_kw
HAVING COUNT(DISTINCT c.geoid) >= 3
ORDER BY districts_reached DESC, avg_coverage DESC;
Use Case 2: Rural Coverage Analysis¶
Question: Which districts have limited radio coverage?
Approach: - Many rural districts have limited FM coverage but strong AM daytime signals - Map "radio deserts" vs districts with 50+ stations - Correlate with broadband access data for media strategy decisions
Example Query:
-- Districts by radio station count
SELECT
d.geoid,
d.namelsad,
COUNT(DISTINCT c.facility_id) as station_count,
COUNT(DISTINCT CASE WHEN s.service_type = 'fm' THEN c.facility_id END) as fm_count,
COUNT(DISTINCT CASE WHEN s.service_type = 'am' THEN c.facility_id END) as am_count
FROM districts d
LEFT JOIN radio_district_coverage c ON d.geoid = c.geoid
LEFT JOIN radio_stations s ON c.facility_id = s.facility_id
GROUP BY d.geoid, d.namelsad
ORDER BY station_count ASC;
Use Case 3: Cross-District Reach Mapping¶
Question: Which stations have the widest regional reach?
Approach: - High-power stations (50-100kW) can cover 10+ districts - Find stations that bridge urban/suburban/rural audiences - Useful for statewide campaigns or regional messaging
Example Query:
-- Stations with broadest district reach
SELECT
s.callsign,
s.service_type,
s.frequency,
s.power_kw,
s.state,
COUNT(DISTINCT c.geoid) as districts_covered,
SUM(c.overlap_sq_km) as total_coverage_sq_km
FROM radio_stations s
JOIN radio_district_coverage c ON s.facility_id = c.facility_id
GROUP BY s.facility_id, s.callsign, s.service_type, s.frequency, s.power_kw, s.state
ORDER BY districts_covered DESC
LIMIT 20;
Use Case 4: Format-Based Targeting¶
Question: How do station formats align with district demographics?
Approach: - Enrich with station format data (News/Talk, Country, Spanish, etc.) from cbradio - Match formats to district demographics from Census data - Example: Spanish-language stations overlaid with Hispanic population percentage
Data Enhancement Needed:
- Import format field from cbradio station metadata
- Join with ACS demographic variables (DP05 Hispanic origin data)
Potential Query:
-- Spanish-language station coverage vs Hispanic population
SELECT
d.geoid,
d.namelsad,
dem.dp05_0071pe as hispanic_pct, -- % Hispanic or Latino
COUNT(DISTINCT CASE WHEN s.format LIKE '%Spanish%' THEN s.facility_id END) as spanish_stations
FROM districts d
JOIN demographics dem ON d.geoid = dem.geoid
LEFT JOIN radio_district_coverage c ON d.geoid = c.geoid
LEFT JOIN radio_stations s ON c.facility_id = s.facility_id
GROUP BY d.geoid, d.namelsad, dem.dp05_0071pe
HAVING hispanic_pct > 20
ORDER BY hispanic_pct DESC;
Use Case 5: Competitive District Radio Landscape¶
Question: What's the radio landscape in swing districts?
Approach: - Overlay coverage with Cook PVI or election margins - Build a "persuadable reach" metric combining swing voters + signal strength - Identify underserved competitive districts
Data Enhancement Needed: - Import Cook PVI ratings or election results by district - Create composite scoring model
Metrics to Consider: - Station count per district - Total coverage area (sq km) - Average signal strength (proxy: power_kw weighted by coverage) - Format diversity index
Use Case 6: Emergency Communications Planning¶
Question: Are there coverage gaps for emergency alerts?
Approach: - Identify stations with EAS (Emergency Alert System) capability - Map coverage gaps for disaster preparedness planning - Correlate with population density for impact assessment
Data Enhancement Needed: - EAS participation data from FCC - Population-weighted coverage calculations
API Endpoints¶
The following endpoints support these use cases:
| Endpoint | Description |
|---|---|
GET /api/v1/radio/stats |
Aggregate statistics |
GET /api/v1/radio/stations |
List stations with filtering |
GET /api/v1/radio/stations/{id} |
Station details |
GET /api/v1/radio/stations/{id}/contour |
Coverage polygon GeoJSON |
GET /api/v1/radio/stations/{id}/districts |
Districts covered by station |
GET /api/v1/radio/districts/{geoid} |
Stations covering a district |
GET /api/v1/radio/districts/{geoid}/geojson |
Coverage contours as GeoJSON |
Future Enhancements¶
- Station format import - Pull format/genre data from cbradio
- Election data overlay - Add Cook PVI or historical results
- Population-weighted metrics - Coverage weighted by district population
- Time-based analysis - AM stations have different day/night patterns
- Owner/network analysis - Identify station group ownership for bulk buys
- Signal strength modeling - More sophisticated coverage probability maps