Страница 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
Александр Мурый
Поигрался с данными, вот результат в шейпе:
Вывод: с такими вот "зубчатыми" полигонами, полученными из растров, можно иногда бороться путём перегона их в полилинии, сглаживанием и затем конвертацией назад в полигоны.

- 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, добавить туда вышеизложенное.