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).
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.
Odpowiedzi:
w QGIS wtyczka Topology Checker może prawdopodobnie rozwiązać Twój problem
źródło
Korzystam z narzędzi itertoolowych Pythona i SearchCursor, aby bardzo efektywnie znaleźć relacje przestrzenne, których szukasz. Można włączenie metod geometrycznych
overlaps
,contains
iequal
dostać na właściwości geometrycznych.Zacznij od utworzenia funkcji, która lepiej zorganizuje przepływ pracy i zapewni powtarzalność
def findOverlaps(x):
Otwórz kursor wyszukiwania, aby zapętlić geometrię poszczególnych obiektów
with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
służy
itertools.combinations()
do zwracania podciągów elementów z iterowalnego wejściacur
for feature1,feature2 in itertools.combinations(cur, 2):
Dostęp do właściwości geometrycznych z następującymi sposobami:
equals()
,overlaps()
icontains()
. Są one ustawione w logicznej kolejności - w razie potrzeby możesz je dostosować, aby osiągnąć określone cele.Uruchom...
enter code here
findOverlaps (fc)Zrzut ekranu pokazuje różne nakładające się, nakładające się i identyczne funkcje, które są unikalne.
źródło
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.(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ć.
źródło
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:
To znajdzie przecięcia. Jeśli chcesz uzyskać całkowitą równość, zamień ST_Intersects na ST_Equals. Lub po prostu połącz oba:
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.
źródło
a.rowid
zamiast niegoa.id
.rowid
jest słowem kluczowym w SQLite, które da ci wewnętrzny identyfikator zestawu danych.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!
źródło