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?

PolyGeo
źródło
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.

blord-castillo
źródło
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.

blord-castillo
źródło
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 ...

PolyGeo
źródło