Убрать небольшие промежутки (осколки) между полигонами? [закрыто]

51

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

Как я могу соединить многоугольники, удалив пробелы?

QGIS предпочтительнее, но ArcGIS и общее программирование также являются опциями.

зоопарк
источник

Ответы:

27

Использовать устранение (требуется лицензия ArcInfo)

Устраняет полигоны, объединяя их с соседними полигонами, которые имеют самую большую площадь или самую длинную общую границу. Элиминирование часто используется для удаления небольших многоугольников, которые являются результатом операций наложения, таких как Пересечение или Объединение.

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000005p000000.htm

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

Пользователи ArcGIS 10 Обратите внимание, что в опциях этого инструмента есть НОВАЯ функция.

Теперь можно сохранить исходный POLYGON или POLYLINE с параметром> ex_features (необязательно). Входной полилиний или класс объектов полигонов или слой, который определяет границы полигонов или их части, которые не следует удалять.

Mapperz
источник
3
Это работает в случае зоопарка? Кажется, в наборе данных нет осколков, только промежутки между полигонами.
Подземье
3
Я успешно использовал этот инструмент для удаления пробелов между полигонами. Существует проблема с использованием этого инструмента, хотя. Когда во время геообработки он трескает полигоны, он обобщает вновь созданные полигоны. Таким образом, кривые не будут такими гладкими, вместо этого они будут иметь острые «неровные» линии. YMMV.
amasephy
3
@underdark Хорошая мысль. Тем не менее, можно всегда представить осколки через объединение данных с монолитным окружающим многоугольником (таким как ограничивающая рамка набора данных). Интересным вопросом является то, как «Eliminate» выбирает, в какие полигоны объединить осколки. Это может привести к смещению результатов (хотя я сомневаюсь, что смещение будет важным в большинстве приложений). В этой конкретной ситуации идеальное решение будет разбивать осколки или усреднять ошибки.
whuber
Один из вариантов инструмента - объединить ленту с соседним многоугольником с самой длинной границей (опция по умолчанию) или самой большой областью.
Кенбужа
4
Если у вас нет лицензии ArcInfo, на arcscripts.esri.com/details.asp?dbid=14672 есть скрипт, который автоматизирует это через Python. Я успешно использовал его несколько лет назад.
Стивен Лид
20

Чтобы сделать это вручную в QGIS, перейдите Settings|Project Properties...на Generalвкладку «Внизу», выберите « Snapping options...Проверить слой, который вы хотите привязать», установите режим to vertexи установите допуск на некоторое значение, меньшее кратчайшего расстояния между двумя имеющимися точками. Если вы не уверены, установите единицы измерения pixelsи допуск на что-то вроде 5, чтобы при наличии каких-то неудобных деталей вы могли увеличить масштаб и быть уверенным, что вы не привязались к неправильной вершине.

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

Делать это автоматически немного сложнее. AFAIK QGIS не имеет плагина для его автоматизации, и хотя PostGIS построен на GEOS с функциями привязки, он не доступен PostGIS. Возможно, можно написать запрос, чтобы проверить каждую точку многоугольника на наличие соседей в пределах расстояния привязки, но в настоящее время я не могу это расширить.

В GRASS есть v.clean.snap, к которому вы можете получить доступ через QGIS, но есть дополнительный шаг создания набора данных GRASS.

MerseyViking
источник
Вы всегда можете использовать набор инструментов обработки QGIS и применить v.clean.snap непосредственно к своему шейп-файлу.
Сэндерка,
v.clean.snap недоступен. я использовал v.clean, а затем выбрал инструмент привязки, и он дал пустой слой. Документация гласит, что оснастка состоит в соединении строк с вершиной. Я хочу соединить вершину с другой вершиной в пределах порога.
Неогеомат
17

Если вы знакомы с QGIS: в транке QGIS 1.9 (может быть установлен как qgis.dev через установщик OSGEO, см. Домашнюю страницу qgis) есть новая функция в векторном меню под названием «Устранить полигоны-осколки», которая точно делает то, что вы хотеть. Вы можете выбрать проблемные полигоны и объединить их с соседними полигонами, основываясь на общей границе или предложении области. Попробуйте!

кроншнеп
источник
3
Чтобы обновить этот ответ, в QGIS 2.18.1 «Устранить полигоны щепки» доступен в стабильном пакете и находится в разделе Вектор -> Инструменты геообработки.
Валери Андерсон
Это относится к существующим полигонам случайных полосок между основными, а не к пробелам между полигонами.
Страгу
15

Если вы являетесь пользователем QGIS, вы получаете всю мощь GRASS, поскольку это полностью топологическая ГИС. Внутри QGIS активируйте плагин GRASS, создайте местоположение / набор карт, куда нужно импортировать ваши данные.

Откройте набор карт и импортируйте грязный слой с помощью v.in.ogr: поиграйте с двумя дополнительными параметрами: «порог привязки для границ» и «минимальный размер импортируемой области».

Вы также можете использовать опции, которые предоставляет модуль v.clean.

Джованни Манги
источник
10

ArcGIS имеет правила топологии , которые помогут вам выявить и исправить пробелы в ваших данных, например, на то, на что вы ссылаетесь. Для создания правил топологии вам понадобится лицензия ArcEditor или ArcInfo, и вы сохраните свой класс пространственных объектов в наборе классов объектов в личной или файловой базе геоданных.

Скорее всего, вы захотите реализовать правило «не должно быть пробелов ». Как только вы создали базу правил со всеми необходимыми правилами, вы захотите проверить топологию, которая идентифицирует все ошибки в ваших данных.

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

RyanDalton
источник
7

В наборе инструментов QGIS 2.12 (Лион) есть функция «Устранить полигоны». Я уверен, что это также в какой-то более ранней версии.

dnltsk
источник
2

Ну, я использую функцию PostGIS (я использую ее непосредственно в QGIS), которая выполняет рекурсивную привязку для решения этой проблемы. Результаты довольно хорошие, для получения наилучших результатов требуется просто хорошее сочетание значений допусков. Если вы хотите попробовать, проверьте это (в моем случае все геометрии являются множественными, следовательно, st_multi в моем исполнении):

CREATE OR REPLACE FUNCTION dsgsnap(tabela text, snap float) RETURNS void AS 
        $BODY$
            DECLARE
            id int;
            BEGIN
                FOR id in execute('select id from '||tabela)
                LOOP
                    EXECUTE     
                'update '||tabela||' as classe set geom = st_multi(res.geom) 
                from 
                    (
                        select st_snap(a.geom, st_collect(b.geom), '||snap||') as geom, a.id as id 
                        from '||tabela||' a, '||tabela||' b 
                        where a.id != b.id and a.id = '||id||' 
                        group by a.id, a.geom
                    ) as res 
                where res.id = classe.id';
                END LOOP;
                RETURN;                        
            END
        $BODY$
        LANGUAGE plpgsql;
lcoandrade
источник
1

Не идеальное решение, но одна из этих двух вещей работает для меня в большинстве случаев:

  1. В QGIS сохраните слой в формате GEOJSON. Но перед сохранением в диалоговом окне «Сохранить слой как» установите точность координат 3 (по умолчанию 15). Это будет иметь эффект объединения вершин, которые очень близки друг к другу.

  2. Перейдите в Mapshaper , загрузите файл и нажмите «Упростить». В верхнем левом углу он сообщит вам, сколько пересечений линий он найдет, и даст вам возможность исправить их. Я считаю, что это исправление работает примерно в половине случаев.

mgalka
источник
0

Я не использовал его, но у ET Geowizards , который предоставляет многие инструменты обработки только ArcEditor и ArcInfo к лицензии уровня ArcView (также известный как ArcGIS Standard), есть мастер устранения, который «удаляет нежелательные полигоны (осколки) путем их слияния с соседними полигонами или удаляя их " . Набор инструментов мастера обойдется вам в 250 долларов США ( прайс-лист ).

Мэтт Уилки
источник
0

Я столкнулся с той же проблемой, с которой, изучая инструменты, я справился довольно легко, хотя я не знаю логики. ! [В инструментах перейдите в набор инструментов «Управление данными», перейдите в «Класс объектов» и запустите скрипт Integrate двойным щелчком мыши] [1]

в окне «Сценарий» выберите класс объектов, имеющий проблему, и в допуск XY добавьте значение, измеряя расстояние с помощью инструмента измерения в нескольких точках, и получите среднее значение, поместите это значение в среду допуска и примените решенную проблему. не сейчас, как, но решено с точностью около 90%. ! [введите описание изображения здесь] [2]

Я перепробовал все другие методы, описанные в ответах выше, но было сложно и громоздко получить автоматические поправки на разрывы между соседними полигонами.

С. М. Фаруки
источник
1
Если вы вставите ссылку на изображения, на которые вы ссылаетесь, я могу добавить их.
Djq