Pilih nilai yang berbeda dari satu kolom tabel atribut (atau layer)

16

Apakah ada cara untuk memilih nilai yang berbeda dari kolom di ArcMap? Saya memiliki data dalam format GDB dan SHP. Saya telah mencari cara untuk memilih menggunakan SQL, QueryLayers, ModelBuilder dan masing-masing kotak alat dan tampaknya semua pilihan pilihan selalu SELECT * FROM tableName WHERE ...

Dalam SQL saya akan menulis SELECT DISTINCT columnName FROM tableName.

Steve
sumber

Jawaban:

17

Atau Anda dapat menjalankan alat ArcToolBox Frekuensi (Alat Analisis >> Statistik >> Frekuensi) yang akan menampilkan tabel dengan nilai unik dan jumlah berapa kali mereka muncul.

Atau Anda bisa menulis skrip python yang mendapat SearchCursor di bidang lalu buat daftar semua nilai formulir

if value not in myList:
    myList.append(value)
Justin
sumber
3
Jika Anda tidak memiliki lisensi ArcInfo maka gunakan toolbox ini (diuji hanya pada shapefile) resources.arcgis.com/gallery/file/geoprocessing/…
3
Sungguh menakjubkan betapa banyak fungsi yang pernah membutuhkan fungsi ArcInfo sekarang dapat diimplementasikan menggunakan beberapa kode / modul Python yang cukup sederhana. Itu bagus!
RyanKDalton-OffTheGridMaps
Terima kasih Dan, itu berhasil. Lisensi saya tidak mendukung kotak peralatan Frekuensi.
Steve
12

Gunakan pemahaman daftar 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)]) 

Untuk dataset besar, metode yang efisien memori adalah menggunakan ekspresi generator .

myList = set((row.getValue(fldName) for row in arcpy.SearchCursor(fcName,fields=fldName))
Tharen
sumber
1
Karena Anda hanya tertarik pada satu bidang, untuk kinerja yang lebih baik saya akan menentukan fieldsargumen opsional , misalnyamyList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName, fields=fldName)])
blah238
Ide bagus. Saya ingin tahu untuk menguji perbedaan kinerja. Untuk sumber data SDE kemungkinan besar, tetapi untuk shapefile dan file geodatabases saya akan terkejut jika itu cukup besar.
tharen
Ini bagus. Saya memiliki tautan yang menunjukkan ini dengan baik tetapi suatu hari rusak. Semoga se akan memiliki ini untuk waktu yang lama.
Justin
4

Jika data Anda dalam format PGDB, Anda bisa melakukan hal berikut dalam dialog pembuat kueri (kueri definisi, pilih berdasarkan atribut, ekspresi kotak peralatan, dll.) Menggunakan subquery:

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)

Ini akan mengembalikan catatan yang nilainya unik dalam kolom_to_test_for_unique_values.

Brent Edwards
sumber
1
Anda juga dapat menggunakan DISTINCT melalui Personal Geodatabase.
Jakub Sisak GeoGraphics
4

Jika Anda hanya memiliki lisensi Basic (sebelumnya disebut ArcView), Anda bisa membuka tampilan Table, klik kanan kolom, dan pilih Summarize.

Klewis
sumber
Terima kasih. Ini berhasil, tetapi kemudian saya tidak dapat menyalin daftar dari jendela!
Steve
1

Jika data Anda berada di SDE (mesin basis data spasial) seseorang dapat menggunakan objek ArcSDESQLExecute python dan arcpy. Satu dapat melewati sql kompleks menggunakan "metode."

# 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)
anjing jatuh
sumber
0

Atau gunakan skrip Python Anda untuk mengekspor ke CSV dan kemudian gunakan Python API dari basis data lain (katakanlah SpatiaLite) untuk membaca csv dan lakukan kueri SQL yang tepat di dalamnya dari dalam skrip yang sama. Untuk sebuah meja besar, ini mungkin sedikit lebih cepat daripada menggulung pembuat daftar Anda sendiri - tidak tahu.

Bagaimanapun Anda melakukannya, ini masih merupakan "fitur" yang sangat mengganggu dari ArcGIS.

MappaGnosis
sumber
0

Bagaimana dengan menggunakan a distinctdi dalam subquery (berikut ini ada pada sebuah Featureseclass FGDB):

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

Perhatikan dari bantuan (10.0) bahwa ini memang memiliki batasan:

Cakupan, shapefile, dan sumber data berbasis file nongeodatabase lainnya tidak mendukung subquery.

Chad Cooper
sumber
2
"DISTINCT" hanya berfungsi dengan Personal GDB, bukan File GDB.
Jakub Sisak GeoGraphics
0

Seperti yang disarankan Justin. Saya biasanya melakukan ringkasan pada bidang yang saya inginkan, kemudian melakukan pilih yang berbeda pada dbf menjalankan sedikit perhitungan untuk mengkategorikan setiap nilai yang berbeda kemudian bergabung kembali ke yang asli.
Ini masih jauh, dan Anda harus fenagel dengan metode caclulation favorit Anda. tapi ...
Apapun yang menyelesaikan pekerjaan.

Brad Nesom
sumber