To pytanie może ujawnić moją niewiedzę na temat programowania, ale jestem ciekawy, w jaki sposób ludzie używają różnych struktur danych Pythona w ArcPy.
Ta strona zawiera listę struktur danych w Pythonie. Rozumiem, w jaki sposób listy mogą być implementowane w GIS (lista klas elementów, lista typów elementów, lista ramek danych itp.). Rozumiem, w jaki sposób można również używać zestawów (do usuwania duplikatów). W jaki sposób ludzie wdrażają krotki, słowniki i inne struktury danych w ArcPy? Czy są też inne przykłady list i zestawów, których nie wymieniłem?
Ponadto bez wątpienia ludzie tworzą niestandardowe klasy w ArcPy. W jakich okolicznościach i sytuacjach tego potrzebujesz? Czy możesz podać przykłady? Czy ktoś tworzy niestandardowe klasy, które dziedziczą po wbudowanych klasach arcpy?
Nie wymagam odpowiedzi na wszystkie te pytania, jestem tylko ciekawy, jak ludzie używają Pythona w GIS i jakie przepływy pracy wymagają tych dostosowań.
źródło
Odpowiedzi:
Wiele funkcji arcpy, które przyjmują wiele danych wejściowych, akceptuje obiekty listy Python.
Na przykład
Dissolve_management
funkcja akceptuje listę nazw pól do rozpuszczenia:Krotki można użyć zamiast listy, gdy nie trzeba modyfikować kolejności ani liczby elementów, ponieważ krotki są niezmienne . Są one użyteczną strukturą danych dla heterogenicznych, ale powiązanych fragmentów danych, takich jak elementy znacznika czasu lub współrzędne punktu. Często widzisz listy krotek, w których krotka służy jako odrębny rekord ze stałą liczbą atrybutów, podczas gdy lista może łatwo zmienić rozmiar, zostać ponownie uporządkowana (posortowana) itp. Zobacz to pytanie StackOverflow, aby uzyskać więcej informacji na temat zastosowań list a krotki.
Słownik może być używany jako tabela szybkiego wyszukiwania do buforowania stosunkowo niewielkiego, ale często używanego zestawu par klucz-wartość w pamięci. Ciekawy przykład tego widziałem na forach ArcGIS: http://forums.arcgis.com/threads/55099-Update-cursor-with-joined-tables-work-around-w-dictionaries
Używanie słownika zamiast łączenia przyspieszyło ich obliczenia z 3,5 godziny do 15 minut.
Prostszym przykładem może być, jeśli masz milion rekordów adresów z atrybutem o skróconej nazwie stanu (CA), ale do celów wyświetlania chcesz przeliterować prawidłową nazwę (Kalifornia), możesz użyć tego słownika jako tabeli odnośników, gdy wypełnianie pełnego pola nazwy stanu.
Nie znalazłem potrzeby pisania klasy w Pythonie do użytku w Arcpy, ale to nie znaczy, że nie ma takiego przypadku użycia. Klasa może być przydatna, gdy masz zestaw ściśle powiązanych funkcji (zachowań), które działają na niektórych danych wejściowych (danych) i chcesz mieć możliwość korzystania z tych danych i zachowań w sposób obiektowy, ale jest to bardziej prawdopodobnie będzie to specyficzne dla logiki biznesowej i niezwiązane z arkami.
źródło
Blah238 dobrze omawia ten temat, więc dodam tylko kilka przykładów z mojej własnej pracy. Opracowuję wiele danych na lotniskach, a jedną z rzeczy, które muszę regularnie robić, jest czytanie w kolejności wzdłuż badanych punktów linii centralnej drogi startowej od pasa startowego. Można by pomyśleć, że te punkty byłyby już w porządku (w bazie danych GIS), ale rzadko są. Punkty linii środkowej pojawiają się co 10 stóp wzdłuż linii środkowej i są otoczone po obu stronach dwoma innymi rzędami punktów pomiarowych rozmieszczonych w odległości 10 stóp od siebie. Otrzymujesz obraz: mnóstwo punktów ... i zazwyczaj wszystkie są połączone razem w oparciu o bazę danych. Z tym, co robię w moich skryptach, zwykle najłatwiej jest po prostu wybrać punkty linii środkowej według atrybutów (lub przestrzennie, jeśli to konieczne), odczytać współrzędne dla każdego z nich i zrzucić wyniki na listę Pythona. Następnie mogę sortować, pop, odwracać itp.
Podobnie, korzystam ze słowników Python w szerokim zakresie (prawdopodobnie znacznie więcej niż niektórzy by to zaakceptowali). Muszę tworzyć zestawy wektorów jednostek 3D dla każdego końca pasa startowego na lotnisku i mam stały dostęp do nich w ramach skryptu i robię to w wielu moich skryptach. W innych słownikach przechowuję także wiele innych zestawów regularnie używanych danych. Podobnie jak listy, są szybkie i elastyczne. Wysoce polecany.
Jeśli chodzi o klasy, tak jak Blah238, nie znalazłem potrzeby tworzenia żadnych. Prawdopodobnie w moich skryptach preferowana jest klasa, ale tak naprawdę nie byłem w stanie zidentyfikować tych miejsc. Ktoś z większym doświadczeniem programistycznym prawdopodobnie szybko je znajdzie.
źródło
Ja też uwielbiam słowniki - używaj ich cały czas. Ta metoda pobiera niektóre właściwości odniesień przestrzennych i przechowuje wszystko w dict:
Ten fragment kodu wyodrębnia geometrie punktów z dwóch klas obiektów, a następnie używam geometrii później, aby wykonać trygonometr:
DUŻO tego, nad czym obecnie pracuję, polega na wyodrębnieniu współrzędnych i atrybutów z klas obiektów wektorowych i rastrów, aby dane mogły zostać przekazane do innego oprogramowania, które nawet nie wie, jakie są dane GIS. Często używam do tego list i słowników.
źródło
Przeczytaj to , przygotowując odpowiedź i musiałem wprowadzić pewne zmiany.
Nie jestem ekspertem w Pythonie, ale myślę, że pomysł za pomocą klas polega na tym, że możesz utworzyć instancję obiektu, który ma wiele gotowych metod, które dotyczą struktury danych, a także centralizacji metod. Istnieją również pewne zalety zakresu zmiennego w porównaniu z klasami i modułami, powyższe łącze nieco do tego prowadzi.
Mam klasę o nazwie featureLayer (prawdopodobnie nie nazywa się pythonowo ... wciąż się uczy). mogę zrobić
Definicja, aby to zrobić, jest metodą klasową, która po prostu iteruje operacje, części i wierzchołki. Następnie mogę zmienić obiekt point w instancję featureLayer i robić inne rzeczy, które ma moja klasa.
Myślę, że jeśli poprawnie zbudowane, klasy powinny unieważnić funkcjonalność. Na przykład wkrótce zacznę refaktoryzację, dzięki czemu będę mieć klasę featureLayer, która ma metody i atrybuty, które mają wszystkie warstwy cech. Następnie odziedzicz po nim, aby zbudować instancję klasy featureLayerStrict, która odziedziczy wszystkie atrybuty / metody featureLayers, ale utworzy instancję z określonym typem geometrii, takim jak wielokąt.
źródło
Pracuję głównie w VB .net, ale coraz częściej używam Pythona i Arcpy. W VB lubię i próbuję używać Enums, ponieważ sprawia, że czytanie kodu jest jaśniejsze. Wcześniejsze wersje Pythona nie implementowały Enums, więc hack miał na celu stworzenie klasy ujawniającej pewne właściwości, kilka przykładów omówiono na temat przepełnienia stosu . Teraz wygląda na to, że najnowsza wersja Pythona implementuje te, które zostały omówione tutaj .
źródło