I work in the Mobile networks industry and i took up a task to create a plugin for QGIS using c++/python that does the following:

  • step 1: Create points corresponding to each mobile tower based on Lat/Long of each tower( this part i have accomplished )

  • step 2: Further: sectorise: each of these towers would have antennas oriented at different azimuths. so i need to create a symbol for each antenna direction (would in the end look like a flower petal in a flower or inward pointed triangles)

  • step 3: When i click on any sector, all nearby sectors facing the sector should be highlighted in some way( so i can find the neighbors)

What i have to start with is a big excel file containing the sector name , lattitude, longitude, antenna orientation , etc.

Does anyone have any opinion ?

enter image description here

2 Answers 2


Telecom cell site plan and optimization using QGIS

Create Points or Site Locations:

  1. Create database in CSV (make sure antenna sizes are sorted in descending order: highest first to lowest last, such that masking through overlay of cells could be avoided)

Telecom site database sample 2. Import to QGIS using "Add Delimited Text Layer" Telecom site database import to QGIS via Add Delimited Text Layer in CSV format

  1. Choose X and Y fields and pick Datum

Create Site Sectors: Please utilize the Plugin "Shape Tools" to create site Sectors QGIS plugin Shape Tools installation for Telecom site sector plan

Make Sector from "Azimuth": In this scenario it requires 2 additionally defined columns to form a sector, it could be derived from actual "Azimuth" of the sector.

Per se, an offset of -/+ 20 degrees to the actual orientation would make sector BW 40 degrees from node, or as maybe required based on user requirements.

  1. Starting angle field: 1st derived column with - 20 deg. angle: Pick corresponding column here

  2. Ending angle field: 2nd derived column with +20 deg. angle: Pick corresponding column here

  3. Radius field: Antenna size or Sector size should be derived in separate column as usual and input should be given to Radius under "Shape Tools" Sample point grid creation using mmQGIS plugin on QGIS Cell Site Sector creation on QGIS using Shape Tools Cell Site Sector render on QGIS

    1. Layer properties--> Style --> Control feature rendering order --> Expression --> Antenna size --> pick Descending under (Asc / Description) to have the sector overlay rendering order size large in bottom and size small on top for visibility onwards making map canvas in case CSV data or table data is not arranged earlier


Distance Matrix: Using this inbuilt algorithm distance between source site to its nearest neighbor could be identified to derive sector size of the site based on site density / frequency in an given geography, such that sector overlapping could be avoided while retaining appropriate visibility at all zoom levels (per se 1/3rd of distance calculated using the algorithm was used in below example. In case of multi technology / layer network, technology / layer wise magnitudes or sizes could be used to give visualization theme).

This process would facilitate better representation network with all proximities while working with KPIs or Neighbor analysis.

Distance matrix in QGIS

Note: Unique Site list are to be processed since tool would generate null distances if cells from same site are processed to extract distance to nearest neighbor.

For faster processing NNJoin plugin could be utilized as an substitute for the nearest neighbour (conversation of distance in map units (degrees) to meters or km (metric) could be needed).

Distance matrix to enhance wireless network visualization Distance matrix algorithm to enhance wireless network visualization

Create Neighbors:

Make WKT format comprising of Line start and end points of neighbor markup

Start point is Source Site's coordinated (Lat1 Long2) and end point is target site's coordinates (Lat2 Long2).

Make a new column with formation of LineString(Long1 Lat1,Long2 Lat2), or it could be later derived with the help of Field Calculator via Layer Properties.

QGIS database for LineString format for cell handover relations or neighbors Utilizing Sector centroids would be better for appropriate rendering and easy identification considering multi-techno sites.

Neighbor relations can be patched with network stats such as "Handover Count / Late HO / Early HO / HO Fail etc." to derive a thematic for line thickness or colour for easy identification. This excise could use "Graduated" under "Style" menu. Import LineSting WKT format to QGIS for Cell HO relations Graduation styling could be applied for applying line thickness to identify HO count rank Draw all Handover relation and categorize by sector for easy identification Apply rulebase This process of creating nbrs with HO stats is almost instantaneous for a size which was given a try with HO relations over 800,000 and cells count of ~40,000.

Neighbor Creation from Distance Matrix algorithm:

Neighbor derived through Distance Matrix algorithm and representation on map by source site, however this is representation of nearest neighbor assuming omini presence, which could be used in case of site level neighbor addition like LNADJW and LNADJG where SON would define the relations from this defined profile (neighbour from interesting point of two directional points are yet to be evaluated to suit wireless scenario): Nearest neighbour from distance matrix

Below formula could be used in Geometry generator to represent the relations on the fly (Layer Properties->Single symbol->Marker->Simple marker->Symbol layer type->Geometry generator->Geometry type->LineString/MultiLineString): make_line(centroid(geometry(get_feature('NetworkSiteDatabase','Site',"InputID"))),centroid(geometry(get_feature('NetworkSiteDatabase','Site',"InputID"))))

Making TAC, LAC boundaries are easy on QGIS (100,00 sites find this done with in 1 min): enter image description here 1. Make "Voronoi Polygons" from points

  1. Use "Dissolve Boundaries" algorithm under "Process Toolbox" Grass to merge individual cell boundaries to gross TAC, LAC, BSC or Cluster boundaries etc.

enter image description here

A sample work flow is shown below taking 10 km x 10 km grid distance to place cell sites for Indian geography, which is resulted in 36,032 sites with 108,096 cells. And each district is depicted unique TAC boundary for easy understanding and then the output is as follows:

This is a rough representation of planning and mostly suits day to day capacity and coverage expansions by network operators unless they have very stringent approach methods where constraints are followed for dimensioning viz. Radio propagation models, Terrain, Clutter, Capacity and Service promises (Cell edge throughput, Avg. throughput, Coverage and type of services etc.)

QGIS to develop cell site planning at scaled up level QGIS for representation of TAC boundaries

KPI interlacing onto Sectors: CSV or Excel could be used with additional Cell, Site, relation level KPIs.

or Use "Join Button" on "Layer Properties" popup window as VLOOKUP function to pullover data from regular KPI reports and represent on map as thematic using common field ex. Cell / Segment name in case of cell level KPI or relation when in case of Handover related etc.

QGIS join table option by common field

And arrange thematic accordingly: Use "Rulebased" with "Graduated" in case to generate with multiple conditions at one go.

Use "TimeManager" plugin to check KPI plots to identify its dynamics by plying hourly, daily time interval timelapse through selected canvas.

Useful plugins:


  1. Import direct Excel worksheet onto QGIS
  2. Classification of column data (Integer, Decimal, String, etc.)
  3. File data could be plotted at import with corresponding geo-data (Lat Long for points; WKT for HO Lines or Polygons, if any) on choosing datum
  4. KPI reports could be easily taken onto mapping through this process

Spreadsheet helps open Excel files with .xlsx directly and map over QGIS

"TableManager" For editing column headers on the go Table manager on QGIS used for editing column headers on the go for .shp .csv .xlsx extensions

"OpenLayer" and "QuickMapservices": For Map overlays ex. Google Map, Bing Map, OSM, Aster elevation data etc.

Timing Advance Plot: Use "Diagrams" option under "Layer Properties" popup and create "pie" chart or "bar" chart to visualize the site signal reachability by TA / PRACH samples.

TA or PRACH distribution simple mapping

Applying diagrammatic thematic for TA and representing all samples in learner method: TA or PRACH thematic

TA or PRACH thematic on applying variable magnitude or Scaled size method by aggregating overshooting TA samples>6.9 km: Timing Advance by bin scaled sizes

TA aggregation through field calculator (in this case data was multiplied by 1 to convert to integer and made summation): Timing Advance bin accumulation

Sample drive test plot is shown below: LTE Drive test map RSRP

QConsolidate: For sharing complete project files with team etc. while retaining all project's properties.

Other tips:

  1. Take HO relations from collocated site sector of 4G (since it is being SON) and replicate same set of collocated site Sectors (on 2G <-> 2G or 3G <-> 2G or or 3G<->2G or 23G -> 4G, this could be scaled up to OSS level on monthly or bi-monthly basis, and limited to top performing HO count and max allowed relations count.

  2. Similar to above could be utilized for neighbors of 3G<-3G> onto 3G<->2G, where site misses 4G proximity.

  3. Saving Layer style to Spatlite database: enter image description here

  4. Drive test plot thematic could be handled easily and process could be scaled up to typical cluster with file sizes over 200 MB or more. Pre to Post drive route matching could be done with much ease by buffering either of the plot to GPS error or bin distances (whichever is high per se ~20 m) such that Pre or Post plot could be clipped out and bin comparison could be done appropriately and hence benchmarking. QGIS has on-the-go layer styling while on processes (Copy/Past) of thematic properties which are saved in different active layer or saved on local m/c (user accessible and editable by Text editor like NotePad++, Submlime etc.), and thematics are also shareable between team etc.

Sample Drive Plot RSRP Indian railway corridor

Sample RSRP thro' simple Pathloss calculations on omini directional radiation pattern (Bin / Point map with 100 m interval has been created along Indian railways line vector), individual distance (multi-ring buffer) could be utilized to represent the coverage prediction plot (Constraints omitted: Antenna tilts, Elevations, Reflections, Absorption, and many others): Sample RSRP thro' simple Pathloss calculations

Representation of drive plot from regular coverage contours:

  1. Draw regular distance "multi-ring buffer" from chosen site location (lat long) to make variable distance rings around the given point, dissolving the distance buffers would facilitate representation better
  2. Generate points along line vectors
  3. Clip points vector over multi-distance ring buffer to pick corresponding distances to the site
  4. Use appropriate RF model formula to calculate free space pathloss and represent bin
  5. Use viewshed approach to involve Ground Elevation in prediction (*Currently under exploration)
  6. Use Antenna Tilts, Antenna pattern (*Currently under exploration)
  7. Use Clutter absorption model (*Currently under exploration)

Representation of drive plot with predicted coverage

Apply COST 231 (Urban RF propagation model) in association with distance calculated through MultiRingBuffer from site centroid. However this process could be further refined to plot directional antenna radiation pattern in association with interpolation of bins for desired pixelation. On applying COST 231 RF propagation model on random site plot

Field calculator could be utilized to check coverage thematic of route map (made points along line) to make iteration checks on different Frequencies and other constants. Expression with distance to Pathloss (COST 231) conversion

Cost 231 Urban RF model: Formula in field calculator: TX Power-(46.3+33.9*LOG10(Freq. Band in MHz)-13.82*LOG10(20)-(3.2*LOG10(11.75*1)^2-4.97)+(44.9-6.55*LOG10(BTS TX antenna Ht.))*LOG10("distance in km")+3) Cost 231 Urban RF model 1900 MHz

Hata Urban RF model: Formula used in field calculator TX Power -(69.55+26.16*log10(1900)-13.89*log10(BTS TX antenna Ht.)-(0.8+(1.1*log10(1900)-0.7)*1.5-1.56*log10(Freq. Band in MHz))+(44.9-6.55*log10(BTS TX antenna Ht.))*log10("distance in km")): Hata Urban RF model 1900 MHz

Hata Rural RF model: Formula used: TX Power-((69.55+26.16*log10(Freq. Band in MHz)-13.89*log10(BTS TX antenna Ht.)-(0.8+(1.1*log10(Freq. Band in MHz)-0.7)*1.5-1.56*log10(Freq. Band in MHz))+(44.9-6.55*log10(BTS TX antenna Ht.))log10("distance in km"))-4.78(log10(Freq. Band in MHz))^2+18.33*log10(Freq. Band in MHz)-40.94)

Hata Rural RF model 1900 MHz

Serving cell representation using hublines (only ideal condition FSL): enter image description here


  • 2
    Detailed answer well done, though cell coverage is dependent on other factors terrain, permits, accessibility and even outside temperatures etc.
    – Mapperz
    Apr 18, 2018 at 18:03
  • 5
    Wow, impressive, that is one of the most clearest and detailed answers I've seen. May 3, 2018 at 16:30

Step 2 Not familiar enough with QGIS, but what I have done with sectors in arcgis (for cell towers and tornado sirens) is created polygons to reflect their coverage. Decide the radius you want to reflect a specific power and an angle you want to represent the sweep. Draw a line from the center at angle azimuth - (sweep/2) for length = radius. Next, draw a tangent curve from that point with the sweep angle and azimuth you want, then return to your center point. And that gives you the polygon sector.

Step 3 A bit more complicated here. Assuming you have a radius to define "nearby", you buffer a selection around your tower point using that radius (if you want sectors that mutually face each other, instead of a buffer, use a sector polygon out to your selection radius constructed like in step 2). Iterate through the towers selected. For each tower, use arctangent to get the bearing to it. e.g.

bearing = arctan((y1-y0)/(x1-x0)

Where x0,y0 is the location of your original tower and x1,y1 is the location of a selected tower. Once you have the bearing, compare that to the azimuth of the sectors on the other tower. First, flip the bearing the opposite direction. e.g. if the angle is less than 180, add 180. If it is greater than 180, subtract 180. Then, if the flipped bearing lies between the sweep values for the sector on the selected tower, you have a match.

For example, if you bearing is 225 (due southwest), then the flipped bearing is 45 (due northwest). Assuming you have sectors facing 60, 180, and 300, with a sweep of 120 degrees. The first sector covers 0 to 120, the second covers 120 to 240, and the third covers 240 to 0. Only the first sector has the flipped bearing, 45, inside of it, so that is the sector that faces your sector.

  • Once you have completed step 2, would it not suffice in step 3 simply to (1) find all towers within the desired distance of a selected sector and (2) among those towers, retain those whose sector polygons intersect the selected sector polygon?
    – whuber
    May 16, 2012 at 21:38
  • He wanted the sectors -facing- the selected sector. And his definition for "nearby" might be greater than or less than the radius of the sector May 17, 2012 at 10:54
  • 1
    Allow me to clarify, then. When setting things up, create sector polygons extending out to the largest anticipated search radius. In step (1) you don't necessarily use the radius of the polygonal representations of the sectors: you use any desired query distance. In step (2), intersection of sectors guarantees that they are facing.
    – whuber
    May 17, 2012 at 14:02
  • @whuber: I will add a little clarity: I will attach a sample picture of what i need!(Posted above)The red lines are irrelevant to my present project though these will come in at a later stage. Take for example that single "flower" with all lines drawn towards it.The industry code word for each petal is sector.It represents a tower mounted with 3 antennas(sectors) at 0, 120, 260 degrees. My first hurdle is how i can draw these polygons of this shape from an excel/csv containing sector name, sector azimuth, sector latitude & sector longitude.
    – Bavin
    May 17, 2012 at 15:11
  • 1
    Also i would need to repeat the drawing process to roughly 20000 sectors per mobile services provider. i need to understand the PyQGIS way of drawing polygons and accessing the attributes table to understand the azimuth and orient the polygon according to what "blord-castillo" did in his arcGis program
    – Bavin
    May 17, 2012 at 15:15

Not the answer you're looking for? Browse other questions tagged or ask your own question.