QGIS MeshCore RF Viewshed Plugin
Overview
Having newly acquired an interest in LoRa (Long Range) mesh communications, a low-power radio protocol operating in the 915 MHz spectrum in North America that often runs on low cost IOT (Internet Of Things) hardware, I saw an opportunity to use my GIS skills to help me better understand the mesh network itself.
So I developed a custom self-contained QGIS plugin for terrain-aware coverage analysis of MeshCore repeater nodes for planning LoRa MeshCore mesh radio networks that pulls live node data from the public MeshCore map API, downloads a digital elevation model of your area of interest from OpenTopography, computes per-node viewsheds, produces coverage rasters and an enriched node dataset and, with a local Observer node running, generates an observed RF signal quality heatmap — all from a single dock panel inside QGIS.
I then designed a webmap of Portland, Oregon’s 387 MeshCore repeater (as of the time of processing) nodes as a worked regional example of the plugin’s analytical outputs, to be shared with the robust MeshCore community in the Pacific Northwest.
Problem
Planning a mesh radio network in complex terrain means evaluating dozens of potential node positions against terrain obstructions. Each candidate site needs a viewshed computed, the overlapping coverage areas assessed, and RF propagation characteristics estimated, work that is repetitive, time-consuming, and error-prone when done manually.
Solution
The plugin exposes a QGIS processing tool that accepts a set of candidate node locations and a digital elevation model, then:
- Computes viewsheds for each candidate location using QGIS’s native viewshed algorithm, parametrized for LoRa antenna heights and observation radii relevant to MeshCore deployments
- Models RF propagation by applying a simplified free-space path loss model adjusted for terrain obstruction, producing estimated signal strength rasters for each node
- Evaluates network coverage by combining individual viewshed and propagation rasters to identify coverage gaps and optimal node placement for maximum mesh connectivity
Technical Implementation
The plugin is implemented in Python using the PyQGIS API. It wraps QGIS’s existing qgis:viewshed processing algorithm with pre-configured parameters and chains the output into the RF propagation calculations.
GDAL is used for raster math operations — combining coverage rasters, computing overlap areas, and generating final composite outputs. The tool integrates with QGIS’s processing framework so it can be run in batch mode from the Processing Toolbox or scripted via the Python console.
Outputs
- Webmap of the Portland, Oregon worked example
- Viewshed rasters for each candidate node location
- RF propagation coverage rasters
- Combined network coverage assessment with coverage statistics
- Entered: Portland GIS in Action 2026 Map Gallery (Analysis category)