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


16

Есть ли способ выбрать отдельные значения из столбца в ArcMap? У меня есть данные в форматах GDB и SHP. Я искал способы выбора, используя SQL, QueryLayers, ModelBuilder и отдельные наборы инструментов, и он появляется, поскольку все параметры выбора всегда ВЫБРАТЬ * ИЗ ИМЕНА tableName ГДЕ ...

В SQL я бы написал SELECT DISTINCT columnName FROM tableName.

Ответы:


17

Или вы можете запустить ArcToolBox инструмент Frequency (Инструменты анализа >> Статистика >> Frequency), который выведет таблицу с уникальными значениями и счетчиком того, сколько раз они появляются.

Или вы можете написать скрипт Python, который получает SearchCursor на поле, а затем построить список всех значений в форме

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

3
Если у вас нет лицензии ArcInfo затем использовать этот набор инструментов (проверено на шейпфайлы только) resources.arcgis.com/gallery/file/geoprocessing/...

3
Удивительно, сколько функций, которые когда-то требовали функции ArcInfo, теперь могут быть реализованы с использованием довольно простых кодов / модулей Python. Здорово!
RyanKDalton-OffTheGridMaps

Спасибо Дэн, что сделал свое дело. Моя лицензия не поддерживает набор инструментов частоты.
Стив

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, вы можете сделать следующее в диалоговых окнах построителя запросов (определение запроса, выборка по атрибутам, выражения панели инструментов и т. Д.), Используя подзапрос:

SELECT * FROM tableName ГДЕ ...

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)

Это вернет записи, для которых значения в column_to_test_for_unique_values ​​являются уникальными.


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

4

Если у вас есть только базовая (ранее называемая ArcView) лицензия, вы можете открыть табличное представление, щелкнуть правой кнопкой мыши столбец и выбрать Суммировать.


Благодарю. Это сработало, но тогда я не смог скопировать список из окна!
Стив


1

Если ваши данные находятся в SDE (ядро пространственной базы данных), вы можете использовать Python и ArcSDESQLExecute объект 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 для него из этого же сценария. Для большой таблицы это может быть чуть-чуть быстрее, чем создание собственного списка построителей - не знаю.

Как бы вы это ни делали, это все еще действительно раздражающая «особенность» ArcGIS.


0

Как насчет использования distinctв подзапросе (ниже приведен класс объектов FGDB):

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

Обратите внимание из справки (10.0), что это имеет ограничения:

Покрытия, шейп-файлы и другие файловые источники данных не из базы геоданных не поддерживают подзапросы.


2
«DISTINCT» работает только с Personal GDB, а не с File GDB.
Якуб Сисак GeoGraphics

0

Как предполагает Джастин. Я обычно делаю сводку по нужному полю, затем делаю выборочный отчет в dbf, выполняю небольшой расчет, чтобы классифицировать каждое отдельное значение, а затем присоединяю его к оригиналу.
Это долгий путь, и вы должны фенагель с вашими любимыми методами отсчета. но ...
Что бы ни делали работу.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.