Sélectionnez des valeurs distinctes dans une seule colonne d'une table (ou couche) d'attributs


16

Existe-t-il un moyen de sélectionner des valeurs distinctes dans une colonne dans ArcMap? J'ai les données aux formats GDB et SHP. J'ai cherché des moyens de sélectionner en utilisant SQL, QueryLayers, ModelBuilder et des boîtes à outils individuelles et il apparaît que toutes les options de sélection sont toujours SELECT * FROM tableName WHERE ...

En SQL, j'écrirais SELECT DISTINCT columnName FROM tableName.

Réponses:


17

Ou vous pouvez exécuter l'outil ArcToolBox Frequency (Outils d'analyse >> Statistiques >> Fréquence) qui produira un tableau avec des valeurs uniques et un nombre de fois où elles apparaissent.

Ou vous pouvez écrire un script python qui obtient un SearchCursor sur un champ puis créer une liste de toutes les valeurs du formulaire

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

3
Si vous n'avez pas de licence ArcInfo, utilisez cette boîte à outils (testée uniquement sur les fichiers de formes) resources.arcgis.com/gallery/file/geoprocessing/…

3
Il est étonnant de voir combien de fonctions qui nécessitaient auparavant une fonction ArcInfo peuvent désormais être implémentées à l'aide de code / modules Python assez simples. C'est bien!
RyanKDalton-OffTheGridMaps

Merci Dan, ça a fait l'affaire. Ma licence ne prend pas en charge la boîte à outils Fréquence.
Steve

12

Utilisez une compréhension de liste 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)]) 

Pour les grands ensembles de données, une méthode efficace en mémoire consisterait à utiliser une expression de générateur .

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

1
Puisque vous n'êtes intéressé que par un seul champ, pour de meilleures performances, je spécifierais l' fieldsargument facultatif , par exemplemyList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName, fields=fldName)])
blah238

Bonne idée. Je serais curieux de tester la différence de performances. Pour les sources de données SDE, c'est probablement important, mais pour les fichiers de formes et les géodatabases fichier, je serais surpris si c'était appréciable.
tharen

C'est bien. J'avais un lien qui le montrait bien mais il s'est cassé un jour. J'espère que vous l'aurez pendant longtemps.
Justin

4

Si vos données sont au format PGDB, vous pouvez effectuer les opérations suivantes dans les boîtes de dialogue du générateur de requêtes (requête de définition, sélection par attributs, expressions de boîte à outils, etc.) à l'aide d'une sous-requête:

SELECT * FROM tableName OERE ...

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)

Cela renverra les enregistrements pour lesquels les valeurs des valeurs column_to_test_for_unique_values ​​sont uniques.


1
Vous pouvez également utiliser DISTINCT sur une géodatabase personnelle.
Jakub Sisak GeoGraphics


1

Si vos données sont dans un SDE (moteur de base de données spatiales), vous pouvez utiliser l'objet python et ArcSDESQLExecute d'arcpy. On peut passer sql complexe en utilisant cette "méthode".

# 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

Ou utilisez votre script Python pour exporter vers CSV, puis utilisez l'API Python d'une autre base de données (par exemple SpatiaLite) pour lire le csv et effectuer une requête SQL appropriée à partir du même script. Pour une grande table, cela pourrait être un peu plus rapide que de lancer votre propre générateur de liste - dunno.

Quoi que vous fassiez, c'est toujours une "fonctionnalité" vraiment ennuyeuse d'ArcGIS.


0

Qu'en est-il de l'utilisation d'un distinctdans une sous-requête (ce qui suit concerne une classe de fonctionnalités FGDB):

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

Notez dans l' aide (10.0) que cela a des limites:

Les couvertures, les fichiers de formes et les autres sources de données non basées sur des bases de données ne prennent pas en charge les sous-requêtes.


2
"DISTINCT" ne fonctionne qu'avec Personal GDB et non avec File GDB.
Jakub Sisak GeoGraphics

0

Comme le suggère Justin. Je fais normalement un résumé sur le champ que je veux, puis fais une sélection distincte sur le dbf, exécute un petit calcul pour catégoriser chaque valeur distincte, puis rejoins-la à l'original.
C'est le long chemin, et vous devez fenagel avec vos méthodes de caclulation préférées. mais ...
Peu importe ce qui fait le travail.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.