Özellik tablosunun (veya katmanının) tek bir sütunundan farklı değerler seçin


16

ArcMap'teki bir sütundan farklı değerler seçmenin bir yolu var mı? Veriler hem GDB hem de SHP formatlarında var. SQL, QueryLayers, ModelBuilder ve bireysel araç kutuları kullanarak seçmek için yollar aradım ve tüm seçim seçenekleri her zaman SELECT * FROM tableName WHERE ...

SQL'de SELECT DISTINCT columnName FROM tableName yazarım.

Yanıtlar:


17

Veya benzersiz değerlere sahip bir tablo ve kaç kez göründüklerini sayan ArcToolBox aracını Sıklık (Analiz Araçları >> İstatistik >> Sıklık) çalıştırabilirsiniz.

Veya bir alana bir SearchCursor alan python betiği yazabilir ve ardından formun tüm değerlerinin bir listesini oluşturabilirsiniz

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

3
ArcInfo lisansınız yoksa, bu araç kutusunu kullanın (yalnızca şekil dosyalarında test edilmiştir) resources.arcgis.com/gallery/file/geoprocessing/…

3
Bir zamanlar bir ArcInfo işlevi gerektiren kaç fonksiyonun şimdi oldukça basit bazı Python kodu / modülleri kullanılarak uygulanabileceği şaşırtıcı. Bu harika!
RyanKDalton

Teşekkürler Dan, hile yaptı. Lisansım Sıklık araç kutusunu desteklemedi.
Steve

12

Bir Python listesi kavrayışı kullanın.

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

Büyük veri kümeleri için bellek verimli bir yöntem, bir jeneratör ifadesi kullanmak olacaktır .

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

1
Yalnızca bir alanla ilgilendiğiniz için daha iyi performans için isteğe bağlı fieldsargümanı belirtirim , örneğinmyList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName, fields=fldName)])
blah238

İyi bir fikir. Performans farkını test etmek isterdim. SDE veri kaynakları için büyük olasılıkla önemlidir, ancak şekil dosyaları ve dosya coğrafi veritabanları için kayda değer olsaydı şaşırırdım.
tharen

Bu harika. Bu güzel gösterdi bir bağlantı vardı ama bir gün kırdı. Umarım bu güzel uzun bir süre olacak.
Justin

4

Verileriniz PGDB biçimindeyse, alt sorgu kullanarak sorgu oluşturucu iletişim kutularında (tanım sorgusu, özniteliklere göre seçim, araç kutusu ifadeleri vb.) Aşağıdakileri yapabilirsiniz:

SEÇİN * tableName NEREDEN ...

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)

Bu, column_to_test_for_unique_values ​​değerlerinin benzersiz olduğu kayıtları döndürür.


1
DISTINCT aracını Kişisel Coğrafi Veritabanı üzerinden de kullanabilirsiniz.
Jakub Sisak GeoGraphics


1

Verileriniz bir SDE (uzamsal veritabanı motoru) içindeyse, python ve arcpy'nin ArcSDESQLExecute nesnesini kullanabilirsiniz. Bu "yöntemi" kullanarak karmaşık sql geçebilir.

# 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

Veya CSV'ye dışa aktarmak için Python betiğinizi kullanın ve sonra csv'yi okumak ve aynı betiğin içinden uygun bir SQL sorgusu yapmak için başka bir veritabanının Python API'sını (SpatiaLite diyelim) kullanın. Büyük bir tablo için bu , kendi liste oluşturucunuzu yuvarlamaktan biraz daha hızlı olabilir - dunno.

Ancak bunu yaparsanız, bu hala ArcGIS'in gerçekten can sıkıcı bir "özelliği".


0

distinctBir alt sorguda (aşağıdaki bir FGDB özellik sınıfındadır) kullanmaya ne dersiniz :

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

Gönderilen not yardım bu sınırlamaları olduğunu unutmayın (10.0):

Kapsamlar, şekil dosyaları ve diğer nongeodatabase dosya tabanlı veri kaynakları alt sorguları desteklemez.


2
"DISTINCT" GDB Dosyası ile değil, yalnızca Kişisel GDB ile çalışır.
Jakub Sisak GeoGraphics

0

Justin'in önerdiği gibi. Normalde istediğim alanda bir özet yapıyorum, sonra her farklı değeri kategorilere ayırmak ve sonra orijinaline geri katılmak için küçük bir hesaplama çalıştırmak dbf üzerinde bir select farklı yapmak.
Bu uzun bir yol ve en sevdiğiniz caclulation yöntemleri ile fenagel gerekir. ama ...
işi ne yaparsa yapsın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.