ГІС-аналіз для пошуку дублікатів геометрії


9

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

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

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

Я хочу очистити ці дані, щоб у мене були тільки правильні будівлі / будинки в місті, тому моє запитання:

Чи є якийсь ГІС-аналіз або SQL-вираз, який я можу запустити, щоб знайти всі скопійовані функції (як точні, так і ті, які знаходяться всередині інших)? У мене є і ArcGIS, і QGIS, тому я відкритий для всіх ваших пропозицій.


Ви можете спробувати вивчити Видалити ідентичний інструмент . Однак він вимагає рівня ліцензії підприємства. Ви можете переглянути деякі інші параметри, доступні в Технічній статті 36031. Чи надає ArcGIS спосіб виявлення або видалення функцій з подвійною геометрією, найкраще - це розширення даних для перегляду даних . жоден із цих інструментів не
вирішить

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

Чи є дані в базі даних? Якого типу?
Рассел в ISC,

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

4
Використання терміна "дублікат" трохи вводить в оману в цьому питанні. Що стосується точних, однакових, складених копій, то так, вони є (або можуть бути - атрибути можуть відрізнятися) дублікатами, і, як інші запропонували, інструмент «Видалити або знайти ідентичний» може бути корисним, якщо у вас є рівень ліцензії. Але якщо вони взагалі зміщені або мають іншу форму, вони насправді не є дублікатами. Якщо у вас є розширена ліцензія, я перегляну топологію бази даних геоданих, запустивши прапорець "Не повинен перекриватись". Без Advanced, можливо, те саме можна зробити і з QGIS та плагіном, як підказує відповідь Луїджі.
Chris W

Відповіді:


4

у QGIS, плагін Topology Checker може вирішити вашу проблему


3
Я погоджуюся, що топологія - це, мабуть, найкраще єдине рішення проблеми очищення даних. Однак ви, можливо, захочете трохи розширити свою відповідь, надавши посилання на плагін і короткий опис того, що є або робить топологія та яку перевірку ви б виконували. Я побоююся, що ваша відповідь як набрана, ймовірно, буде позначена як низька якість.
Chris W

ОК: опис плагіна знаходиться тут: docs.qgis.org/2.2/en/docs/user_manual/plugins/… і "не повинно перетинатися" може підійти до проблеми. Відео-посібник плагіна тут: youtube.com/watch?v=huhkTZkoKC8 .
Луїджі Піреллі

6

Я б використав itertools Python та SearchCursor для дуже ефективного способу пошуку просторових відносин, за якими ви хочете. Ви можете включати методи геометрії overlaps , containsі equalотримати на властивості геометрії.

  1. Почніть із створення функції для кращого впорядкування робочого процесу та для повторюваності

    def findOverlaps(x):

  2. Відкрийте курсор пошуку, щоб перейти на геометрію окремих функцій

    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:

  3. використовувати itertools.combinations()для повернення послідовностей елементів із вхідного ітерабельногоcur

    for feature1,feature2 in itertools.combinations(cur, 2):

  4. Доступ до властивостей геометрії з наступними методами: equals(), overlaps()і contains(). Вони налаштовані в логічній послідовності - ви можете налаштувати це, щоб відповідати вашим конкретним цілям, якщо це необхідно.

        if feature1[1].equals(feature2[1]):
            print "{} equals {}".format(feature1[0],feature2[0])
        if feature1[1].overlaps(feature2[1]):
            print "{} overlaps {}".format(feature1[0],feature2[0])
        if feature1[1].contains(feature2[1]):
            print "{} contains {}".format(feature1[0],feature2[0])
  5. Запустити ...

enter code herefindOverlaps (fc)


import itertools, arcpy

fc = r'C:\path\to\your\fc'

def findOverlaps(x):
    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
        for feature1,feature2 in itertools.combinations(cur, 2):
            if feature1[1].equals(feature2[1]):
                print "{} equals {}".format(feature1[0],feature2[0])
            if feature1[1].overlaps(feature2[1]):
                print "{} overlaps {}".format(feature1[0],feature2[0])
            if feature1[1].contains(feature2[1]):
                print "{} contains {}".format(feature1[0],feature2[0])

findOverlaps(fc)

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

На скріншоті відображаються різноманітні функції, які перекриваються, перекриваються & однакові та унікальні.

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


2

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

Використання ArcMap

(1) Зробіть копію свого формату файлів на випадок, якщо все піде не так.

(2) Додайте стовпчик до свого формату файлів як подвійний.

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

(4) Запустити підсумок (підсумувати) у цьому стовпчику. Переконайтесь, що ви вибрали унікальний ідентифікатор у підсумку та позначте як перший, так і останній.

(5) У вихідній таблиці шукайте ті записи, де поле рахунку вище 1.

(6a) Перевірте функції вручну та повторіть процес, поки не буде більше дублікатів.

(6b) Ви можете просто створити список цих унікальних ідентифікаторів і видалити функції за допомогою arcpy, але ви маєте шанс, можливо, мати дві унікальні функції з тією ж областю.

Ще одна техніка використання ArcPy

Коли я будував вищезгадану відповідь, я думав про можливість того, що якимось чином кілька авторів цих даних фактично могли використовувати однакові унікальні ідентифікатори для дублюваних функцій. Якщо це так, можливо, вам вдасться знайти дублікати за допомогою циклу в arcpy.

Те, як я б подумав про те, щоб зробити це за допомогою ArcPy, міг би оподатковувати вашу систему і забирати трохи.

(1) Зробіть копію файлу форми (у випадку, якщо це знову)

(2) Додайте новий стовпчик для позначення дублікатів. Щось, що сприймає як 'у' або 'n', або 0 або 1, або що б не працювало.

(3) Створіть список у python для зберігання унікального ідентифікатора.

(4) Запустіть курсор оновлення ( arcpy.UpdateCursor('LAYERNAME')). Кожен запис перевірте ваш список, щоб побачити, чи він містить цей ідентифікатор, і позначте свій стовпець для дублікатів, якщо він є.

myList = []
rows = arcpy.UpdateCursor("layername")
for row in rows:
  if str(row.UniqueIdentifier) in myList:
    #value duplicated
    row.DuplicateColumnName = "y"
  else:
    #not there, add it
    myList.append(row.UniqueIdentifier)
  rows.updateRow(row)

(5) Потім ви можете порівнювати або робити все, що завгодно, із зазначеними стовпцями.

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

Редагувати

Виходячи з коментаря elrobis , ви можете використовувати мінімальний обмежуючий прямокутник, щоб ще більше зменшити ймовірність видалення неправильних функцій.

Використовуючи ArcMap, ви можете запустити інструмент " Мінімальна обмежуюча геометрія" в управлінні даними. Перевіривши параметри, я думаю, що найкраще використовувати варіант CONVEX_HULL .

Якщо ви порівнюєте поля MBG_APodX / Y1 , MBG_APod_X / Y2 разом з MBG_Orientation для дублікатів, ви повинні мати можливість добре уявити про дублювані функції. Я б запропонував для порівняння описаний вище метод Summarize . Виберіть одну з вершин (координат) з обмежувального прямокутника, щоб знайти дублікати. Ви можете отримати кілька випадкових "матчів", але як тільки ви додасте в інші вершини плюс орієнтацію, було б досить безпечно зробити ставку, що функції результатів є дублікатами.

Хоча я не використовував його і не зовсім впевнений у результатах цього інструменту, вам може бути легше вивчити отриманий файл файлів, якщо ви використали інструмент Зведена статистика в ArcMap. Схоже, ви можете узагальнити декілька стовпців таким чином, замість одного варіанту моєї колонки.

Я не думаю, що не було б абсолютно автоматизованого способу зробити це, не турбуючись про можливість видалення не дублюючої функції. Ці методи повинні допомогти обмежити кількість функцій, які вам потрібно буде переглянути вручну.


Я припускаю, що це були багатокутники. Якщо вони є лініями, ви можете використовувати довжину. Точки найпростіші з координатами X / Y.
Бранко

2
Я також думав про "функції рівних площ", але це вражає мене, як ймовірно, що на слідах Bldg може бути достатньо тих самих типів фігур, щоб створити ненавмисні збіги. Я думаю, що це покращить шанси на подальше уточнення речей без перетину функцій MBR. Тобто, якщо вони мають однакову область (і може бути однакова особливість) І їх MBR перетинаються, то, можливо, цілком ймовірно, що це два покоління однієї і тієї ж особливості. Чи має це сенс?
elrobis

2

Ви можете зробити це в SQL, використовуючи просторове самостійне з'єднання. Ви не вказуєте, який діалект SQL ви використовуєте, тому цей приклад використовує Postgres / Postgis, але його можна легко адаптувати до Oracle або SQL Server. Припускаючи таблицю, що називається будівлями, з геометрією, що зберігається у стовпчику під назвою geom:

SELECT a.id, b.id from buildings a, buildings b WHERE 
  ST_INTERSECTS(a.geom, b.geom) AND a.id < b.id;

Це знайде перехрестя. Якщо ви хочете загальної рівності, замініть ST_Intersects на ST_Equals. Або просто поєднайте два:

SELECT a.id, b.id from buildings a, buildings b WHERE 
   (ST_INTERSECTS(a.geom, b.geom) OR ST_EQUALS(a.geom, b.geom)) 
   AND a.id < b.id;

Зауважте, що a.id <b.id означає, що ви розглядаєте лише половину випадків при самостійному з'єднанні, що робить його a) швидше і b) дає вам список, який ви можете використовувати для видалення половини полігонів, що перекриваються, не видаляючи їх усіх . Зрозуміло, що це все-таки алгоритм O (n²), але на практиці це буде набагато швидше, якщо у вас є просторовий індекс - це справді загальна вимога для будь-якого нетривіального набору даних.

Можливо, вам доведеться трохи помасажувати це, щоб відповідати визначенню перекриття - ви не хочете видаляти сусідні будинки, які були погано обстежені.


Якщо вам не вистачає унікального атрибуту у файлі a.rowidформ , ви можете використовувати замість a.id. rowidце ключове слово в SQLite, яке дасть вам внутрішній ідентифікатор набору даних.
LuWi

1

Плагін Topology Checker - хороший інструмент при правильному використанні. Ви все ще повинні мати фундаментальне розуміння своїх даних І вам доведеться вносити "виправлення" вручну. Плагін підкреслить те, що, на його думку, є помилками. Потім ви вирішите вивчити кожен і прийняти відповідне рішення для вас та ваших даних. З 90 000 предметів у вашому шарі, ви можете бути додому до Різдва!

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