Создание точек с регулярными интервалами внутри полигона на основе значения атрибута с использованием QGIS?

11

У меня есть слой многоугольника со значением атрибута, представляющим количество людей внутри многоугольника. Я использую QGIS 3.0.

Мне нужно визуализировать счет в виде сетки точек внутри многоугольника (то есть 1 точка = 100 лягушек, раскрашенных по видам). Точки не обязательно должны занимать весь многоугольник, и желательно, чтобы они были нарисованы вокруг центроида с заранее определенным интервалом (например, 300 м), чтобы они могли представлять аккуратную сетку с определенным разрешением.

Текущий обходной путь, который я нашел, состоит в том, чтобы использовать «Обычные точки» с параметром count для создания сеток внутри экстента, нарисованного на карте, а затем удалить дополнительные точки, созданные алгоритмом (алгоритм округляет до сетки, и вы можете получить 20 точек вместо 17 в вход). Это дает желаемый результат, но требует рисования экстента области для обычных точек для каждого многоугольника, а также ручного ввода атрибутов и очистки созданных точек. Кроме того, поскольку я запускаю «Обычные точки» с указанным количеством, вместо пробелов каждый полигон получает точки с разным интервалом.

В двух словах: Регулярные точки (определенное количество точек, нарисованный экстент) для каждого многоугольника (партии)> Удалить дополнительные точки> назначить значения атрибута # точкам

Альтернатива (избегает неравномерного расстояния, но требует еще больше манипуляций):

Обычные точки (с определенным интервалом, т. Е. 300 м) в экстенте всего слоя> Обрезать до экстента полигонов> Удалить дополнительные точки в каждом многоугольнике, пока вы не получите желаемое количество точек> назначить значения атрибутов для точек.

Основная проблема с моими обходными путями - обработка многоугольников, что затрудняет обновление данных и работу с большим количеством многоугольников.

Аналогичный вопрос был задан как Создание регулярно разнесенных, определенных # точек внутри многоугольника в QGIS , но специфика отличается.

Скриншот желаемого результата:

Таблица атрибутов L:

Руслан
источник
1
Изображение в вашем вопросе представляет то, что вы ожидаете в результате? Откуда берется количество цветных точек? Не могли бы вы добавить таблицу атрибутов слоя? Особенно атрибуты полигонов, которые включают Эдмонтон и Шервуд Парк, для лучшего понимания цветов и количества.
Кадир Шахбаз
1. Это просто замаскированные данные, которые не имеют ничего общего с реальными полигонами, но да, я ожидаю такого результата, но с точками вокруг центра многоугольника. 2. Подсчет поступает из столбцов таблицы атрибутов, поскольку существует три столбца / типа точек, которые я собирал в один столбец, чтобы сначала получить правильное количество точек на полигон, а затем назначить атрибут / цвета с помощью выражений. редактировать: добавил таблицу Excel в вопрос, не представляет значения, но представляет структуру моих данных.
Руслан

Ответы:

5

QGIS 3 поставляется с новым методом смещения в рендере кластера, который называется grid. Похоже, это в значительной степени то, что вам нужно. Просто создайте количество желаемых точек в центре вашего многоугольника.

введите описание изображения здесь

Я не знаю способа генерирования точек только с помощью графического инструмента, но относительно простой скрипт на Python должен это делать.

with edit(point_layer):
    for polygon_feature in polygon_layer.getFeatures():
        point_feature = QgsFeature(point_layer.fields())
        point_feature.setGeometry(polygon_feature.geometry().centroid())

        point_feature['type'] = 'Frog'
        for i in range(polygon_feature['Frogs']):
            point_layer.addFeature(point_feature)

        point_feature['type'] = 'Cat'
        for i in range(polygon_feature['Cats']):
            point_layer.addFeature(point_feature)

        point_feature['type'] = 'Diplodoc'
        for i in range(polygon_feature['Diplodocs']):
            point_layer.addFeature(point_feature)

Если вы хотите сойти с ума, оберните это в собственный алгоритм обработки.

Матиас Кун
источник
Спасибо Матиасу, это кажется даже лучше, чем другие решения. Можете ли вы предложить способ быстрого создания желаемого количества точек на основе таблицы атрибутов для достижения этой цели?
Руслан
Я не знаю простого метода, кроме написания небольшого скрипта на Python. Код полностью не проверен, поэтому могут быть некоторые опечатки;)
Матиас Кун
Еще раз спасибо. Скорее всего, мне придется сделать аналогичную визуализацию для многих слоев / экстентов и т. Д., Поэтому я постараюсь построить для этого хотя бы модель обработки.
Руслан
5

Может быть, другой путь, вдохновляющий ответ от Sarath SRK:

  1. Центроид многоугольников
  2. Буфер, использующий выражение с квадратом и адаптируемый к вашей шкале: т.е. (1000 * (sqrt ("Лягушки" + "Кошки" + "Diplodocs") / 2)) + 1 и Сегмент = 1, стиль заглушки = Квадрат
  3. Новая точка сетки с интервалом, согласованным со шкалой буфера.
  4. Удалить точку, которая не пересекается с буферным слоем (выбрать по местоположению)
  5. присоединить атрибут по местоположению (атрибут буфера или исходные полигоны)

Тем не менее, у вас будет что-то вроде этого введите описание изображения здесь

  1. Используйте графический редактор для создания нового поля с коммандой "@row_number" введите описание изображения здесь

  2. Выполнить модель с итерацией на уровне буфера введите описание изображения здесь

  3. Слить весь новый слой

  4. Удалите все точки с полем ID_pt больше, чем сумма вашего поля («Лягушки» + «Кошки» + «Диплодоки»)

  5. Категоризировать с правилами (т.е.
    • "ID_pt" <= "Лягушки"
    • "ID_pt"> "Лягушки" и "ID_pt" <= ("Кошки" + "Лягушки")
    • "ID_pt"> ("Кошки" + "Лягушки") и "ID_pt" <= ("Кошки" + "Лягушки" + "Diplodocs") введите описание изображения здесь
Christophe
источник
Спасибо за это! У меня не было бы времени попробовать это сегодня, но это кажется работоспособным решением, учитывая, что вы получили желаемый результат.
Руслан
1

Вы можете использовать генераторы геометрии для этого.

  1. Добавьте 3 подслоя в символе, один для каждого цвета / атрибута.
  2. Создайте выражение, которое генерирует мультиполигон для каждого подслоя.
  3. Теперь сложная часть, генерируйте квадратные части для мультиполигона на основе атрибута. Я предполагаю, что это потребует пользовательской функции выражения Python.
  4. Необязательно, используйте переменные рендеринга для масштаба карты, чтобы определить масштабирование полигонов и интервалов.
Матиас Кун
источник
Извините, я сейчас слишком занят для полного ответа, но попытаться приготовить что-нибудь из этого рецепта здесь будет очень интересно. Возможно, кто-то найдет подходящее решение, основанное на этом.
Матиас Кун
1

Одним из решений может быть создание точечного слоя с точками в центре тяжести каждого многоугольника. Так, например, вы получили в центре тяжести Эдмонтона 25 наложенных точек: 5 с атрибутом лягушки, 20 точек с кошкой и 0 с диплодоками.

Затем, используя средство рендеринга смещения точек с методом размещения, установленным как сетка, вы сможете получить эффект.

Сложность заключается в создании точечного слоя ....

JR
источник
0

Очень простой альтернативой может быть использование круговой диаграммы, доступной в свойствах слоя? Атрибуты и размеры могут быть продиктованы выражением.

введите описание изображения здесь

Christophe
источник
2
Ну, я знаю об альтернативных способах отображения данных. Суть вопроса заключается в том, чтобы сделать этот рабочий процесс визуализации возможным. Круговые диаграммы на самом деле не работают, потому что когда вы смотрите на сетку, вы получаете очень хорошее представление о количестве людей. Попытка оценить точные индивидуальные значения каждого полигона по круговым диаграммам практически невозможна.
Руслан
0

Вы можете генерировать точки по спиральной траектории, начиная с многоугольника центроида. В следующем сообщении о переполнении стека есть код Python для создания равноудаленных точек, но я не могу проверить его в данный момент, учитывая отсутствие свободного времени.

Techie_Gus
источник
Кажется, достаточно близко, но, как уже упоминалось в вопросе, я недостаточно опытен, чтобы кодировать это / изменять код, предложенный там.
Руслан
Надеюсь, кто-то с достаточным знанием и временем примет участие.
Techie_Gus
0

В твоем случае,

  1. Создавайте регулярно расположенные точки, используя заданное расстояние для всего AOI
  2. Создание точек центроида для всех полигонов (вход).
  3. Создайте буфер для этих точек центроида, используя буфер фиксированного расстояния со значением сегментов '1'. Он создаст квадратный буфер вместо круга (используйте инструмент поворота в Qgis, если вы хотите вращать буферные полигоны).
  4. Создание выделения точек попадает в буферные полигоны с помощью вектора -> Инструменты исследования -> Выбор по местоположению (точки в пределах правила полигонов).
  5. Переключите выделение и удалите точки вне буферных полигонов. Итак, теперь вы получаете регулярно расположенные точки вокруг центроида многоугольников.
  6. Укажите атрибут большинства для целых баллов, а остальные баллы необходимо классифицировать вручную. Используйте инструмент QuickMultiAttributeEdit , чтобы легко обновлять атрибуты.
Сарат SRK
источник
Спасибо, похоже, это сокращает этапы обработки, но это не решает проблему с необходимостью выбора вручную (размер буферов внутри многоугольников будет одинаковым по размеру = одинаковое количество точек на многоугольник), удаление и присвоение атрибутов созданным точкам для каждого из полигоны, что является основной проблемой в этом и моем рабочем процессе.
Руслан