Конвертировать растр в сглаженные контурные полигоны в QGIS

14

У меня был ограниченный успех в создании гладких контурных полигонов из растровых слоев.

Я создал контурные линии и граничные полилинии, а затем использовал QGIS Union. Затем я использую QGIS Polygonize. Затем используйте зональную статистику для исходного растра, чтобы получить значение для полигонов.

Второй метод, который я попробовал, состоял в том, чтобы преобразовать растр в полигон. Затем создайте новый столбец атрибута, округленный до желаемого контура. Затем я растворяю линии между одинаковыми значениями. Тогда используйте v.generalize. Этот метод немного быстрее, но некоторые полигоны будут зазубренными / не сглаженными.

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

Есть ли более простой метод, который на самом деле работает все время. Похоже, должна быть простая команда, которая выполняет весь процесс.

Rx_
источник
2
Почему вы используете Polygonize? Ваш входной растр непрерывен (как DEM с плавающей запятой)? В QGIS есть инструмент для создания контуров, который является ярлыком для GDAL_Contour. Qgistutorials.com/en/docs/working_with_terrain.html Вы пытаетесь получить контуры или гипсометрические области?
Майкл Стимсон
Входной файл представляет собой tif, а требуемый выходной файл - это файл формы, содержащий только многоугольники с определенными приращениями. Я нашел множество инструментов для создания полилиний, но не полигонов.
Rx_
Справедливо, вы пытаетесь получить гипсометрические области. Я использую (в основном) Esri, у которого есть возможность упростить полигоны, созданные растром, до полигона, но здесь это не поможет. Как бы это выглядело, если бы вы создавали контуры из матрицы высот, добавляли ограничивающий прямоугольник и затем полигонизировали? Затем вы можете создавать точки меток, пересекать / отбирать значения и помечать полигоны атрибутами ... возможно, вы могли бы получить несколько полигонов с одинаковыми значениями, которые можно растворить, но большая проблема заключается в скачках более чем на интервал. У меня есть код для атрибута hypso из контуров, но он работает на покрытие ArcInfo
Майкл Стимсон
То, что вы описываете, это то, что я думаю, я делаю в своем первом методе. Это громоздко. Необходимо убедиться, что каждый файл имеет атрибут id, а затем удалить полигоны, которые не содержат области выше нуля, после полигонизации. Мне не удалось получить правильную правильную метку линии для перевода в полигон. Второй метод настолько близок к тому, что я хочу, но v.generalize, похоже, не работает 100% времени. Я бы хотел, чтобы ESRI упрощал полигоны, как вы указали, в QGIS.
Rx_

Ответы:

12

Я столкнулся с теми же проблемами, что и у вас во втором методе. Я экспортировал растр в вектор и попытался использовать v.generalise, и я получаю в основном гладкие многоугольники со случайной «ступенчатой» границей, которая, по-видимому, не была затронута алгоритмом.

Я нашел процесс, который сработал для моей задачи, но не уверен, что это лучший способ, но подумал, что поделюсь им, если он вам поможет.

Я начал с сетки ascii от BoM, которая выглядела так: введите описание изображения здесь

Что я хотел что-то похожее на то, что производит BoM, как это: введите описание изображения здесь

Я смог достичь результата (которым я был доволен), используя следующие шаги.

  • Загрузите сетку (в моем случае ASCII Grid от BoM) в QGIS.
  • Перекодировано в дискретные классы. (Панель инструментов обработки> Трава> Растр> r.recode)
  • Запустите мажоритарный фильтр для «очистки» (Панель инструментов обработки> SAGA> Растровый фильтр> Мажоритарный фильтр).
  • Создавал контуры из отфильтрованной сетки с интервалом 1 и сохранял их в атрибуте «класс» (потому что мои классы были 1,2,3,4 и т. Д.). (Растр 'Меню'> Извлечение> Контур)
  • Контуры вывода несколько обобщены, но я использовал v.generalised с алгоритмом «змей», чтобы сгладить их (Инструменты обработки> Трава> Вектор> v.generalize)
  • Затем я преобразовал линии в многоугольник. (Панель инструментов обработки> Геоалгоритмы QGIS> Инструменты векторной геометрии> Линии в многоугольники)
  • Наконец, мне пришлось преобразовать отдельные полигоны в несколько частей, чтобы все полигоны хорошо рисовали. (Панель инструментов обработки> Геоалгоритмы QGIS> Инструменты векторной геометрии> Отдельные части в многочастную).

После стилизации мой вывод ниже: введите описание изображения здесь

Мне также было бы интересно услышать, если кто-то знает более простой способ. Первоначально я думал, как @Rx_, что я мог бы просто преобразовать свой растр в вектор, а затем обобщить, и все будет готово. То, что я должен был сделать, было намного дольше.

Эндрю Джеффри
источник
3

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

Кажется, это такая основная задача, а также важно для получения экстентов. Если у кого-то есть обновленный или более быстрый способ сделать это, пожалуйста, поделитесь!

MapInfoNewbie
источник
1

Более прямой способ - использовать gdal_countourнапрямую (как программа командной строки) в «многоугольном режиме» (то есть с -pопцией).

Пример:

gdal_contour -p -amin min_val -amax max_val -i 1 input_raster.tif output_shape.shp

Документация: https://gdal.org/programs/gdal_contour.html

Эта опция доступна только в версии> = 2.4 (это можно проверить с помощью gdalinfo --version). Если вы используете Ubuntu 18.4, возможно, вам придется установить его из UbuntuGIS

Пауло Виейра
источник