Analiza GIS w celu znalezienia zduplikowanych geometrii

9

Mam duży plik kształtu, który zawiera wszystkie budynki i domy miasta, w których pracuję (około 90 000 obiektów). Dane budynków / domów są zapisywane przez inżynierów geodezyjnych miasta, a ze względu na złą praktykę i dostęp różnych geodetów do tych danych wiele budynków / domów zostało zapisanych dwukrotnie i pokazanych na mapie jako duplikaty.

Niektóre z nich są dokładnie powielone (pojawiają się jeden nad drugim), podczas gdy inne są powielone ze spacją między dwoma obiektami (jak jeden obiekt znajduje się w drugim - patrz załączony zrzut ekranu).

wprowadź opis zdjęcia tutaj

Chcę wyczyścić te dane, aby mieć tylko właściwe budynki / domy w mieście, więc moje pytanie brzmi:

Czy istnieje analiza GIS lub wyrażenie SQL, które można uruchomić, aby znaleźć wszystkie zduplikowane funkcje (zarówno te dokładne, jak i te, które znajdują się w innych)? Mam zarówno ArcGIS, jak i QGIS, więc jestem otwarty na wszystkie twoje sugestie.

GIS_DBA
źródło
Możesz spróbować odkryć narzędzie Usuń identyczne narzędzie . Wymaga to jednak poziomu licencji przedsiębiorstwa. Możesz przejrzeć niektóre inne opcje dostępne w artykule technicznym 36031. Czy ArcGIS zapewnia sposób na identyfikację lub usunięcie obiektów o zduplikowanych geometriach, najlepszym rozwiązaniem jest Extenstion Data Review . żadne z tych narzędzi nie zajmie się twoimi podzielonymi geometriami
MDHald
należy również wziąć pod uwagę, że komponenty tabelaryczne nie będą porównywane w narzędziu do usuwania identycznych. Wiem, że to nie jest odpowiedź, ale mam nadzieję, że pomaga w rozwiązywaniu problemów.
MDHald
Czy dane są w bazie danych? Który typ?
Russell na ISC
Jedną z opcji może być użycie narzędzia Przecięcie (jak opisano w tej odpowiedzi ) w ArcMap, które wyświetliłoby dowolne miejsca nakładania się. Wymagałoby to ręcznego sprawdzenia i wyboru wielokąta, który należy usunąć, ale w przypadku niedokładnych duplikatów myślę, że i tak trzeba to zrobić.
Erica
4
Użycie terminu „duplikat” jest nieco mylące w tym pytaniu. W przypadku dokładnych, identycznych, ułożonych w stos kopii, to tak, są one (lub mogą być - atrybuty mogą się różnić) duplikaty, a jak sugerują inni, narzędzie Usuń lub znajdź identyczne może być pomocne, jeśli masz ten poziom licencji. Ale jeśli są w ogóle przesunięte lub mają inny kształt, to tak naprawdę nie są duplikatami. Jeśli masz licencję Advanced, sprawdziłbym topologię geobazy, uruchamiając zaznaczenie Nie wolno nakładać się. Bez Advanced możliwe, że to samo można zrobić z QGIS i wtyczką, jak sugeruje odpowiedź Luigi.
Chris W

Odpowiedzi:

4

w QGIS wtyczka Topology Checker może prawdopodobnie rozwiązać Twój problem

Luigi Pirelli
źródło
3
Zgadzam się, że topologia jest prawdopodobnie najlepszym pojedynczym rozwiązaniem problemu czyszczenia danych. Możesz jednak nieco rozszerzyć swoją odpowiedź, podając link do wtyczki i krótki opis tego, co to jest lub robi topologia i jakie testy chcesz uruchomić. Obawiam się, że wpisana odpowiedź zostanie oznaczona jako niskiej jakości.
Chris W
ok: opis wtyczki znajduje się tutaj: docs.qgis.org/2.2/en/docs/user_manual/plugins/... i „nie może się pokrywać” może podejść do problemu. Przewodnik wideo po wtyczce znajduje się tutaj: youtube.com/watch?v=huhkTZkoKC8 .
Luigi Pirelli
6

Korzystam z narzędzi itertoolowych Pythona i SearchCursor, aby bardzo efektywnie znaleźć relacje przestrzenne, których szukasz. Można włączenie metod geometrycznych overlaps , containsi equaldostać na właściwości geometrycznych.

  1. Zacznij od utworzenia funkcji, która lepiej zorganizuje przepływ pracy i zapewni powtarzalność

    def findOverlaps(x):

  2. Otwórz kursor wyszukiwania, aby zapętlić geometrię poszczególnych obiektów

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

  3. służy itertools.combinations()do zwracania podciągów elementów z iterowalnego wejściacur

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

  4. Dostęp do właściwości geometrycznych z następującymi sposobami: equals(), overlaps()i contains(). Są one ustawione w logicznej kolejności - w razie potrzeby możesz je dostosować, aby osiągnąć określone cele.

        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. Uruchom...

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)

wprowadź opis zdjęcia tutaj

Zrzut ekranu pokazuje różne nakładające się, nakładające się i identyczne funkcje, które są unikalne.

wprowadź opis zdjęcia tutaj

Aaron
źródło
2

Mam pomysł, co może Ci pomóc. Będzie opierać się na niektórych założeniach, ale pomogłoby zawęzić listę możliwych identycznych funkcji. Nie byłby to zautomatyzowany proces, ale wymagałby ręcznego przeglądania duplikatów. Na podstawie komentarzy wydaje się, że zautomatyzowane narzędzia nie porównują atrybutów, więc pomogłoby to przypadkowo usunąć funkcje.

Korzystanie z ArcMap

(1) Zrób kopię pliku shapefile na wypadek, gdyby coś poszło nie tak.

(2) Dodaj kolumnę do swojego pliku kształtu jako podwójny.

(3) Oblicz obszar dla każdej funkcji, używając najbardziej opisowego (najbardziej precyzyjnego) formatu, jaki możesz. Coś, w czym zaokrąglanie może nie stanowić problemu.

(4) Uruchom podsumowanie (podsumowanie) w tej kolumnie. Upewnij się, że wybrałeś unikalny identyfikator w podsumowaniu i zaznaczyłeś zarówno pierwszy, jak i ostatni.

(5) W tabeli wyników wyszukaj te rekordy, w których pole liczby jest większe niż 1.

(6a) Ręcznie sprawdź funkcje i powtarzaj proces, aż nie będzie już duplikatów.

(6b) Możesz po prostu utworzyć listę tych unikalnych identyfikatorów i usunąć funkcje za pomocą arcpy, ale masz szansę na posiadanie dwóch niezidentyfikowanych cech o tym samym obszarze.

Kolejna technika wykorzystująca ArcPy

Konstruując powyższą odpowiedź, pomyślałem o możliwości, że wielu autorów tych danych mogło faktycznie użyć tych samych unikalnych identyfikatorów dla powielonych funkcji. W takim przypadku możesz znaleźć duplikaty poprzez zapętlenie w arcpy.

Sposób, w jaki pomyślałbym o zrobieniu tego za pomocą ArcPy, może obciążać twój system i zająć trochę czasu.

(1) Zrób kopię pliku shapefile (na wszelki wypadek)

(2) Dodaj nową kolumnę, aby oznaczyć duplikaty. Coś, co wymaga „y”, „n” lub 0 lub 1 lub cokolwiek by działało.

(3) Utwórz listę w Pythonie, aby przechowywać unikalny identyfikator.

(4) Uruchom kursor aktualizacji ( arcpy.UpdateCursor('LAYERNAME')). Dla każdego rekordu sprawdź listę, aby zobaczyć, czy zawiera on ten identyfikator, i zaznacz kolumnę dla duplikatów, jeśli istnieje.

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) Następnie możesz porównać lub zrobić, co chcesz, z zaznaczonymi kolumnami.

Prawdopodobnie istnieją lepsze sposoby wykonania tych porównań, ale uważam, że są to dwa, które moim zdaniem powinny zadziałać lub przynajmniej zacząć.

Edytować

W oparciu o komentarz elrobis , możesz użyć minimalnego prostokąta ograniczającego, aby dodatkowo zmniejszyć ryzyko usunięcia nieprawidłowych funkcji.

Korzystając z ArcMap, możesz uruchomić narzędzie Minimalna geometria ograniczająca w Zarządzaniu danymi. Po sprawdzeniu opcji, myślę, że najlepiej byłoby użyć opcji CONVEX_HULL .

Jeśli porównasz pola MBG_APodX / Y1 , MBG_APod_X / Y2 wraz z MBG_Orientation dla duplikatów, powinieneś być w stanie dobrze zrozumieć powielone funkcje. Sugerowałbym użycie metody podsumowania opisanej powyżej w celu porównania. Wybierz jeden z wierzchołków (współrzędnych) z prostokąta ograniczającego, aby znaleźć duplikaty. Możesz dostać kilka przypadkowych „dopasowań”, ale kiedy dodasz pozostałe wierzchołki plus orientację, byłoby całkiem bezpieczne, że funkcje wyników są duplikatami.

Chociaż go nie użyłem i nie jestem całkiem pewien wyników tego narzędzia, możesz łatwiej sprawdzić wynikowy plik kształtu, jeśli użyjesz narzędzia Statystyki podsumowujące w ArcMap. Wygląda na to, że możesz podsumować wiele kolumn w ten sposób zamiast mojej opcji pojedynczej kolumny.

Nie sądzę, aby byłby to całkowicie zautomatyzowany sposób, bez obawy o możliwość usunięcia niepowielonej funkcji. Te metody powinny jednak pomóc w ograniczeniu liczby funkcji, które należy ręcznie sprawdzić.

Branco
źródło
Zakładam, że były to wielokąty. Jeśli są to linie, możesz użyć długości. Punkty są najłatwiejsze ze współrzędnymi X / Y.
Branco
2
Myślałem też o „funkcjach równego obszaru”, ale wydaje mi się prawdopodobne, że ślady bldg mogą mieć wystarczająco dużo takich samych kształtów, aby stworzyć niezamierzone dopasowania. Myślę, że poprawiłoby to szanse na dalsze dopracowanie elementów z przecięciem MBR funkcji. Oznacza to, że jeśli mają ten sam obszar (i mogą być tą samą cechą) ORAZ ich MBR przecinają się, być może jest prawdopodobne, że są to dwie generacje tej samej cechy. Czy to ma sens?
elrobis
2

Możesz to zrobić w SQL za pomocą przestrzennego autosprzężenia. Nie podajesz używanego dialektu SQL, więc w tym przykładzie użyto Postgres / Postgis, ale można go łatwo dostosować do Oracle lub SQL Server. Zakładając tabelę zwaną budynkami, z geometrią zapisaną w kolumnie o nazwie geom:

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

To znajdzie przecięcia. Jeśli chcesz uzyskać całkowitą równość, zamień ST_Intersects na ST_Equals. Lub po prostu połącz oba:

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;

Zauważ, że a.id <b.id oznacza, że ​​bierzesz pod uwagę tylko połowę przypadków w łączeniu własnym, co sprawia, że ​​a) jest szybsza i b) daje listę, której możesz użyć do usunięcia połowy nakładających się wielokątów bez usuwania ich wszystkich . Oczywiście jest to nadal algorytm O (n²), ale w praktyce będzie on znacznie szybszy, jeśli będziesz mieć indeks przestrzenny - co jest tak naprawdę całkowitym wymogiem dla każdego nietrywialnego zestawu danych.

Być może trzeba będzie trochę to wymasować, aby dopasować się do definicji nakładania się - nie chcesz usuwać sąsiednich domów, które zostały źle zbadane.

John Powell
źródło
Jeśli brakuje Ci unikalnego atrybutu w pliku kształtu, możesz użyć a.rowidzamiast niego a.id. rowidjest słowem kluczowym w SQLite, które da ci wewnętrzny identyfikator zestawu danych.
LuWi
1

Wtyczka sprawdzania topologii jest dobrym narzędziem, jeśli jest używana prawidłowo. Nadal musisz dokładnie zrozumieć swoje dane ORAZ musisz ręcznie wprowadzić poprawki. Wtyczka podświetli to, co uważa za błędy. Do ciebie należy sprawdzenie każdego z nich i podjęcie właściwej decyzji dla ciebie i twoich danych. Mając 90 000 przedmiotów w warstwie, możesz być w domu przed świętami Bożego Narodzenia!

Johanna
źródło