Видалення невеликих пробілів (слайсів) між багатокутниками? [зачинено]


51

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

Як я можу змусити багатокутники разом, видаляючи пробіли?

QGIS віддав перевагу, але ArcGIS і загальне програмування також є варіантами.

Відповіді:


27

Використовуйте усунення (потрібна ліцензія ArcInfo)

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

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

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

Користувачі ArcGIS 10 Зауважте, що в параметрах цього інструменту є НОВА функція.

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


3
Це працює у справі зоопарку? Здається, в наборі даних немає жодного ковзання, лише прогалини між багатокутниками.
underdark

3
Я успішно використовував цей інструмент для усунення прогалин між багатокутниками. Однак існує проблема з використанням цього інструменту. Коли він розтріскує багатокутники під час геопроцедури, він над узагальнює новостворені багатокутники. Отже, криві будуть не такими гладкими, натомість матимуть гострі "нерівні" лінії. Ммм.
amasephy

3
@underdark Хороший момент. Однак завжди можна ввести слайвери через об'єднання даних з монолітним оточуючим багатокутником (наприклад, обмежувальним вікном набору даних). Цікавим питанням є те, як "Eliminate" обирає полігони, для яких слід об'єднати повзунки. Це може змістити результати (хоча, я сумніваюся, упередження було б важливим у більшості застосувань). У цій конкретній ситуації ідеальним рішенням було б поділити повзунки або вирівняти помилки.
качан

Один із варіантів інструменту - це злиття повзуна з сусіднім багатокутником або з найдовшою рамкою (опція за замовчуванням), або з найбільшою площею.
kenbuja

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.


Ви завжди можете використовувати панель інструментів обробки QGIS і застосувати v.clean.snap безпосередньо до свого формату файлів.
SAnderka

v.clean.snap недоступний. Я використав v.clean, а потім вибрав інструмент оснащення, і він дав порожній шар. Документація говорить, що оснащення - це з'єднання рядків у вершину. Я хочу приєднати вершину до іншої вершини в межах порогу.
neogeomat

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, і зберігати свій клас функцій у наборі даних про особливості в особистому або файловому базі даних.

Ви, швидше за все, захочете реалізувати правило " Не повинно мати прогалин ". Після того, як ви створили базу правил з усіма правилами, які вважаєте потрібними, ви хочете перевірити топологію, яка виявить усі помилки ваших даних.

Потім, використовуючи помилки інспектора і інструмент Fix топології Помилки , ви можете або по окремо , або насипний вибрати помилки , які ви хочете , щоб виправити і як ви хочете , щоб виправити їх (IE- створювати нові полігони для заповнення пустот або зливатися з більшими багатокутниками поблизу) .


7

У QGIS 2.12 (Lyon) Toolbox є функція "Усунути полігони". Я впевнений, що він є і в деякій попередній версії.


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;

1

Не ідеальне рішення, але одна з цих двох речей для мене працює в більшості випадків:

  1. У QGIS збережіть шар у форматі GEOJSON. Але перед збереженням у діалоговому вікні «Зберегти шар як» встановіть точність координат на 3 (15 - за замовчуванням). Це призведе до об'єднання вершин, які дуже близькі одне до іншого.

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


0

Я його не використовував, але ET Geowizards , який приносить багато інструментів для обробки ArcEditor та ArcInfo лише для ліцензійного рівня ArcView (він же стандарт ArcGIS), має майстра усунення, який "Усуває небажані багатокутники (слайвери) шляхом об'єднання їх у сусідні багатокутники або видалення їх " . Інструментарій майстра поверне вам $ 250 usd ( прайс-лист ).


0

Я зіткнувся з тією ж проблемою, що, вивчаючи інструменти, я вирішив досить легко, хоча я не знаю логіки. ! [У інструментах перейдіть до поля інструментів управління даними, перейдіть до класу функцій та запустіть скрипт інтеграції подвійним клацанням] [1]

у вікні Script виберіть клас функції, що має проблеми, а у XY допуску додайте вале, вимірюючи відстань за допомогою інструменту вимірювання в декількох точках, і отримайте середню долю, поставивши це значення в середовищі допуску, і застосуйте проблему, яку я вирішую не зараз як, але вирішено з приблизно 90% точністю. ! [введіть тут опис зображення] [2]

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


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