Seleziona valori distinti da una singola colonna di una tabella di attributi (o layer)


16

C'è un modo per selezionare valori distinti da una colonna in ArcMap? Ho i dati in entrambi i formati GDB e SHP. Ho cercato modi per selezionare usando SQL, QueryLayers, ModelBuilder e singole cassette degli strumenti e sembra che tutte le opzioni di selezione SELEZIONANO sempre * DA tableName DOVE ...

In SQL scriverei SELECT DISTINCT columnName FROM tableName.

Risposte:


17

Oppure puoi eseguire lo strumento ArcToolBox Frequenza (Strumenti di analisi >> Statistiche >> Frequenza) che genererà una tabella con valori univoci e un conteggio di quante volte compaiono.

Oppure potresti scrivere uno script Python che ottiene un SearchCursor su un campo, quindi creare un elenco di tutti i valori del modulo

if value not in myList:
    myList.append(value)

3
Se non si dispone di una licenza ArcInfo, utilizzare questo toolbox (testato solo su file di forma) resources.arcgis.com/gallery/file/geoprocessing/…

3
È sorprendente quante funzioni che un tempo richiedevano una funzione ArcInfo ora possano essere implementate usando alcuni codici / moduli Python abbastanza semplici. È ottimo!
RyanKDalton-OffTheGridMaps

Grazie Dan, ha funzionato. La mia licenza non supportava la casella degli strumenti Frequenza.
Steve

12

Usa una comprensione dell'elenco 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)]) 

Per set di dati di grandi dimensioni, un metodo efficiente in termini di memoria sarebbe utilizzare un'espressione del generatore .

myList = set((row.getValue(fldName) for row in arcpy.SearchCursor(fcName,fields=fldName))

1
Dal momento che sei interessato solo a un campo, per una migliore prestazione specificherei l' fieldsargomento facoltativo , ad es.myList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName, fields=fldName)])
blah238

Buona idea. Sarei curioso di provare la differenza di prestazioni. Per le fonti di dati SDE è probabilmente significativo, ma per gli shapefile e i file geodatabase sarei sorpreso se fosse apprezzabile.
tharen,

Questo è fantastico Avevo un link che lo mostrava bene, ma un giorno si è rotto. Spero che abbia questo per un bel po 'di tempo.
Justin

4

Se i tuoi dati sono in formato PGDB, puoi fare quanto segue nelle finestre di dialogo del generatore di query (query di definizione, selezionare per attributi, espressioni della casella degli strumenti, ecc.) Usando una sottoquery:

SELEZIONA * DA tableName DOVE ...

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)

Ciò restituirà i record per i quali i valori in column_to_test_for_unique_values ​​sono unici.


1
È inoltre possibile utilizzare DISTINCT su Geodatabase personale.
Jakub Sisak GeoGraphics,

4

Se si dispone solo di una licenza Basic (precedentemente chiamata ArcView), è possibile aprire la vista Tabella, fare clic con il pulsante destro del mouse su una colonna e selezionare Riepilogo.


Grazie. Questo ha funzionato, ma non sono riuscito a copiare l'elenco dalla finestra!
Steve


1

Se i tuoi dati sono in un SDE (motore di database spaziale), puoi usare l'oggetto ArcSDESQLExecute di python e arcpy. Si può passare sql complessi usando questo "metodo".

# 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)

0

Oppure usa il tuo script Python per esportare in CSV e quindi usa l'API Python di un altro database (ad esempio SpatiaLite) per leggere il CSV e fare una query SQL corretta da esso all'interno dello stesso script. Per un tavolo di grandi dimensioni, questo potrebbe essere un po 'più veloce rispetto al rotolamento del tuo generatore di elenchi - non so.

Comunque lo facciate, questa è ancora una "caratteristica" davvero fastidiosa di ArcGIS.


0

Che ne dici di usare a distinctin una sottoquery (il seguito è su una featureclass di FGDB):

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

Nota dall'aiuto (10.0) che questo ha delle limitazioni:

Coverage, shapefile e altre origini dati basate su file nongeodatabase non supportano le subquery.


2
"DISTINCT" funziona solo con GDB personale e non con File GDB.
Jakub Sisak GeoGraphics,

0

Come suggerisce Justin. Normalmente faccio un riepilogo sul campo che desidero, quindi eseguo una selezione distinta sul dbf eseguo un piccolo calcolo per classificare ciascun valore distinto e poi ricollego l'originale.
È una lunga strada da percorrere e devi fenagel con i tuoi metodi di caclulazione preferiti. ma ...
qualunque cosa faccia il lavoro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.