Такого рода вещи лучше всего делать со Spatialite и SQL.
Сначала вам нужно загрузить ваши данные в базу данных Spatialite, что можно сделать с помощью плагина DBManager, который поставляется с QGIS. Нажмите Импорт Layer/File button.
С вашими данными в базу данных вы можете выполнить следующий запрос с помощью SQLкнопки. Вам просто нужно изменить имена столбцов и таблиц в соответствии с вашими данными.
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
Сообщите инструменту запросов свой уникальный столбец идентификатора (id) и столбец геометрии (geomm), затем просто нажмите «загрузить».
Вы должны иметь что-то вроде этого, как только вы маркируете это, конечно,
Распределение запросов
Мы присоединяем слой к себе, используя:
LEFT OUTER JOIN areas a2 ON NOT a1.id = a2.id
AND intersects(a2.geomm, a1.geomm)
но только там, где пересекаются геометрии и идентификаторы не совпадают, в противном случае мы получим одну и ту же запись дважды для каждого многоугольника. Мы также используем LEFT OUTER JOINтак, чтобы мы включали записи, которые не присоединяются, то есть не имеют соседей.
В выделенной части:
SELECT COALESCE(SUM(a2.pop),0) as pop_neighbours,
a1.pop,
a1.name,
a1.id,
a1.geomm
мы используем COALESCEдля того, чтобы преобразовать NULLS(без соседей) в 0противном случае они просто остаются NULL.
Тогда мы просто GROUP BY a1.idтак, чтобы мы получили одну запись для каждого многоугольника.