Такого рода вещи лучше всего делать со 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
так, чтобы мы получили одну запись для каждого многоугольника.