Selecione valores distintos em uma única coluna de uma tabela de atributos (ou camada)

16

Existe uma maneira de selecionar valores distintos de uma coluna no ArcMap? Eu tenho os dados nos formatos GDB e SHP. Eu procurei maneiras de selecionar usando SQL, QueryLayers, ModelBuilder e caixas de ferramentas individuais e ele aparece como todas as opções de seleção sempre SELECT * FROM tableName WHERE ...

No SQL, eu escreveria SELECT DISTINCT columnName FROM tableName.

Steve
fonte

Respostas:

17

Ou você pode executar a ferramenta ArcToolBox Frequency (Ferramentas de análise >> Estatísticas >> Frequency), que exibirá uma tabela com valores exclusivos e uma contagem de quantas vezes elas aparecem.

Ou você pode escrever um script python que obtém um SearchCursor em um campo e criar uma lista de todos os valores do formulário

if value not in myList:
    myList.append(value)
Justin
fonte
3
Se você não possui uma licença ArcInfo, use esta caixa de ferramentas (testada apenas em shapefiles) resources.arcgis.com/gallery/file/geoprocessing/…
3
É incrível quantas funções que antes exigiam uma função ArcInfo agora podem ser implementadas usando alguns códigos / módulos Python bastante simples. É ótimo!
precisa saber é o seguinte
Obrigado Dan, que fez o truque. Minha licença não suporta a caixa de ferramentas Frequência.
Steve Steve
12

Use uma compreensão da lista 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)]) 

Para conjuntos de dados grandes, um método eficiente de memória seria usar uma expressão de gerador .

myList = set((row.getValue(fldName) for row in arcpy.SearchCursor(fcName,fields=fldName))
tharen
fonte
1
Desde que você está interessado apenas em um campo, para o desempenho melhor gostaria de especificar o opcional fieldsargumento, por exemplomyList = set([row.getValue(fldName) for row in arcpy.SearchCursor(fcName, fields=fldName)])
blah238
Boa ideia. Eu ficaria curioso para testar a diferença de desempenho. Para fontes de dados SDE, é provavelmente significativo, mas para arquivos de forma e bancos de dados de arquivos geográficos ficaria surpreso se fosse apreciável.
tharen
Isso é ótimo. Eu tinha um link que mostrava isso muito bem, mas que quebrou um dia. Espero que tenha isso por um bom tempo.
Justin Justin
4

Se seus dados estiverem no formato PGDB, você poderá fazer o seguinte nas caixas de diálogo do construtor de consultas (consulta de definição, selecionar por atributos, expressões da caixa de ferramentas etc.) usando uma subconsulta:

SELECT * FROM tableName ONDE ...

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)

Isso retornará os registros para os quais os valores em column_to_test_for_unique_values ​​são únicos.

Brent Edwards
fonte
1
Você também pode usar o DISTINCT sobre o geodatabase pessoal.
Jakub Sisak GeoGraphics
4

Se você tiver apenas uma licença básica (anteriormente denominada ArcView), poderá abrir a visualização Tabela, clicar com o botão direito do mouse em uma coluna e selecionar Resumir.

klewis
fonte
Obrigado. Isso funcionou, mas não consegui copiar a lista pela janela!
Steve Steve
1

Se seus dados estiverem em um SDE (mecanismo de banco de dados espacial), é possível usar o objeto ArcSDESQLExecute do python e do arcpy. Pode-se passar sql complexo usando esse "método".

# 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)
cadela
fonte
0

Ou use seu script Python para exportar para CSV e, em seguida, use a API Python de outro banco de dados (digamos SpatiaLite) para ler o csv e fazer uma consulta SQL apropriada nele a partir do mesmo script. Para uma tabela grande, isso pode ser um pouco mais rápido do que lançar seu próprio construtor de listas - não sei.

Seja como for, este ainda é um "recurso" realmente irritante do ArcGIS.

MappaGnosis
fonte
0

Que tal usar a distinctem uma subconsulta (a seguir está em uma classe de recurso do FGDB):

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

Observe na ajuda (10.0) que isso tem limitações:

Coberturas, shapefiles e outras fontes de dados baseadas em arquivos que não são do banco de dados não suportam subconsultas.

Chad Cooper
fonte
2
"DISTINCT" funciona apenas com o GDB pessoal e não com o arquivo GDB.
Jakub Sisak GeoGraphics
0

Como Justin sugere. Normalmente faço um resumo no campo que desejo e, em seguida, faça uma seleção distinta no dbf, execute um pequeno cálculo para categorizar cada valor distinto e depois junte-o novamente ao original.
É o caminho mais longo, e você precisa usar os métodos de caclulação favoritos. mas ... O que
quer que faça o trabalho.

Brad Nesom
fonte