Спрощення сусідніх многокутників за допомогою інструменту QGIS спрощення геометрії


10

У мене є великий Shapefile з 200 000 багатокутників, але файл занадто великий для програми, яка його використовуватиме. Я хотів би узагальнити ці багатокутники та створити значно менший файл.

Я намагався це зробити в QGIS, використовуючи інструмент "Спростити геометрію". Я спробував це на дуже невеликій частині мого Shapefile, і я задоволений результатами, але у мене є невелика проблема, яку я не знаю, як вирішити. Я додав зображення, щоб показати проблему.

БІЛІ межі - це межі до спрощення. ЧЕРВЕННІ межі після спрощення. Проблемні ділянки обведені помаранчевим кольором. Як бачимо, "спрощені межі" містять деякі області, які після спрощення не належать до жодного з попередніх багатокутників.

Як я спрощую цей Shapefile і зберігаю загальні межі між багатокутниками як єдину лінію та усуваю області, які були створені після спрощення?

Спрощені багатокутники в QGIS

ДОДАТКОВА ІНФОРМАЦІЯ:

Після дотримання запропонованих інструкцій

  1. Перетворіть багатокутники на лінії
  2. Спростіть лінії
  3. Перетворити лінії назад на багатокутники

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

@Andrew запропонував мені пов'язати кожен рядок із сусіднім багатокутником, але я не знаю, як це зробити в QGIS.

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

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

  1. По-перше, я перетворив багатокутники на лінії
  2. По-друге, я очистив лінії, використовуючи v.clean з варіантом break. Це призвело до очищеного шару вектору та шару помилок. У шарі помилок (зелені точки на наданому зображенні) є зелена крапка на кожному перетині ліній. Я не знаю що це означає.
  3. По-третє, я спростив рядки, використовуючи інструмент "ПРОСТА ГЕОМЕТРІЯ" (результат на червоних лініях на зображеннях). Порівнюючи спрощені червоні лінії та оригінальні помаранчеві лінії, я задоволений результатом.
  4. По-четверте, я хотів перетворити лінії назад на багатокутники, використовуючи інструмент "Полігонізація" в "ОБРОБКА", і отримав результати, яких я не очікував (друге зображення з затіненими багатокутниками темного оливкового кольору). Схоже, полігонізатор пов’язаний з перетинами шару помилок і створив зовсім інший набір полігонів, ігноруючи спрощені лінії.

Може хтось пояснить, що тут пішло не так?

Чому червоні спрощені лінії не були належним чином перетворені на спрощені багатокутники?

Як ви бачите, я не є експертом з ГІС, але мені це потрібно зробити самому. Я не знаю, чи я занадто далеко від рішення, але мені шкода, що я бачу спрощені лінії, які я вважаю прийнятними для того, що я хотів би зробити, але не можу перетворити їх на багатокутники.

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

Спрощені лінії та оригінальні лінії

Результати плігонізованих спрощених ліній


@nhopton На веб-сторінці Polygonizer plugins.qgis.org/plugins/Polygonizer йдеться про те, що він "Створює багатокутники з пересічних ліній". Це говорить про те, що багатокутники створюватимуться кожного разу, коли буде перетин лінії (але, можливо, моя інтерпретація неправильна). Що мені потрібно - це позбутися тих прогалин, які були створені при використанні інструменту "спростити геометрію", і якщо Polygonizer зможе це зробити, я був би дуже невдоволений.
Девід

Думаючи про це, ваш оригінальний багатокутний шар повинен був спроститись без проблем. Якщо це не робиться, я думаю, це, ймовірно, означає, що у вас є погані багатокутники у вихідних даних. Багатокутники, які трохи перетинаються або мають між собою крихітні проміжки. Спробуйте збільшити масштаб проблемних областей, щоб побачити, чи можна знайти щось подібне. N.
nhopton

Хороший спосіб зберегти топологію полягає в робочому процесі, запропонованому @radouxju (за винятком центроїдного обчислення, який не є необхідним) і представленому в моїй системі обробки. Крім того, я думаю, що GRASS v.generalize- це ще один чудовий варіант. Сподіваюсь, це допомагає.
Антоніо Фальчіано

Питання, пов’язані з цим: gis.stackexchange.com/questions/20799/…
simon04

Відповіді:


7

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

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

Деякі лінії залишаються недоторканими.


Мав добрий успіх із цим методом після встановлення термінової толерантності v.in.ogr від -1 (без оснащення) до 0,00001 за пропозицією @Kantan
см1

4

Я потрапив у цю проблему з Qgis2.16, але не зміг отримати ГРАСС, щоб дати топологічно правильний результат, як @AndreJ.

Приємним вирішенням проблеми є зміна толерантності v.in.ogr на розширені параметри інструмента v.generalize.simplify . За замовчуванням - -1, що запобігає оснащенню GRASS.

Задавши сюди невелике значення (наприклад, 1e-05 m), увімкнено оснащення, і GRASS розпізнає спільні межі полігонів. Потім спрощення дає топологічно правильний шар, без дірок.

Примітка. Встановлюючи толерантність оснащення на більш високі значення, можна навіть змінити багатокутники, щоб дуже тонкі можна було видалити, якщо потрібно. Дотримуйтесь цієї операції з v.clean, використовуючи rmarea та поріг, достатньо великий, щоб видалити невеликі залишки, і там ви закінчили!


3

спочатку перетворіть свій багатокутник у лінії

використовуйте v.clean для очищення топології (з опцією "перерва")

то ви спростите свої лінії

Нарешті ви повертаєте свої лінії назад до багатокутників (використовуючи полігонізацію)

EDIT: Для отримання атрибутів ваших полігонів найкращим способом, якщо у вас немає багаточастинних багатокутників у початковому наборі даних , є отримання центроїдів старих та спрощених багатокутників та приєднання до них на основі найближчого місця (центроїди повинні не рухайтеся багато, якщо ви лише трохи змінили свої межі)


1
Мені це здається вашим пропуском декількох кроків, хоча робочий процес може працювати в підсумку. При перетворенні багатокутників у лінії вам може знадобитися асоціювати лінію з усіма суміжними багатокутниками. Потім після спрощення потрібно повернути лінії назад у багаточастинні багатокутники. Якщо оригінальні багатокутники опуклі, можливо, ви зможете зіставити оригінал із спрощеним за допомогою центроїда (наприклад, якщо центроїд оригіналу міститься у спрощеному полі - це збіг). Якщо вони не опуклі, хоча це буде набагато складніше.
Andy W

Привіт, я дотримувався процедури, запропонованої radouxju, але я все одно отримую частини оригінального багатокутника за межами його початкових меж. Як я пов’язую лінію з усіма сусідніми багатокутниками в QGIS? Я планую використовувати ці багатокутники у веб-додатках і потрібно скоротити кількість вузлів для швидшого завантаження. Що я отримую зараз - це добре зменшення, але я не можу позбутися цих невеликих областей, які є там після спрощення. Будь-які ідеї для вирішення цього питання будуть дуже вдячні.
Девід

@David. Я думаю, що ваша проблема може бути з кроком 3, рядками до багатокутників. У Наборі інструментів для обробки є інструмент під назвою "Полігонізувати", і я б спробував це. Я думаю, що для цього ще потрібно встановити пакети Shapely і Numpy. Це сказало, що я не можу змусити "Полігонізувати" працювати для мене в 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поле повинно бути доступним у вхідному шарі багатокутника.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.