Ce genre de chose est mieux fait avec Spatialite et SQL.
Vous devez d'abord charger vos données dans une base de données Spatialite, ce qui peut être fait à l'aide du plug-in DBManager fourni avec QGIS. Cliquez sur Importer Layer/File button
.
Avec vos données dans une base de données, vous pouvez ensuite exécuter la requête suivante à l'aide du SQL
bouton. Il vous suffira de modifier les noms des colonnes et des tableaux en fonction de vos données.
SELECT COALESCE(SUM(a2.pop),0) as pop_neighbours,
a1.pop,
a1.name,
a1.id,
a1.geomm FROM areas a1
LEFT OUTER JOIN areas a2 ON NOT a1.id = a2.id
AND intersects(a2.geomm, a1.geomm)
GROUP BY a1.id
Indiquez à l'outil de requête votre colonne d'identifiant unique (id) et votre colonne de géométrie (geomm), puis cliquez simplement sur charger.
Vous devriez avoir quelque chose comme ça, une fois que vous l'avez étiqueté bien sûr
La répartition des requêtes
Nous joignons la couche sur elle-même en utilisant:
LEFT OUTER JOIN areas a2 ON NOT a1.id = a2.id
AND intersects(a2.geomm, a1.geomm)
mais seulement là où les géométries se croisent et les identifiants ne sont pas les mêmes, sinon on se retrouve avec le même enregistrement deux fois pour chaque polygone. Nous utilisons également un LEFT OUTER JOIN
afin d'inclure les enregistrements qui ne se joignent pas, c'est-à-dire qui n'ont pas de voisins.
Dans la partie sélectionnée:
SELECT COALESCE(SUM(a2.pop),0) as pop_neighbours,
a1.pop,
a1.name,
a1.id,
a1.geomm
nous utilisons COALESCE
pour convertir le NULLS
(pas de voisins) en 0
sinon ils restent juste NULL
.
Ensuite, nous avons juste GROUP BY a1.id
pour que nous obtenions un seul enregistrement pour chaque polygone.