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.
Une autre façon de le faire est dans GRASS (en utilisant la boîte à outils GRASS ou directement dans GRASS). Dans l'exemple ci-dessous, la couche EA est une couche vectorielle avec des pays et dans le tableau des attributs une colonne avec la population par pays. Voir cet article pour une explication plus détaillée.
Étape 1) Créez une nouvelle couche avec une table d'attributs liée aux limites, avec deux colonnes avec des ID de polygones bordant respectivement la ligne de délimitation à gauche et à droite
Étape 2) Exécutez un SQL pour créer une table qui relie les ID de pays à la somme de la population de tous les pays voisins:
Étape 3) Joignez la nouvelle table tmp à la table d'attributs d'origine.
La table attributaire de votre couche vectorielle devrait maintenant avoir une colonne supplémentaire avec la population sommée de tous les pays voisins.
la source
Grande réponse de @Nathan . J'ai essayé de le faire en utilisant pyqgis et galbé. Consultez cet article pour télécharger le scirpt et l'exécuter dans QGIS. Un avantage de cette méthode est que vous obtenez les résultats dans le cadre de la table attributaire.
la source