Tego rodzaju czynności najlepiej wykonywać w Spatialite i SQL.
Najpierw musisz załadować swoje dane do bazy danych Spatialite, co może odbywać się za pomocą wtyczki DBManager dostarczanej z QGIS. Kliknij przycisk Importuj Layer/File button
.
Z danymi w bazie danych możesz następnie uruchomić następujące zapytanie za pomocą SQL
przycisku. Musisz tylko zmienić nazwy kolumn i tabel, aby pasowały do twoich danych.
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
Poinformuj narzędzie do wysyłania zapytań o swojej unikalnej kolumnie identyfikatora (id) i kolumnie geometrii (geomm), a następnie po prostu kliknij wczytaj.
Powinieneś mieć coś takiego, jak tylko to oznaczysz
Podział zapytania
Łączymy warstwę ze sobą za pomocą:
LEFT OUTER JOIN areas a2 ON NOT a1.id = a2.id
AND intersects(a2.geomm, a1.geomm)
ale tylko tam, gdzie przecinają się geometrie, a identyfikatory nie są takie same, w przeciwnym razie otrzymamy ten sam rekord dwa razy dla każdego wielokąta. Używamy również LEFT OUTER JOIN
tak, aby uwzględnić rekordy, które się nie dołączają, tj. Nie mają sąsiadów.
W wybranej części:
SELECT COALESCE(SUM(a2.pop),0) as pop_neighbours,
a1.pop,
a1.name,
a1.id,
a1.geomm
używamy COALESCE
, aby przekonwertować NULLS
(bez sąsiadów) na 0
inny, po prostu pozostaną NULL
.
Następnie robimy to tylko po GROUP BY a1.id
to, aby uzyskać pojedynczy rekord dla każdego wielokąta.