Я пытаюсь создать в QGIS полигоны вороной, которые бы рассматривали «дыры» в общей области. Примером может быть:
На самом деле я создал Вороного на этом изображении, используя QGIS через команду GRASS, а затем с помощью инструмента «Разница» для создания отверстий. В качестве слоя «Разница» использовался отдельный шейп-файл многоугольника, который содержит размеры отверстий. Примером приложения будет создание полигонов вокруг точек отбора проб, которые были собраны между структурами, которые должны быть исключены из анализа.
Здесь возникают две проблемы:
Функция «разности» не работает должным образом на 100%, при этом некоторые границы многоугольника простираются в «дыры». Это можно исправить, найдя строку в таблице атрибутов, у которой нет номера ID полигона (или ID «0»).
Этот тип "пробивания отверстий" после факта может привести к прерывистым многоугольникам, как показано красной стрелкой на изображении.
У меня вопрос: есть ли инструмент или плагин Вороного, который может рассматривать наличие «дырок» в центре области как одношаговый процесс, а также устранять образование разрывных многоугольников? Я предполагаю, что такой инструмент будет расширять границу многоугольника до ближайшего пересечения с другой границей, если только эта другая граница не ударяет сначала о границу «дыры».
источник
Ответы:
Это может быть возможно с использованием растров. Сначала преобразуйте точки и полигоны в растр высокого разрешения. Установите маску для ваших границ, используя
r.mask
. Затем бегитеr.grow.distance
в GRASS и используйтеValue= output
. Это даст вам за каждый пиксель, который является ближайшей точкой. Преобразуйте это обратно в векторные многоугольники. Там могут быть дополнительные шаги, необходимые для избавления от осколков полигонов.источник
Это, конечно, возможно с растрами.
Надеемся, что этот скриншот показывает проблему более четко. Часть В вороноя «ближе к лету» ближе к первоначальному центру вороноя, но это не принимает во внимание тот факт, что для обхода здания потребуется больше времени. Мое понимание вопроса ОП заключается в том, что вороной должен учитывать это дополнительное расстояние, чтобы пройтись вокруг здания.
Мне нравится предложение от @Guillaume. Однако, когда я попробовал это, у меня были проблемы с получением
r.grow.distance
маски (см. Ниже. Рябь не должна проходить через здания).Мои знания о траве не так сильны, как могли бы, поэтому, возможно, я делаю что-то глупое. Определенно, сначала проверьте это предложение, так как оно будет намного меньше работы, чем мое ;-)
Шаг 1 - Создайте поверхность затрат
Первый шаг - создать поверхность затрат. Это нужно сделать только один раз.
используйте растровый калькулятор, чтобы превратить это в поверхность затрат. Я установлю «на улице» на 1 и «в помещении» на 9999. Это затруднит передвижение по зданиям.
(( "Маска @ 1" = 1) * 1) + (( "маска @ 1" = 0) * 9999)
Вы можете получить более «естественные» результаты, добавив немного шума на поверхность затрат (например, используйте случайное число от 1 до 3, а не просто 1 для наружных пикселей).
Шаг 2. Создайте растры совокупной стоимости для каждого вороного центра
Теперь мы можем запустить (для одной вороной ячейки за раз) алгоритм GRASS
r.cost.coordinates
против нашего поверхностного слоя затрат.Для начальной координаты используйте центр vornoi. В качестве конечной координаты выберите один из углов вашей области. Я предлагаю использовать «Knights Tour», поскольку это дает более плавные результаты.
Результат показывает линии равного времени прохождения от одного вороного центра. Обратите внимание, как полосы обвивают здания.
Не уверен, как лучше всего это автоматизировать. Может быть, обработка в пакетном режиме или в Pyqgis.
Шаг 3. Слить растры
Это, вероятно, потребуется код. Алгоритм будет
При таком подходе должен получаться растр, в котором каждая ячейка классифицируется по центру вороноя, к которому она ближе всего, с учетом препятствий.
Затем вы можете использовать растр-полигон. Затем вы можете использовать плагин Generalize для удаления артефактов эффекта «step» из растра.
Приносим извинения за неопределенность на шагах 2 и 3 ... Я надеюсь, что кто-то присоединится к более элегантному решению :)
источник
Примечание № 1 : Я не смог воспроизвести предложенную проблему, потому что инструмент Разница хорошо работал для меня в нескольких тестах, которые я выполнил (возможно, это было связано с простой геометрией проблемы или потому что инструмент был улучшен, так как вопрос был спросил 1 год назад).
Тем не менее, я предлагаю обходной путь в PyQGIS, чтобы избежать использования инструмента Разница . Все основано на локальном пересечении двух входных слоев (см. Рисунок ниже):
Примечание № 2 : Поскольку я не хочу использовать инструмент « Разница» , я не могу избежать создания «осколков» (см. Затем), поэтому мне нужно было запустить
v.clean
инструмент для их устранения. Кроме того, как сказал @Chris W,После этих необходимых условий я выкладываю свой код:
что приводит к такому результату:
Просто для ясности, это будет результат без использования
v.clean
инструмента:Разница с результатом @LeaningCactus заключается в том, что к настоящему времени геометрии не нарушены и их можно «очистить» без ошибок .
источник