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.

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)

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

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.


1
Anda juga dapat menggunakan DISTINCT melalui Personal Geodatabase.
Jakub Sisak GeoGraphics


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)

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.


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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.