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.
Innym sposobem na to jest GRASS (za pomocą przybornika GRASS lub bezpośrednio w GRASS). W poniższym przykładzie warstwa EA jest warstwą wektorową z krajami, aw tabeli atrybutów kolumną z liczbą ludności według krajów. Zobacz ten post, aby uzyskać bardziej szczegółowe wyjaśnienie.
Krok 1) Utwórz nową warstwę z tabelą atrybutów połączoną z granicami, z dwiema kolumnami o identyfikatorach wielokątów graniczących odpowiednio z linią graniczną po lewej i prawej stronie
Krok 2) Uruchom instrukcję SQL, aby utworzyć tabelę, która łączy identyfikatory kraju z sumą populacji wszystkich sąsiednich krajów:
Krok 3) Dołącz do nowej tabeli tmp z oryginalną tabelą atrybutów.
Tabela atrybutów warstwy wektorowej powinna teraz zawierać dodatkową kolumnę ze zsumowaną populacją wszystkich sąsiednich krajów.
źródło
Świetna odpowiedź @Nathan . Próbowałem to zrobić przy użyciu pyqgis i kształtne. Sprawdź ten post, aby pobrać scirpt i uruchomić go w QGIS. Zaletą tej metody jest to, że otrzymujesz wyniki jako część tabeli atrybutów.
źródło