Wählen Sie eindeutige Werte aus einer einzelnen Spalte einer Attributtabelle (oder eines Layers) aus.


16

Gibt es eine Möglichkeit, unterschiedliche Werte aus einer Spalte in ArcMap auszuwählen? Ich habe die Daten sowohl im GDB- als auch im SHP-Format. Ich habe nach Auswahlmöglichkeiten mit SQL, QueryLayers, ModelBuilder und einzelnen Toolboxen gesucht und es erscheinen als Auswahlmöglichkeiten immer SELECT * FROM tableName WHERE ...

In SQL würde ich SELECT DISTINCT columnName FROM tableName schreiben.

Antworten:


17

Sie können auch das ArcToolBox-Tool "Häufigkeit" (Analysewerkzeuge >> Statistiken >> Häufigkeit) ausführen, mit dem eine Tabelle mit eindeutigen Werten und der Anzahl ihrer Erscheinungen ausgegeben wird.

Sie können auch ein Python-Skript schreiben, das einen SearchCursor für ein Feld abruft, und dann eine Liste aller Werte des Formulars erstellen

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

3
Wenn Sie keine ArcInfo-Lizenz haben, verwenden Sie diese Toolbox (nur für Shapefiles getestet) resources.arcgis.com/gallery/file/geoprocessing/…

3
Es ist erstaunlich, wie viele Funktionen, für die früher eine ArcInfo-Funktion erforderlich war, jetzt mit relativ einfachen Python-Codes / Modulen implementiert werden können. Es ist großartig!
RyanKDalton-OffTheGridMaps

Danke Dan, das hat den Trick getan. Meine Lizenz hat die Frequency-Toolbox nicht unterstützt.
Steve

12

Verwenden Sie ein Python-Listenverständnis.

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

Bei großen Datenmengen wäre es eine speichereffiziente Methode, einen Generatorausdruck zu verwenden .

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

1
Da Sie sich nur für ein Feld interessieren, würde ich zur fieldsmyList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName, fields=fldName)])
Verbesserung der

Gute Idee. Ich wäre neugierig, den Leistungsunterschied zu testen. Für SDE-Datenquellen ist dies wahrscheinlich von Bedeutung, aber für Shapefiles und File-Geodatabases wäre ich überrascht, wenn dies spürbar wäre.
Tharen

Das ist toll. Ich hatte einen Link, der dies schön zeigte, aber es brach eines Tages. Ich hoffe, wir haben das für eine schöne lange Zeit.
Justin

4

Wenn Ihre Daten im PGDB-Format vorliegen, können Sie in den Dialogfeldern des Abfrage-Generators (Definitionsabfrage, Auswahl nach Attributen, Toolbox-Ausdrücken usw.) mithilfe einer Unterabfrage Folgendes ausführen:

SELECT * FROM tableName WHERE ...

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)

Dies gibt die Datensätze zurück, für die die Werte in column_to_test_for_unique_values ​​eindeutig sind.


1
Sie können DISTINCT auch über Personal Geodatabase verwenden.
Jakub Sisak GeoGraphics

4

Wenn Sie nur über eine Basislizenz (früher als ArcView bezeichnet) verfügen, können Sie die Tabellenansicht öffnen, mit der rechten Maustaste auf eine Spalte klicken und Zusammenfassen auswählen.


Vielen Dank. Das hat funktioniert, aber dann konnte ich die Liste nicht aus dem Fenster kopieren!
Steve


1

Wenn sich Ihre Daten in einer SDE (Spatial Database Engine) befinden, können Sie das ArcSDESQLExecute-Objekt von Python und arcpy verwenden. Mit dieser "Methode" kann man komplexe SQL übergeben.

# 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

Oder verwenden Sie Ihr Python-Skript, um nach CSV zu exportieren, und verwenden Sie dann die Python-API einer anderen Datenbank (z. B. SpatiaLite), um die CSV zu lesen und eine korrekte SQL-Abfrage innerhalb desselben Skripts auszuführen. Für einen großen Tisch ist dies möglicherweise ein kleines bisschen schneller als das Rollen Ihres eigenen Listenerstellers - keine Ahnung.

Wie auch immer Sie es tun, dies ist immer noch eine wirklich ärgerliche "Funktion" von ArcGIS.


0

Was ist mit der Verwendung von distinctin einer Unterabfrage (Folgendes gilt für eine FGDB-Feature-Class):

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

Beachten Sie in der Hilfe (10.0), dass dies Einschränkungen hat:

Coverages, Shapefiles und andere dateibasierte Nicht-Geodatabase-Datenquellen unterstützen keine Unterabfragen.


2
"DISTINCT" funktioniert nur mit Personal GDB, nicht mit File GDB.
Jakub Sisak GeoGraphics

0

Wie Justin vorschlägt. Normalerweise führe ich eine Zusammenfassung auf dem gewünschten Feld durch und führe dann auf dem DBF-Lauf eine kleine Berechnung durch, um jeden einzelnen Wert zu kategorisieren und diesen dann wieder mit dem Original zu verknüpfen.
Es ist der lange Weg, und Sie müssen Ihre bevorzugten Berechnungsmethoden anwenden. aber ...
Was auch immer die Arbeit erledigt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.