Виберіть чіткі значення з одного стовпця таблиці атрибутів (або шару)


16

Чи є спосіб виділити різні значення зі стовпця в ArcMap? У мене є дані у форматах GDB та SHP. Я шукав способи вибору за допомогою SQL, QueryLayers, ModelBuilder та окремих наборів інструментів, і це виглядає як усі варіанти вибору завжди ВИБІР * З ІМЕНА ТАКОГИ, де ...

У SQL я б написав SELECT DISTINCT columnName FROM tableName.

Відповіді:


17

Або ви можете запустити інструмент ArcToolBox Частота (Інструменти аналізу >> Статистика >> Частота), який виведе таблицю з унікальними значеннями і підрахунок, скільки разів вони з'являться.

Або ви можете написати скрипт python, який отримує SearchCursor на полі, а потім скласти список усіх значень форми

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

3
Якщо у вас немає ліцензії ArcInfo, використовуйте цей інструментарій (протестований лише на shapefiles) resource.arcgis.com/gallery/file/geoprocessing/…

3
Дивно, скільки функцій, які колись вимагали функції ArcInfo, тепер можуть бути реалізовані за допомогою декількох простих кодів / модулів Python. Це чудово!
RyanKDalton

Дякую Ден, що зробив трюк. Моя ліцензія не підтримувала панель інструментів "Частота".
Стів

12

Використовуйте розуміння списку 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)]) 

Для великих наборів даних методом ефективної пам'яті було б використовувати вираження генератора .

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

1
Оскільки вас цікавить лише одне поле, для кращої роботи я б вказав необов’язковий fieldsаргумент, наприкладmyList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName, fields=fldName)])
blah238

Гарна ідея. Мені буде цікаво перевірити різницю продуктивності. Для джерел даних SDE це, мабуть, важливо, але для файлів форм і баз даних файлів я би здивувався, якби був помітний.
тарен

Це чудово. У мене було посилання, яке показало це чудово, але воно зламалося одного дня. Сподіваюся, що це буде приємно довго.
Джастін

4

Якщо ваші дані у форматі PGDB, ви можете виконати наступні дії в діалогах конструктора запитів (запит на визначення, виберіть за атрибутами, виразами панелі інструментів тощо), використовуючи підзапит:

ВИБІР * ІЗ таблиціName 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)

Це поверне записи, для яких значення в стовпцях_to_test_for_unique_values ​​є унікальними.


1
Ви також можете використовувати DISTINCT через персональну базу даних геоданих.
Якуб Сисак GeoGraphics

4

Якщо у вас є лише основна (раніше названа ArcView) ліцензія, ви можете відкрити подання таблиці, клацнути стовпець правою кнопкою миші та вибрати підсумок.


Спасибі. Це спрацювало, але тоді я не зміг скопіювати список у вікно!
Стів


1

Якщо ваші дані знаходяться в SDE (двигуні просторової бази даних), можна використовувати об'єкт ArcSDESQLExecute python та arcpy. За допомогою цього "методу" можна пройти складний sql.

# 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

Або скористайтеся сценарієм Python для експорту до CSV, а потім скористайтеся API Python іншої бази даних (скажімо, SpatiaLite), щоб прочитати файл csv та виконати належний SQL-запит на ньому з одного сценарію. Для великої таблиці це може бути крихітніше швидше, ніж прокат власного конструктора списку - dunno.

Однак ви це зробите, це все ще справді дратівлива "особливість" ArcGIS.


0

Як щодо використання distinctв підзапиті (далі йдеться про клас класів FGDB):

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

Зауважте в довідці (10.0), що це має обмеження:

Покриття, форм-файли та інші джерела даних на основі файлів nongeodatabase не підтримують підзапити.


2
"DISTINCT" працює лише з Personal GDB, а не File GDB.
Якуб Сисак GeoGraphics

0

Як пропонує Джастін. Я, як правило, резюмую поле, яке я хочу, а потім вибираю окремо на dbf, виконуючи невеликий розрахунок, щоб класифікувати кожне окреме значення, а потім приєднати його до оригіналу.
Це довгий шлях, і вам доведеться фенагелювати своїми улюбленими методами каклюляції. але ...
Що б не виконала робота.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.