Zliczasz nakładające się wielokąty z jednego pliku kształtu za pomocą ArcGIS Desktop?


10

Mam plik kształtu z 16 400 wielokątami. Każdy wielokąt pokazuje ekspansję gatunku ptaka na cały świat.

wprowadź opis zdjęcia tutaj

Teraz muszę policzyć zachodzące na siebie wielokąty. Próbowałem tego ze związkiem i rozwiązałem (policzę związek), ale związek nie działa na tak wiele wielokątów.

Potem próbowałem wyciąć kontynenty, ale to też nie działa z powodu ogromnej liczby wielokątów. Ponadto wypróbowałem tę metodę , również bez powodzenia.

Dlatego pytam cię, czy istnieje sposób na policzenie nakładających się wielokątów, jeśli 16400 wielokątów znajduje się w jednym pliku kształtu?

Pracuję z 10.0 i mogę pracować z 10.2. Rozwiązanie ArcPy jest również wspaniałe.

W tej chwili myślę o stworzeniu kabaretki i iteracji po rzędach shp z 16400 wielokątów i wpisaniu 1 do pola wartości komórki kabaretki, jeśli wielokąt znajduje się w tej komórce, a następnie weźmy następny wiersz (wielokąt) i jeśli jest to również w komórce kabaretki, licz +1.

Ale nie wiem, czy to dobre rozwiązanie i jak to zrealizować. Albo muszę nauczyć się R, aby zastosować to podejście.

Wynik: powinien to być kształt, w którym masz nowe wielokąty spośród nakładających się, oraz pole, w którym policzone są nakładające się wielokąty.

Tak więc na końcu powinien znajdować się plik kształtu, w którym można zobaczyć, ile gatunków ptaków występuje w tym samym miejscu.


twój problem jest problemem ze względu na rozmiar twojego zestawu danych. Odpowiedzi (i link, który proponujesz) są poprawne, ale będziesz mieć problemy z pamięcią. Być może mógłbyś najpierw spróbować zintegrować swoje dane z setkami metrów (w oparciu o oczekiwaną precyzję), aby uniknąć tworzenia miliardów wielokątów taśmy. Upewnij się, że pracujesz nad kopią, ponieważ zmodyfikuje ona twoje dane.
radouxju

1
Podziel nasz plik kształtów na regionalne pliki kształtów, a następnie uruchom analizę regionalnych plików kształtów, a następnie rozpuść je, aby ponownie uzyskać pełny plik.
til_b

Próbowałem wyciąć ten kształt tylko z jednym krajem, ale otrzymałem błąd 999999.
Nora

1
Czy spojrzałeś na narzędzie Dice, aby zmniejszyć złożoność swoich wielokątów? Również jeśli pojawia się błąd 999999 podczas próby przycięcia danych, czy wypróbowałeś narzędzie do sprawdzania geometrii, aby sprawdzić, czy wywołuje jakiś wgląd?
Hornbydd

2
Przeprowadziłem częściową kontrolę geometrii danych i jest wiele samo-skrzyżowań. Sugerowałbym 1. Zapewnienie maksymalnego wykorzystania pamięci RAM i dużego pliku stronicowania 2. naprawa geometrii 3. W razie potrzeby uproszczenie wielokątów 3. podzbiór danych na 1 / 3s lub 1 / 4s (lub cokolwiek jest konieczne) 4. Uruchom przepływ pracy Union-Dissolve-Rasterize jak w tej odpowiedzi 5. Zsumuj rastry.
Cotton.Rockwood

Odpowiedzi:


9

Polecam korzystanie z narzędzia Count Count Overlapping Features (Analysis) .

Generuje planarne nakładające się operacje z operacji wejściowych. Liczba nakładających się funkcji jest zapisywana w operacjach wyjściowych.

wprowadź opis zdjęcia tutaj


Próbowałem również tego i to nie działa na mój shp (za duży). dzięki za odpowiedź
Nora

1
@Aaron link nie działa. W Pro jest teraz ta implementacja: pro.arcgis.com/en/pro-app/tool-reference/analysis/…
Albert

1
Dzięki @Albert, post został zaktualizowany na podstawie Twoich rekomendacji.
Aaron

5

Korzystając z arkadowych tokenów geometrii, możesz spróbować czegoś takiego:

wprowadź opis zdjęcia tutaj

import os
import arcpy

arcpy.env.workspace = r"" #path to workspace
arcpy.env.overwriteOutput = 1

polygon_fc = r"" #path to polygon fc

base = [row for row in arcpy.da.SearchCursor(polygon_fc,["OID@","SHAPE@"])]
compare = base

overlaps_stats = {}

for b in base:
    for c in compare:
        if b[1].overlaps(c[1]):
            #print "{0} overlaps {1}".format(b[0],c[0])
            if overlap_stats.has_key(b[0]):
                overlap_stats[b[0]].append(c[0])
            else:
                overlap_stats[b[0]] = [c[0]]

for key,value in overlap_stats.iteritems():
    print "Polygon {0}:  Overlaps: {1}.".format(key,len(value))

Dla przykładowych danych powyżej kod zwróci następujące liczby nakładania się: wprowadź opis zdjęcia tutaj

Kod w obecnej postaci zwraca tylko liczby wielokątów, które mają co najmniej jedno zachodzenie na siebie.


@ Nxau: Ok, chyba popełniłem błąd, tłumacząc, jak powinien wyglądać wynik. Powinien to być kształt, w którym masz nowe wielokąty z nakładających się. Na przykład na twoim zdjęciu koła 4 i 5 nakładają się. Nowy kształt powinien mieć trzy wielokąty. (Unia nie pracuje dla tego dużego kształtu). Obszar nakładający się powinien mieć wartość 2 w polu, a pozostałe kółka 4 i 5 powinny mieć wartość 1 w tym polu. Tak więc na końcu powinien znajdować się plik kształtu, w którym można zobaczyć, ile gatunków ptaków występuje w tym samym miejscu. Dzięki za skrypt!
Nora,


1

Myślę, że wypróbowałeś tę metodę: liczenie i rasteryzacja wieloboków nakłada się w ArcGIS Desktop?

16 400 wielokątów to niewiele. Jednak jednym potencjalnym rozwiązaniem jest po prostu regularne łączenie przestrzenne. W ArcMap toolbox, > Analysis Tools -> Overlap -> Spatial Join.

Ustaw zarówno funkcje, jak targeti joinfunkcje na ten sam zestaw danych i określ dane wyjściowe. Pozostaw resztę ustawień.

Po kilku chwilach powinieneś odzyskać plik kształtu, który zawiera kolumnę „liczba złączy”. Odejmij 1 od tego (jak oczywiście każda cecha powinna się przecinać), i powinna to być liczba „nakładek” (faktycznie przecina się) dla każdego wielokąta.

Właśnie to wykonałem


Tak, już wypróbowałem podejście z linku. Ale użycie unii jest niemożliwe dla tego shp. Próbuję dołączyć przestrzennego Odzyskałem: BŁĄD 000426: Brak pamięci.
Nora

Używam go na maszynie z zaledwie 4 GB pamięci RAM i miałem około 5 razy więcej funkcji, więc jestem zaskoczony, że nie działa z dużo mniejszą liczbą. Możesz mieć zbyt wiele wierzchołków w swoich danych (mój miał około 60 MB; jak duży jest twój plik .shp?). Spróbuj to uogólnić.
GIS-Jonathan

Jeśli tylko shp jest w fgdb, fgdb ma 1,73 GB. W folderze kształt ma 2,00 GB.
Nora

Użyłem również tego zestawu danych i myślę, że wiele problemów powstaje, ponieważ wiele wielokątów ma wiele części. To w połączeniu z rozdzielczością powoduje, że jest to bardzo wymagające zadanie pamięci.
Cotton.Rockwood

@ Cotton.Rockwood: I znajdziesz rozwiązanie w R, prawda? Myślę o użyciu zestawu narzędzi „Policz nakładające się wielokąty” z wejściem 500 wielokątów (33 wybory) niż wielokąta do rastra z wartością „łączenie liczby” i na końcu oblicz raster (ModelBuilder). To zajmuje dużo czasu ...
Nora,

1

Pobrałem i wypróbowałem narzędzie „Policz nakładające się wielokąty”. Może to działać, ale zajmuje to strasznie dużo czasu (prawdopodobnie dlatego, że rozmiar pliku, ale mój wejściowy FC miał tylko <5000 rekordów).

Podczas oczekiwania na uruchomienie tego narzędzia otworzyłem kolejne okno ArcMap i wystarczyło kilka szybkich kroków, aby uzyskać to, czego chciałem. 1) Łączenie przestrzenne - przy użyciu tej samej klasy obiektów co obiekty docelowe i łączenie oraz wybranie opcji „Połącz jeden z wieloma”. 2) Rozpuszczanie - wykorzystując dane wyjściowe z ostatniego kroku. Użyj „TARGET_FID” jako pola rozpuszczania, a dla statystyk możesz SUMOWAĆ pole „Join_Count” lub COUNT pole „JOIN_FID”. 3) W pliku wyjściowym z kroku 2 użyj kalkulatora pola odejmij 1 od pola statystyk („SUM_Join_Count” lub „COUNT_JOIN_FID”) - ponieważ każda cecha przecina się sama.

Sugeruję użycie tej metody w narzędziu „Policz nakładający się wielokąt”. Zacząłem uruchamiać narzędzie COP ~ 5 minut przed uruchomieniem tej metody Join-> Dissolve, co dało mi wystarczająco dużo czasu na napisanie tego, zanim narzędzie „Count Count Overlap Polygon” jeszcze się skończyło.

Mam nadzieję że to pomoże!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.