Wybieranie wielokąta ArcSDE według punktu w ArcGIS Desktop za pomocą ArcPy?


15

Ciągle myślę, że coś mi brakuje, ale wydaje się, że w ArcGIS 10 nie ma narzędzia do wybierania elementów (w szczególności wielokątów) z warstwy w lokalizacji punktu (X, Y) za pomocą ArcPy. Parametry takiego narzędzia to po prostu nazwa warstwy i lokalizacja XY.

W tej chwili obejdę to, tworząc klasę obiektów punktowych zawierającą punkt i wykonując na nim SelectLayerByLocation. Jednak gdy klasa elementów wielokątów znajduje się w Oracle (dostęp za pośrednictwem ArcSDE 9.x) i zawiera 3,5 miliona wielokątów, wybór może zająć więcej niż 5 minut, kiedy myślę, że sekunda lub dwie (z mniejszym kodem) byłyby bardziej odpowiedni. Klasa obiektów ma indeks przestrzenny i próbowałem użyć arcpy.env.extent (który SelectLayerByLocation wydaje się ignorować) w celu ograniczenia dostępnego obszaru geograficznego, ale wydajność pozostaje bardzo niska.

Czy jest szybszy sposób, aby to zrobić za pomocą ArcGIS Desktop 10 i ArcPy?


Istnieje teraz rozwiązanie tego problemu na forums.arcgis.com/threads/…, a ja będę edytować te informacje tutaj dzisiaj dzisiaj - wielkie podziękowania dla Jasona Scheirera i Chrisa Snydera
PolyGeo

2
Dla przypomnienia można znaleźć środowiska honorowane przez narzędzie u dołu strony odniesienia tego narzędzia. SelectByLocation honoruje tylko bieżący obszar roboczy i układ współrzędnych wyjściowych. help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…
blord-castillo

Odpowiedzi:


9

Innym podejściem do tego byłoby użycie narzędzia Łączenie przestrzenne. Użyj punktu jako wejściowej warstwy obiektów, jak powyżej, a warstwy wielokąta jako funkcji tożsamości.
W przeciwieństwie SelectLayerByLocation, SpatialJoin robi cześć środowiska stopniu.

targetlayer = layername
joinlayer=arcpy.PointGeometry(arcpy.Point(x, y))
fieldmappings = arcpy.FieldMappings()
fieldmappings.addTable(targetlayer)
arcpy.SpatialJoin_analysis(targetlayer, joinlayer, outputlayer, "JOIN_ONE_TO_MANY", "KEEP_COMMON", fieldmappings)

JOIN_ONE_TO_MANY może wydawać się sprzeczny z intuicją, ale ponieważ masz tylko jedną funkcję łączenia, główną funkcją tej opcji jest wyłączenie agregacji i scalanie reguł. KEEP_COMMON upewni się, że twój wynik jest ograniczony tylko do wielokąta, który przecina twój punkt. Mapowanie pól ograniczy atrybuty wyjściowe tylko do kształtu i atrybutów warstwy wielokąta; domyślnie zawierałyby również atrybuty warstwy punktowej.

Reszta ustawień domyślnych będzie działać dobrze, więc możesz pominąć pozostałe argumenty.


Wielkie dzięki za ten kod, który zawierał kilka technik, których nie próbowałem. Wcześniej próbowałem SpatialJoin (aby móc szanować środowisko geoprzetwarzania), ale to testowanie, a także test twojej techniki właśnie teraz, pozostawia mi 4-5 minutowy czas reakcji w porównaniu do 10-12 sekund Chris Snyder mnie do tego doprowadził.
PolyGeo

Czy próbowałeś też techniki Chrisa Snydera w SpatialJoin? Myślę, że głównym powodem, dla którego technika buforowania jest tak szybka, jest wykorzystanie w pamięci kopii klasy wieloboków. Myślę, że wybór według lokalizacji powinien być szybszy niż połączenie przestrzenne, ale nie jestem pewien.
blord-castillo

Skończyło się na tym, że nie użyłem bitu in_memory. To było już tak przyspieszone, że trzymałem to w rezerwie. Myślę, że kluczową rzeczą było ustawienie zasięgu uzyskania jednego / kilku wielokątów (z 3,5 miliona), które musiałem sprawdzić przed X, Y, szybko skopiowane do lokalnej bazy danych geobazy. Uważam więc, że wykonanie tej części przed SpatialJoin doprowadziłoby do takiej samej / podobnej poprawy wydajności.
PolyGeo

1

Właśnie zdałem sobie sprawę z czegoś ...

Jeśli używasz tego do zaimplementowania usługi geoprzetwarzania, możesz również zaimplementować usługę cech z warstwą wielokątów i użyć operacji zapytania w usłudze funkcji.

Państwo może użyć prostego położenia XY z funkcją pracy Query Service, a także kontrolować atrybuty wyjście w tym kształcie.

Możesz mieć ograniczenia dotyczące tego, ile możesz wystawić klasę obiektów wielokąta, ale jeśli już udostępniasz ją dla usługi geoprzetwarzania, powinieneś być w stanie również zbudować usługę obiektów.


Jest to przydatna myśl, aby spełnić inne wymagania, ale w tym przypadku aplikacja kliencka jest bardzo prosta i poza moją kontrolą, więc jestem w stanie zapewnić tylko usługę geoprzetwarzania.
PolyGeo

Uznałem, że może istnieć ograniczenie korzystania z czegokolwiek innego niż usługa geoprzetwarzania :) Jak na ironię, myślę, że usługa dodatkowa jest znacznie prostszą drogą do wdrożenia i utrzymania. Może to również wyjaśniać, dlaczego żądana funkcjonalność nie jest dostępna; możesz to zrobić już na każdym poziomie aplikacji. Upewnij się, że wysłałeś żądanie do ESRI w celu zaimplementowania go jako narzędzia w następnej wersji.
blord-castillo

1

Ta odpowiedź pochodzi ze starych forów dyskusyjnych ArcGIS .

Dziękuję Jasonowi Scheirerowi za bardziej zwięzły kod:

SelectLayerByLocation(in_layer=arcpy.PointGeometry(arcpy.Point(x, y)), select_features="mylayer") 

A szczególnie Chrisowi Snyderowi za wskazówkę dotyczącą wydajności:

Szybszym obejściem może być trochę buforowanie punktu, a następnie użycie zakresu bufora jako zakresu analizy do wykonania kopii in_memory (narzędzie CopyFeatures) danych SDE, a następnie wykonanie SelectByLocation na mniejszym i lokalnym zestawie danych in_memory. W ten sposób sprawiasz, że narzędzie SelectByLocation honoruje środowisko zasięgu analizy, czego normalnie by nie zrobił. BTW: Wszelkie funkcje pokrywające się z zakresem analizy zostaną skopiowane za pomocą narzędzia CopyFeatures. Z pewnością chcę, aby narzędzie SelectByLocation i metody kursorów honorowały zakres analizy ...

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.