Today I document how I generate my coverage maps, and I want to take my maps a step farther to calculate which amateurs fall in the coverage area. I’ll describe the complete process using a potential cell site “Crosstown”.

Model the coverage


For RF modelling, I use Radio Mobile. With measured performance data of the antennas and specified radio performance, I’m able to use accurate models values for our equipment. I use SRTM as the elevation data source.  I generate combined Cartesian radio coverage maps for all 3 sectors using these settings: radio-mobile-coverage-files.

Quick stats: Crosstown’s antenna height is 57.302 m AGL, mobile node is 10 m AGL; systems freq range is 5845 – 5925 MHz; default surface refractivity, ground conductivity, and relative ground permittivity; the systems tx power is 1.3 watts, receiver threshold is 70.7946 uV; client nodes antenna gain is 29 dBi; sector’s antenna gain is 14 dBi. 

Then I combined these images and converted them to grayscale to yield 1 raster for the site’s coverage area. The final output is pictured to the left.

Get the FCC ULS data

I’ve also exported the ULS database for active hams with mailing addresses in Arkansas, Mississippi, and Tennessee. Using Bing! and a short script that I wrote in Python, I geolocated all of the addresses for the records, yielding a massive csv file (actually it’s a TSV) with callsign, name, address, city, state, latitude, and longitude for every active licensed amateur operator in the tristate area.

Get Quantum GIS setup with data


I created a project with US county maps added for reference, and then using the “Add Delimited Text Layer” plugin I imported the CSV files made previously (here’s the results: tristate-amateurs-12feb-shapefile). After adding transparency (85%) to the point symbols, it turned into a sort of “heat map”, as pictured to the right:

Next is to import the coverage map from Radio Mobile. Sadly, the auto-generated files do not import properly into QGIS, so instead what I did was convert the PNG file into a georeferenced PNG using gdal_translate and the following command (your lat/long of ll and ur should vary!):

gdal_translate -of PNG -a_srs EPSG:4326 \<br /> -a_ullr -90.59023 35.58994 -89.48978 34.69006 \<br /> Crosstown.png Crosstown-geo.png

I imported the georeferenced PNG file into QGIS as a raster layer. In the Layer Properties I set render to “single band gray” with Gray band being “Band 2”, and I enabled “Invert color map”. I added the transparency pixels to make the white areas transparent. Finally, I added some global transparency to make it easier to see. With that, I got the output pictured to the right.

Analyze the raster, join the vectors

Now I used the “point sampling tool” plugin to find all of the amateurs that fell within the coverage area. This created a point vector layer (download here: crosstown-coverage-points-feb-12) that contained the existing points with a new value: the color that exists at that point. With this data, we get a count of the number of active amateurs who have mailing addresses as geolocated by Bing! that fall within our calculated coverage map. For bonus points, I’d like to find out who is in coverage and who is not (right now its just a list of points and coverage map color; that doesn’t give me opportunity for spot checking). Since the point sampling tool created a separate layer, we have to use the vector tool “Join attributes by location”.

Out comes data

With the result, we’re able to finally see all of the data together. In my case, since the coverage map’s color was inverted, a value of “255” meant that the point is in the coverage area. With that, we can conclude that 1,344 active licensed amateurs have their mailing addresses within the coverage area of our first potential site.

With this new data, we could potentially make a web interface for a user  to query a callsign and return what sites coverage areas they are in. There is more work to be done! I’ve attached all of the source files I could think of for this work. Be sure to let me know if I missed one or if you have a question about this by leaving a comment below!