Растворить полигоны в QGIS (GEOS) с допуском

11

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

Я хотел бы распустить полигоны там, где они соприкасаются. Если я использую инструмент геообработки растворения в fTools QGIS, который использует библиотеку GEOS, я получу некоторые неожиданные результаты (см. «Растворение в QTIS fTools»). Похоже, что GEOS не использует порог при определении касания полигонов, как упоминалось в следующих выпусках:

http://trac.osgeo.org/qgis/ticket/3126

http://trac.osgeo.org/qgis/ticket/3184

http://hub.qgis.org/issues/2806

Тот же подход в ArcGIS дает ожидаемый результат (см. «Слияние с ArcGIS 10.1»).

Видимо, это «особенность» GEOS, а не ошибка. Есть ли способ исправить данные, которые я должен дать ожидаемый результат? Небольшая потеря точности (несколько см?) Может быть приемлемой для меня. В идеале решением было бы то, что я мог бы написать в плагин QGIS, в качестве шага предварительной обработки.

Смежный вопрос (без ответов): Как установить значение допуска инструмента геообработки в QGIS?

Ссылка на образец данных в виде шейп-файла: https://www.dropbox.com/s/c8ns7wwfv289ad0/sample.zip

растворить полигоны v.dissolve

Snorfalorpagus
источник
Обходной путь должен был бы сначала вырастить и затем сжать fTools-растворенный многоугольник (путем буферизации сначала положительным, а затем отрицательным буфером).
Джейк
Я попробовал это, но у меня возникли другие проблемы (например, i.stack.imgur.com/LnFJy.png ). Здесь, синяя область создается, когда я буферизирую / растворяю / neg-buffer, где она не должна быть. Это не намного лучше, чем оригинальная проблема. Я не вижу, как мне восстановить первоначальный «острый» угол.
Снорфалорпаг

Ответы:

14

В этом случае, похоже, вам нужно помочь инструменту растворения, сначала исправив топологию. Вот как вы можете сделать это в GRASS.

Когда вы загружаете шейп-файл, GRASS видит его так:

Каждый крест отмечает область. Вы можете видеть, что на граничных линиях есть несколько крестиков: это скользящие многоугольники, вызванные небольшим смещением между граничными линиями.

  1. Удалите отрезанные многоугольники, образованные промежутками между настоящими многоугольниками:

    v.clean input=sample output=tempA --o tool=rmarea thresh=0.001
  2. Привязать граничные линии:

    v.clean input=tempA output=tempB --o tool=snap thresh=0.001
  3. Разорвите граничные линии на новых перекрестках:

    v.clean input=tempB output=tempA --o tool=break thresh=0.001
  4. Удалите дублирующие граничные линии:

    v.clean input=tempA output=tempB --o tool=rmdupl thresh=0.001
  5. Растворить полигоны

    v.dissolve input=tempB output=cleaned --o column=ID

И вуаля:

Джейк
источник
Спасибо @ Джейк. Это очень четкий ответ. К сожалению, когда я пытаюсь применить этот процесс ко всему набору данных (охватывающий 2500 км2), я получаю сообщение об ошибке из оснастки «ОШИБКА: G_realloc: невозможно выделить 144720024 байта памяти в snap.c: 186». Я думаю, мне придется разбить его на более мелкие куски. Это должно быть хорошо, так как я уже разбил его на квадраты 0,25 км2 для ускорения пересечений / пространственной индексации (это поле «ID» в данных примера).
Снорфалорпаг
7

Используйте команду GRASS GIS v.dissolve (в плагине Sextante -> Команды GRASS -> Вектор)

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

Результат с v.dissolve:

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

объяснение

Проблема проста для понимания. Шейп-файл не имеет топологии, если две области имеют общую границу, эта граница будет оцифрована два раза, а также сохранена в двух экземплярах.

Вы ясно видите это, когда пытаетесь редактировать шейп-файл:

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

GRASS GIS (как ArcGIS) является топологической ГИС. Когда вы импортируете шейп-файл в GRASS, полученный слой имеет топологию: общая граница между двумя областями существует один раз и является общей.

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

По этой причине, когда вы хотите слить шейп-файл (слить две границы ), вы можете столкнуться с проблемами (в QGIS, GvSIG, OpenJUMP или старом ArcView 3.x), см. ArcUserI: Общие сведения о топологии и шейп-файлах .

В GRASS v.dissolve предназначен для растворения общих границ между областями с одинаковым номером категории.

ген
источник
1
Я предполагаю, что это числовая проблема, и мне интересно, если бы ваша довольно хорошая копия геометрии ОП захватила бы те же числовые свойства?
Чау
@Chau: v.dissolveимеет параметр допуска, который решает проблему ОП.
Джейк
Эта деталь должна быть включена в ответ выше, спасибо за разъяснения :)
Чау
Я добавил ссылку на исходные данные в виде шейп-файла в вопросе. Когда я использую v.dissolveего, кажется, что он работает, за исключением того, что он «заполняет» маленький квадрат в середине функций. i.stack.imgur.com/AA59l.png
Snorfalorpagus
1
Я предлагаю объяснение
ген