Wybierz różne wartości z pojedynczej kolumny tabeli atrybutów (lub warstwy)

16

Czy istnieje sposób na wybranie odrębnych wartości z kolumny w ArcMap? Mam dane zarówno w formacie GDB, jak i SHP. Szukałem sposobów wyboru za pomocą SQL, QueryLayers, ModelBuilder i indywidualnych skrzynek narzędziowych i pojawia się, ponieważ wszystkie opcje wyboru zawsze WYBIERZ * Z nazwy tabeli GDZIE ...

W SQL napisałbym SELECT DISTINCT columnName FROM tableName.

Steve
źródło

Odpowiedzi:

17

Możesz też uruchomić narzędzie ArcToolBox Częstotliwość (Narzędzia analizy >> Statystyka >> Częstotliwość), która wyświetli tabelę z unikalnymi wartościami i liczbą wyświetleń.

Lub możesz napisać skrypt Pythona, który pobiera SearchCursor na polu, a następnie zbudować listę wszystkich wartości formularza

if value not in myList:
    myList.append(value)
Justin
źródło
3
Jeśli nie masz licencji ArcInfo, skorzystaj z tego
3
To niesamowite, ile funkcji, które kiedyś wymagały funkcji ArcInfo, można teraz zaimplementować przy użyciu dość prostego kodu / modułów Pythona. Wspaniale!
RyanKDalton
Dzięki Dan, to załatwiło sprawę. Moja licencja nie obsługuje przybornika Częstotliwość.
Steve
12

Użyj rozumienia listy w języku Python.

import arcpy
fldName = 'val_fld'
fcName = 'feature_class.shp'
#set creates a unique value iterator from the value field
myList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName)]) 

W przypadku dużych zestawów danych metodą efektywną pod względem pamięci byłoby użycie wyrażenia generatora .

myList = set((row.getValue(fldName) for row in arcpy.SearchCursor(fcName,fields=fldName))
Tharen
źródło
1
Ponieważ jesteś zainteresowany tylko jednym polem, dla lepszej wydajności fieldsmyList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName, fields=fldName)])
podałbym
Dobry pomysł. Byłbym ciekawy przetestować różnicę wydajności. W przypadku źródeł danych SDE jest to prawdopodobnie znaczące, ale dla plików kształtów i geobaz danych plików byłbym zaskoczony, gdyby było to znaczące.
tharen
To jest świetne. Miałem link, który ładnie to pokazał, ale pewnego dnia się zepsuł. Mam nadzieję, że będzie to miało miły czas.
Justin
4

Jeśli Twoje dane są w formacie PGDB, możesz wykonać następujące czynności w oknach dialogowych konstruktora zapytań (zapytanie definicji, wybierz według atrybutów, wyrażeń w przyborniku itp.) Za pomocą podzapytania:

WYBIERZ * Z nazwy tabeli GDZIE ...

column_to_test_for_unique_values IN 
(SELECT column_to_test_for_unique_values
FROM table_name
GROUP BY column_to_test_for_unique_values HAVING
Count(column_to_test_for_unique_values)=1)

Zwróci to rekordy, dla których wartości w wartości column_to_test_for_unique_values ​​są unikalne.

Brent Edwards
źródło
1
Możesz także użyć DISTINCT zamiast osobistej geobazy.
Jakub Sisak GeoGraphics
4

Jeśli masz tylko licencję Basic (wcześniej zwaną ArcView), możesz otworzyć widok Tabeli, kliknąć kolumnę prawym przyciskiem myszy i wybrać Podsumuj.

Klewis
źródło
Dzięki. To działało, ale potem nie mogłem skopiować listy z okna!
Steve
1

Jeśli twoje dane są w SDE (przestrzennym silniku bazy danych), możesz użyć obiektu ArcSDESQLExecute Pythona i Arcpy. Za pomocą tej „metody” można przekazać złożony kod SQL.

# set up executor for sql
executor = arcpy.ArcSDESQLExecute(sde_connection_sql)

# sql statements
select_max = """select max(LOAD_ID) from SDE.FEATURE_CLASS"""

# get load id
result_max_id = executor.execute(select_max)
spadający pies
źródło
0

Lub użyj skryptu Python, aby wyeksportować do pliku CSV, a następnie użyj interfejsu API Python innej bazy danych (powiedzmy SpatiaLite), aby odczytać plik csv i wykonać odpowiednie zapytanie SQL z tego samego skryptu. W przypadku dużego stołu może to być być nieco szybsze niż tworzenie własnej listy - dunno.

Jakkolwiek to zrobisz, jest to wciąż irytująca „funkcja” ArcGIS.

MappaGnosis
źródło
0

A co z używaniem distinctw podzapytaniu (poniżej jest klasa funkcji FGDB):

"STATE_NAME" = (select distinct "STATE_NAME" from EsriUsaCountiesDetailed)

Z pomocy (10.0) zauważ, że ma to ograniczenia:

Pokrycia, pliki kształtów i inne źródła danych oparte na plikach innych niż baza danych nie obsługują podkwerend.

Chad Cooper
źródło
2
„DISTINCT” działa tylko z Personal GDB, a nie File GDB.
Jakub Sisak GeoGraphics
0

Jak sugeruje Justin. Zwykle robię podsumowanie w polu, które chcę, a następnie wybieram odrębne w dbf, uruchamiam małe obliczenia, aby kategoryzować każdą odrębną wartość, a następnie łączę ją z powrotem z oryginałem.
To długa droga i musisz fenagel z ulubionymi metodami kakulacji. ale ...
Cokolwiek załatwi sprawę.

Brad Nesom
źródło