Esse tipo de coisa é melhor feito com Spatialite e SQL.
Primeiro, você precisará carregar seus dados em um banco de dados Spatialite, o que pode ser feito usando o plug-in DBManager que acompanha o QGIS. Clique no botão Importar Layer/File button
.
Com seus dados em um banco de dados, você pode executar a seguinte consulta usando o SQL
botão Você apenas precisará alterar os nomes das colunas e tabelas para se adequar aos seus dados.
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
Informe a ferramenta de consulta sobre sua coluna de identificação exclusiva (id) e a coluna de geometria (geomm) e clique em carregar.
Você deveria ter algo assim, depois de rotular, é claro
A divisão da consulta
Estamos juntando a camada a ela mesma usando:
LEFT OUTER JOIN areas a2 ON NOT a1.id = a2.id
AND intersects(a2.geomm, a1.geomm)
mas apenas onde as geometrias se cruzam e os IDs não são os mesmos; caso contrário, terminamos com o mesmo registro duas vezes para cada polígono. Também estamos usando um LEFT OUTER JOIN
para incluir os registros que não se juntam, ou seja, não têm vizinhos.
Na parte selecionada:
SELECT COALESCE(SUM(a2.pop),0) as pop_neighbours,
a1.pop,
a1.name,
a1.id,
a1.geomm
estamos usando COALESCE
para converter NULLS
(sem vizinhos) em um 0
caso contrário eles simplesmente ficam NULL
.
Então, apenas GROUP BY a1.id
obtemos um único registro para cada polígono.