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.

Steve
quelle

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)
Justin
quelle
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))
tharen
quelle
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.

Brent Edwards
quelle
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.

klewis
quelle
Vielen Dank. Das hat funktioniert, aber dann konnte ich die Liste nicht aus dem Fenster kopieren!
Steve
@ Steve siehe gis.stackexchange.com/questions/58939/…
Matt Wilkie
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)
fallender Hund
quelle
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.

MappaGnosis
quelle
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.

Chad Cooper
quelle
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.

Brad Nesom
quelle