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 SQLbotã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 JOINpara 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 COALESCEpara converter NULLS(sem vizinhos) em um 0caso contrário eles simplesmente ficam NULL.
Então, apenas GROUP BY a1.idobtemos um único registro para cada polígono.