Seleccione valores distintos de una sola columna de una tabla de atributos (o capa)

16

¿Hay alguna manera de seleccionar valores distintos de una columna en ArcMap? Tengo los datos en formatos GDB y SHP. He buscado formas de seleccionar usando SQL, QueryLayers, ModelBuilder y cajas de herramientas individuales y aparece como todas las opciones de selección siempre SELECT * FROM tableName WHERE ...

En SQL, escribiría SELECT DISTINCT columnName FROM tableName.

Steve
fuente

Respuestas:

17

O puede ejecutar la herramienta Frecuencia ArcToolBox (Herramientas de análisis >> Estadísticas >> Frecuencia) que generará una tabla con valores únicos y un recuento de cuántas veces aparecen.

O puede escribir un script de Python que obtenga un SearchCursor en un campo y luego construir una lista de todos los valores del formulario

if value not in myList:
    myList.append(value)
Justin
fuente
3
Si no tiene una licencia de ArcInfo, use esta caja de herramientas (probada solo en archivos shape) resources.arcgis.com/gallery/file/geoprocessing/…
3
Es sorprendente cuántas funciones que alguna vez requirieron una función ArcInfo ahora se pueden implementar utilizando algunos códigos / módulos Python bastante simples. ¡Es genial!
RyanKDalton-OffTheGridMaps
Gracias Dan, eso hizo el truco. Mi licencia no era compatible con la caja de herramientas Frecuencia.
Steve
12

Use una lista de comprensión de 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)]) 

Para grandes conjuntos de datos, un método eficiente de la memoria sería utilizar una expresión generadora .

myList = set((row.getValue(fldName) for row in arcpy.SearchCursor(fcName,fields=fldName))
tharen
fuente
1
Como solo está interesado en un campo, para un mejor rendimiento, especificaría el fieldsargumento opcional , por ejemplomyList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName, fields=fldName)])
blah238
Buena idea. Tengo curiosidad por probar la diferencia de rendimiento. Para las fuentes de datos SDE es probable que sea significativo, pero para los shapefiles y las geodatabases de archivos me sorprendería si fuera apreciable.
tharen
Esto es genial. Tenía un enlace que mostraba esto muy bien pero se rompió un día. Espero que tenga esto por un buen tiempo.
Justin
4

Si sus datos están en formato PGDB, puede hacer lo siguiente dentro de los cuadros de diálogo del generador de consultas (consulta de definición, selección por atributos, expresiones de la caja de herramientas, etc.) utilizando una subconsulta:

SELECCIONAR * DESDE tableName DONDE ...

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)

Esto devolverá los registros para los cuales los valores en column_to_test_for_unique_values ​​son únicos.

Brent Edwards
fuente
1
También puede usar DISTINCT sobre Geodatabase personal.
Jakub Sisak GeoGraphics
4

Si solo tiene una licencia Básica (anteriormente llamada ArcView), puede abrir la vista Tabla, hacer clic con el botón derecho en una columna y seleccionar Resumir.

klewis
fuente
Gracias. Esto funcionó, ¡pero no pude copiar la lista por la ventana!
Steve
1

Si sus datos están en un SDE (motor de base de datos espacial), puede usar el objeto ArcSDESQLExecute de python y arcpy. Uno puede pasar sql complejo utilizando este "método".

# 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)
perro cayendo
fuente
0

O use su secuencia de comandos de Python para exportar a CSV y luego use la API de Python de otra base de datos (digamos SpatiaLite) para leer el csv y realizar una consulta SQL adecuada desde el mismo script. Para una tabla grande, esto podría ser un poco más rápido que crear su propio generador de listas: no lo sé.

Independientemente de cómo lo haga, esta sigue siendo una "característica" realmente molesta de ArcGIS.

MappaGnosis
fuente
0

¿Qué pasa con el uso de a distincten una subconsulta?

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

Tenga en cuenta de la ayuda (10.0) que esto tiene limitaciones:

Las coberturas, los archivos de forma y otras fuentes de datos basadas en archivos no geodatabase no admiten subconsultas.

Chad Cooper
fuente
2
"DISTINCT" solo funciona con Personal GDB, no con File GDB.
Jakub Sisak GeoGraphics
0

Como Justin sugiere. Normalmente hago un resumen en el campo que quiero, luego hago una selección distinta en el dbf, ejecuto un pequeño cálculo para clasificar cada valor distinto y luego lo vuelvo a unir al original.
Es el camino más largo, y tienes que enfrentarte a tus métodos de caclulación favoritos. pero ... lo que
sea ​​que haga el trabajo.

Brad Nesom
fuente