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.

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)

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

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.


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


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)

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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.