Exportar todos os domínios de valor codificado de um geodatabase

11

Na lista de discussão ESRI-L desta manhã, havia uma pergunta sobre como ver ou exportar todos os domínios de valor codificado para um geodatabase. O objetivo é apresentar o conteúdo dos domínios em forma de tabela, para facilitar a leitura.

A ferramenta DomainToTable faz isso facilmente em um único domínio, mas quando há muitos domínios, ela se torna rapidamente cansativa. O melhor conselho que eu poderia dar foi sobre o recurso de processamento em lote , mas mesmo isso requer conhecer ou procurar os nomes dos domínios individualmente.

Certamente há uma maneira melhor?

Matt Wilson
fonte
1
Provavelmente pode adaptar este código (ver post de Chris Snyder) para obter o que você quer: forums.arcgis.com/threads/...
blah238
Todos os domínios estão listados no campo "DomainName" da tabela GDB_Domains. Você poderia facilmente fazer um loop sobre os nomes e alimentá-los na ferramenta de geoprocessamento DomainToTable por meio de código simples. Você também precisa ter cuidado com os SubTipos, pois cada Subtipo pode ter seu próprio domínio.
Brent Edwards
@BrentEdwards, onde você vê uma GDB_Domainsmesa? Abri um GDB pessoal com domínios no Access e ele não está lá. Eu encontrei GDB_Itemscom um Definitioncampo que parece conter os domínios, mas eles estão enterrados em XML.
27512
Você está usando o ArcGIS 10? GDB_Domains existia apenas na 9.3 e versões anteriores. Veja: blogs.esri.com/esri/arcgis/2010/03/15/…
blah238
obrigado por essa página @ blah238. Eu não sabia sobre isso (e sim, eu estou usando v10)
wilkie mate

Respostas:

12

Aqui está algo que eu montei que funciona com os simples gdbs que tenho em mãos. Não sei como ele pode ou não lidar com subtipos com vários domínios (veja o comentário de Brent).

Uso:

python export_gdb_domains.py [input geodatabase]

Ele exporta as tabelas para o mesmo gdb do qual está recebendo os domínios. Ele falhará se as tabelas já existirem.

''' Export all coded value domains in a geodatabase to tables in that gdb '''
import os, sys
import arcpy

gdb = sys.argv[0]

desc = arcpy.Describe(gdb)
domains = desc.domains

for domain in domains:
    print 'Exporting %s CV to table in %s' % (domain, gdb)
    table = os.path.join(gdb, domain)
    arcpy.DomainToTable_management(gdb, domain, table,
        'field','descript', '#')

Versão atualizada no github em https://github.com/envygeo/arcplus/blob/master/ArcToolbox/Scripts/export_gdb_domains.py . Opcionalmente, grava no XLS e substitui as tabelas existentes.

Recursos:


História

Inicialmente, tentei usar um diretório de saída e arquivos .csv para os resultados, mas continuei recebendo "ERRO 000142: O nome do campo na tabela do dBASE não pode ter mais que 10 caracteres" . Parece sempre interpretar o caminho como parte do nome da tabela ( table = linha de cf ) {encolher de ombros}.

[Mais tarde]: @ dgj32784 encontrou a causa, 'description'com 11 caracteres é muito longo.

Matt Wilson
fonte
Descobri que a exportação de CSV no geoprocessamento é essencialmente inexistente, embora você possa fazer isso de maneira interativa através da caixa de diálogo Exportar Dados no ArcMap. Eu normalmente apenas uso o csvmódulo Python .
Blah238 25/05
1
Na exportação de CSV, consulte a pergunta relacionada: gis.stackexchange.com/questions/26227/…
blah238
4

Aqui está um código que exporta todos os domínios para arquivos do Excel. Além disso, você está recebendo o erro ao tentar exportar para DBF porque a palavra "descrição" possui 11 caracteres.

''' Export all coded value domains in a geodatabase to Excel files in the same directory '''
import os, sys
import arcpy

## Ideal when testing so you don't keep getting errors
arcpy.env.overwriteOutput = True

## Specify the File Geodatabase workspace
gdb = sys.argv[0]

## Get a list of domains
desc = arcpy.Describe(gdb)
domains = desc.domains

## Loop over the list of domains
for domain in domains:
    ## Create an object that represents the name of the Excel file to be created
    table_name = domain + '.xls'
    ## Let the user know what is happening
    print('Exporting {0} domain to table {1}'.format(domain, table_name))
    ## Create an object that represents the full path of the Excel file to be created
    table_full_path = os.path.join(os.path.dirname(gdb), table_name)
    ## Create an in memory object for the DBF to temporarily store the domains (since this is the default file type)
    in_memory_dbf = "in_memory" + "\\" + domain + ".dbf"
    ## Export the domain to the temporary in memory table
    ## NOTE: Cannot use "description," that is longer than 10 characters
    arcpy.DomainToTable_management(gdb, domain, in_memory_dbf, 'field', 'desc', '#')
    ## Convert the in memory table to an Excel stored on disc
    arcpy.TableToExcel_conversion(in_memory_dbf, table_full_path)
    ## Clear the memory so ArcGIS doesn't pitch a fit
    arcpy.Delete_management("in_memory")

EDIT: formato de impressão fixo (linha 20)

dgj32784
fonte
obrigado pela correção de bug 'description'! Eu o adicionei ao meu script
matt wilkie