Страница 1 из 1

QGIS + v.generalize, проблемы при сглаживании полигонов

Добавлено: 04 апр 2015, 16:45
JeSS
Здравствуйте, собственно, было необходимо сгладить полигоны, полученные ранее векторизацией растра. В итоге большинство полигонов сгладилось, однако некоторые так и остались угловатыми. Сглаживание выполнялось командой v.generalize, алгоритм: snakes method for line smoothing. Отсюда вопрос: как сгладить абсолютно все полигоны? и как сгладить кольца внутри полигонов?

Re: проблемы при сглаживании полигонов

Добавлено: 04 апр 2015, 20:41
Александр Мурый
Вообще, принято прямо указывать, в каком ПО вы работаете (причём с версией).

Модуль <v.generalize> был использован через QGIS или прямо в GRASS?
Какие значения параметров "alpha" и "beta" вы использовали для метода "snakes"?

Модуль делает проверку на нарушение топологии векторных объектов и, если есть риск таких нарушений, то в этом месте не сглаживается. Кстати, об этом должно было быть написано в "выхлопе" модуля.

Как вы видели, там есть несколько алгоритмов сглаживания кроме "snakes", причём для разных случаев и задач алгоритм подбирается часто чисто экспериментально. Важный параметр - порог (threshold), иногда для адекватного результата нужно упрощать и сглаживать последовательно несколько раз с увеличением порога.

P.S. Можете выложить кусок данных с вашей картинки в векторе?

Re: проблемы при сглаживании полигонов

Добавлено: 05 апр 2015, 19:36
JeSS
QGIS 2.6.1.

Модуль использовался через QGIS, значения "alpha" и "beta" не менял, соответственно 1 и 1.

прикрепил архив с шейп-файлом.

Re: QGIS + v.generalize, проблемы при сглаживании полигонов

Добавлено: 07 апр 2015, 21:41
Александр Мурый
Поигрался с данными, вот результат в шейпе:
hvoi_gener.zip
(103.79 КБ) 249 скачиваний
Вывод: с такими вот "зубчатыми" полигонами, полученными из растров, можно иногда бороться путём перегона их в полилинии, сглаживанием и затем конвертацией назад в полигоны.
gr.png
gr.png (58.76 КБ) 5912 просмотров
Использованные команды (при работе в "чистой" GRASS, не через QGIS):

Код: Выделить всё

v.type in=hvoi out=hvoi_lines type=boundary,line
v.category in=hvoi_lines out=hvoi_lines_cats
v.generalize -c in=hvoi_lines_cats out=hvoi_lines_cats_gener method=chaiken threshold=50
v.type in=hvoi_lines_cats_gener out=hvoi_lines_cats_gener_areas type=line,boundary
Параметры генерализации можно менять по вкусу, но для таких полигонов лучше использовать только следующие методы: chaiken (самый простой и быстрый), hermite (быстрый, но результат "на любителя") или snakes (самый тормозной из 3-х алгоритмов). Остальные алгоритмы сглаживания для данного случая не очень подходят.

Кстати, можно ещё сначала упростить геометрию (через <v.clean> с опцией "prune" или через <v.generalize>, "douglas").

P.S. Планирую дописать черновик по генерализации векторов в GRASS, добавить туда вышеизложенное.