Упрощение смежных полигонов с помощью инструмента QGIS Simplify Geometries

10

У меня большой Shapefile с 200 000 полигонов, но файл слишком велик для приложения, которое будет его использовать. Я хотел бы обобщить эти полигоны и создать гораздо меньший файл.

Я попытался сделать это в QGIS с помощью инструмента «Упростить геометрию». Я пробовал это на очень маленькой части моего Shapefile, и я доволен результатами, но у меня есть небольшая проблема, которую я не знаю, как решить. Я добавил изображение, чтобы показать проблему.

Белые границы - это границы до упрощения. Красные границы после упрощения. Проблемные зоны обведены оранжевым цветом. Как видите, «упрощенные границы» содержат некоторые области, которые после упрощения не принадлежат ни одному из предыдущих полигонов.

Как мне упростить этот шейп-файл и сохранить общие границы между полигонами как одну линию и устранить области, созданные после упрощения?

Упрощенные полигоны в QGIS

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

После следования предложенным инструкциям

  1. Конвертировать полигоны в линии
  2. Упростить линии
  3. Конвертировать линии обратно в полигоны

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

@ Андрей предложил мне связать каждую линию с соседним многоугольником, но я не знаю, как это сделать в QGIS.

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

Я все еще пытаюсь завершить процесс упрощения полигонов. Я следовал инструкциям, предложенным в этом посте, и когда я думал, что получил приемлемые результаты, появилась еще одна проблема. Ниже приводится краткое изложение того, что я сделал с изображениями результатов. Все шаги были выполнены с использованием панели инструментов ОБРАБОТКА В QGIS.

  1. Сначала я преобразовал полигоны в линии
  2. Во-вторых, я очистил строки, используя v.clean с параметром break. Это привело к чистому векторному слою и ошибочному слою. Слой ошибок (зеленые точки на предоставленном изображении) имеет зеленую точку на каждом пересечении линий. Я не знаю, что это значит.
  3. В-третьих, я упростил линии, используя инструмент «ПРОСТОТА ГЕОМЕТРИИ» (на изображениях появляются красные линии). Сравнивая упрощенные красные линии и оригинальные оранжевые линии, я доволен результатом.
  4. В-четвертых, я хотел преобразовать линии обратно в полигоны, используя инструмент «Полигонизация» в «Обработка», и получил результаты, которых я не ожидал (второе изображение с заштрихованными полигонами темно-оливкового цвета). Похоже, полигонайзер соединил пересечения слоев ошибок и создал совершенно другой набор полигонов, игнорируя упрощенные линии.

Может кто-нибудь объяснить, что здесь пошло не так?

Почему красные упрощенные линии не были правильно преобразованы в упрощенные многоугольники?

Как видите, я не эксперт по ГИС, но должен сделать это сам. Я не знаю, слишком ли я далек от решения, но расстраивает то, что я вижу упрощенные линии, которые я считаю приемлемыми для того, что я хотел бы сделать, но не могу преобразовать их в полигоны.

Вот два изображения с результатами двух последних шагов процесса:

Упрощенные Линии и Оригинальные Линии

Результаты Plygonized упрощенных линий

Дэвид
источник
@nhopton На веб-странице Polygonizer plugins.qgis.org/plugins/Polygonizer говорится, что он «создает многоугольники из пересекающихся линий». Это говорит о том, что полигоны будут создаваться всякий раз, когда есть пересечение линий (но, возможно, моя интерпретация неверна). Что мне нужно, так это избавиться от тех пробелов, которые были созданы при использовании инструмента «Упростить геометрию», и если Polygonizer может это сделать, я был бы очень счастлив.
Дэвид
Думая об этом, ваш оригинальный слой многоугольника должен упростить без проблем. Если он этого не делает, я думаю, это, вероятно, означает, что у вас есть плохие полигоны в исходных данных. Полигоны, которые слегка перекрывают друг друга или имеют крошечные промежутки между ними. Попробуйте увеличить проблемные области, чтобы узнать, сможете ли вы найти что-нибудь подобное. Н.
Ноптон
Хороший способ сохранить топологию состоит в рабочем процессе, предложенном @radouxju (кроме вычисления центроида, который не нужен) и представлен в модели обработки в моем ответе. В качестве альтернативы, я думаю, что GRASS v.generalize- еще один отличный вариант. Надеюсь это поможет.
Антонио Фальчано
Связанный вопрос: gis.stackexchange.com/questions/20799/…
simon04

Ответы:

7

Я получил довольно хороший результат, используя GRASS v.generalize из Processing Toolbox, используя значения по умолчанию:

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

Некоторые строки остаются нетронутыми.

Andrej
источник
У этого метода был хороший успех после установки допустимого значения привязки v.in.ogr от -1 (без привязки) до 0,00001, как это было предложено @Kantan.
см1
4

Я попал в эту проблему с Qgis2.16, но не смог заставить GRASS дать топологически правильный результат, такой как @AndreJ.

Хороший обходной путь - изменить допуск привязки v.in.ogr в дополнительных параметрах инструмента v.generalize.simplify . По умолчанию -1, что предотвращает привязку в GRASS.

Помещая здесь небольшое значение (например, 1e-05 м), включается привязка, и GRASS распознает общие границы полигонов. Упрощение дает топологически правильный слой без отверстий.

Примечание. Установив допуск привязки к более высоким значениям, можно даже изменить полигоны, чтобы при необходимости можно было удалить очень тонкие полигоны. Выполните эту операцию с v.clean, используя rmarea и достаточно большой порог, чтобы удалить небольшие остатки, и все готово!

Kantan
источник
3

сначала преобразуйте полигон в линии

используйте v.clean для очистки вашей топологии (с опцией "break")

тогда вы упростите свои линии

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

РЕДАКТИРОВАТЬ: Чтобы получить атрибуты ваших полигонов, лучший способ, если у вас нет многокомпонентных полигонов в исходном наборе данных , это получить центроиды старых и упрощенных полигонов и соединить их на основе ближайшего местоположения (центроиды должны не двигайтесь много, если вы лишь слегка измените свои границы)

radouxju
источник
1
Мне кажется, что вы пропустили несколько шагов, хотя рабочий процесс может сработать в конце. При преобразовании полигонов в линии вам может потребоваться связать линию со всеми соседними полигонами. Затем после упрощения вам нужно превратить линии обратно в многоугольники. Если исходные многоугольники являются выпуклыми, вы можете сопоставить оригинал с упрощенным с помощью центроида (например, если центроид оригинала содержится в упрощенном многоугольнике, это совпадение). Если они не выпуклые, это будет намного сложнее.
Энди В.
Привет, я следовал процедуре, предложенной Радою, но я все еще получаю части оригинального многоугольника за пределами его первоначальных границ. Как связать линию со всеми соседними полигонами в QGIS? Я планирую использовать эти полигоны в веб-приложениях, и мне нужно сократить количество узлов для более быстрой загрузки. Сейчас я получаю хорошее сокращение, но я не могу избавиться от этих небольших областей, которые есть после упрощения. Любые идеи для решения этой проблемы будут с благодарностью.
Дэвид
@David. Я думаю, что ваша проблема может быть с шагом 3, линии на полигоны. В Processing Toolkit есть инструмент под названием «Polygonize», и я бы попробовал это. Я думаю, что для этого все еще нужны пакеты Shapely и Numpy. Тем не менее, я не могу заставить "Polygonize" работать на меня в QGIS-Master в любую минуту. N.
nhopton
2

Вы можете решить проблему с помощью модели Processing (ex SEXTANTE) следующим образом:

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

Версия скрипта:

##Simplify polygons=name
##vectorlayer_input=vector
##number_tolerance=number 0.0
##output_layer_alg3=output vector
outputs_0=Processing.runalg("qgis:polygonstolines", vectorlayer_input, None)
outputs_1=Processing.runalg("qgis:simplifygeometries", outputs_0['OUTPUT'], number_tolerance, None)
outputs_2=Processing.runalg("qgis:linestopolygons", outputs_1['OUTPUT'], None)
outputs_3=Processing.runalg("qgis:joinattributestable", outputs_2['OUTPUT'], vectorlayer_input, ID, ID, output_layer_alg3)

Примечание: единственное ограничение заключается в том, что общее поле должно быть IDв Join attributes table, потому что это единственное поле вывода Lines to polygons. Вот почему общее поле не является переменным входом модели. Таким образом, IDполе должно быть доступно во входном многоугольном слое.

Антонио Фальчано
источник