I hope that you can help me with the following problem: I have a vector (polygon) layer. I would like to add an attribute to the layer that – for every polygon – sums the values of a specific field of all its neighboring polygons.
To give a more concrete example: I have a polygon layer of districts containing information on population. Now, for every district I would like to know how many people live in all its neighboring districts.
As I have more than 300 districts I cannot do this by hand for each and every district.
Is there any way do this more efficiently in QGIS?
Best Answer
This kind of thing is best done with Spatialite and SQL.
First you will need to load you data into a Spatialite database which can be doing using the DBManager plugin that ships with QGIS. Click the Import
Layer/File button
.With your data into a database you can then run the following query using the
SQL
button. You will just have to change the names of the columns and tables to suit your data.Tell the query tool your unique id column (id) and geometry column (geomm), then just click load.
You should having something like this, once you label it of course
The Query Breakdown
We are joining the layer onto itself using:
but only where the geometries intersect and the ids are not the same, otherwise we end up with the same record twice for each polygon. We are also using a
LEFT OUTER JOIN
so that we include the records that don't join i.e have no neighbours.In the select part:
we are using
COALESCE
in order to convert theNULLS
(no neighbours) into a0
otherwise they just stayNULL
.Then we just
GROUP BY a1.id
so that we get a single record for each polygon.