Facebook's Connectivity Lab and the Center for International Earth Science Information Network (CIESIN) have released map data which offers unprecedented resolution in terms of population mapping. By combining the data with mobile network coverage maps and using the Zonal Statistics function in QGIS, I have been able to calculate the unserved populations in target countries.

However, what I would like to do, is use the HRSL data to calculate the existence of communities above a threshold of population X within a given radius Y. This would allow governments and operators alike to identify viable communities that require access to communication. Does an algorithm like this exist? Can someone help point me in the right direction?

The ideal output would be a number of polygons each with a population associated with it. I would like to be able to experiment with different values for X and Y. Perhaps radius is the wrong variable, square kilometres would be another possibility.

An solution that is implementable with Open Source tools is a requirement.

  • I suspect that playing with GRASS GIS i.segment might be along the lines of what you want to do, available in QGIS processing toolbox. Reclassifying and polygonising might be useful. Feb 1, 2017 at 9:15
  • I have discovered that I can use GRASS r.neighbours to sum the surrounding population for each raster point on the map but I don't know how to then create a circle based on an arbitrary radius and population threshold. On the other hand, a colleague pointed out this post on Clustering to Reduce Spatial Data Set Size which would seem to be the right approach but for csv data. Still searching.
    – SteveSong
    Feb 6, 2017 at 13:24

2 Answers 2


You may be interested in unrasterize, an open-source Python library to convert raster data to GeoJSON and detect meaningful "hotspots" while dramatically reducing file size.

The intended use case is to transform population raster data into individual GeoJSON point objects that are representative of the population while reducing the overall number of points through downsampling. Afterwards, measuring distances between the population points and the provider points becomes computationally tractable.

The most relevant algorithm for this use case is the WindowedUnrasterizer, which takes two parameters: mask_width, a radius (in pixels) around each selected pixel to ignore in future selections, and threshold, the population per pixel number below which points are ignored. You can see this algorithm in action in this Jupyter notebook.

So far it has been applied to GHSL (based on the CIESIN GPWv4 dataset) and WorldPop data, so I imagine it could be made to work with HRSL as well.

Disclaimer: I help develop and maintain the unrasterize library.


The approach I have settled on so far goes like this:

  1. Use r.neighbours algorithm on population raster to discover population concentrations
  2. Create a threshold Raster Calculator to zero out low-population areas.
  3. Polygonize the resulting raster
  4. Calculate centroids of resulting polygons
  5. For the GSM coverage shapefile, calculate area not covered by using SAGA Symmetrical Difference function on the administrative country boundary and the GSM coverage map.
  6. Calculate polygon centroids falling into the non-coverage area by using Clip function on no-coverage shapefile and polygon centroids.
  7. Save resulting centroids to non-mercator projection
  8. Calculate a buffer around each centroid based on estimated tower coverage.
  9. Use Zonal Statistics to calculate the population under each resulting buffer
  10. Choose a graduated scale to display population levels under each buffer area.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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