Такого рода вещи лучше всего делать со 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
так, чтобы мы получили одну запись для каждого многоугольника.
Еще один способ сделать это в GRASS (используя панель инструментов GRASS или непосредственно в GRASS). В приведенном ниже примере советник уровня представляет собой векторный слой со странами, а в таблице атрибутов - столбец с населением по стране. Смотрите этот пост для более подробного объяснения.
Шаг 1) Создайте новый слой с таблицей атрибутов, связанной с границами, с двумя столбцами с идентификаторами полигонов, граничащих с линией границы слева и справа соответственно
Шаг 2) Запустите SQL, чтобы создать таблицу, которая связывает идентификаторы стран с суммой населения всех соседних стран:
Шаг 3) Соедините новую таблицу tmp с исходной таблицей атрибутов.
Таблица атрибутов вашего векторного слоя теперь должна иметь дополнительный столбец с суммарной совокупностью всех соседних стран.
источник
Отличный ответ @Nathan . Я попытался сделать это, используя pyqgis и shapely. Проверьте этот пост , чтобы загрузить scirpt и запустить его в QGIS. Преимущество этого метода заключается в том, что вы получаете результаты как часть таблицы атрибутов.
источник