Такі речі найкраще робити із 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 (id) та стовпчик геометрії (geomm), а потім просто натисніть кнопку load.
Ви повинні мати щось подібне, як тільки ви позначите це, звичайно
Розбивка запитів
Ми приєднуємо шар до себе за допомогою:
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
так, щоб отримати один запис на кожен багатокутник.