Esporta tutti i domini di valori codificati da un geodatabase


11

Nella mailing list ESRI-L questa mattina c'era una domanda su come vedere o esportare tutti i domini di valori codificati per un geodatabase. L'obiettivo è presentare il contenuto dei domini in forma tabellare, in modo che siano facili da leggere.

Lo strumento DomainToTable lo fa facilmente per un singolo dominio, ma quando ci sono molti domini diventa rapidamente noioso. Il miglior consiglio che potevo dare era alla funzione di elaborazione batch , ma anche questo richiede di conoscere o cercare i nomi dei domini individualmente.

Sicuramente c'è un modo migliore?


1
Probabilmente puoi adattare questo codice (vedi il post di Chris Snyder) per ottenere quello che vuoi: forums.arcgis.com/threads/…
blah238

Tutti i domini sono elencati nel campo "DomainName" della tabella GDB_Domains. Puoi facilmente passare in rassegna i nomi e inserirli nello strumento di geoprocessing DomainToTable attraverso un semplice codice. È inoltre necessario prestare attenzione ai sottotipi poiché ogni sottotipo può potenzialmente avere il proprio dominio.
Brent Edwards,

@BrentEdwards, dove vedi una GDB_Domainstabella? Ho aperto un personal-gdb con domini in Access e non c'è. L'ho trovato GDB_Itemscon un Definitioncampo che sembra contenere i domini, ma sono sepolti in XML.
matt wilkie,

Stai usando ArcGIS 10? GDB_Domains esisteva solo in 9.3 e precedenti. Vedi: blogs.esri.com/esri/arcgis/2010/03/15/…
blah238

grazie per quella pagina @ blah238. Non lo sapevo (e sì, sto usando la v10)
matt wilkie,

Risposte:


12

Ecco qualcosa che ho messo insieme che funziona sui semplici gdb che ho a portata di mano. Non so come potrebbe o meno gestire i sottotipi con più domini (vedi il commento di Brent).

Uso:

python export_gdb_domains.py [input geodatabase]

Esporta le tabelle nello stesso gdb da cui sta ottenendo i domini. Non funzionerà se le tabelle esistono già.

''' 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', '#')

Versione aggiornata su github all'indirizzo https://github.com/envygeo/arcplus/blob/master/ArcToolbox/Scripts/export_gdb_domains.py . Facoltativamente scrive su XLS e sovrascrive le tabelle esistenti.

risorse:


Storia

Inizialmente ho provato a utilizzare una directory di output e file .csv per i risultati, ma ho continuato a ottenere "ERRORE 000142: il nome del campo nella tabella dBASE non può essere più lungo di 10 caratteri" . Sembra interpretare sempre il percorso come parte del nome della tabella (cf table = line) {shrug}.

[Più tardi]: @ dgj32784 ha trovato la causa, 'description'a 11 caratteri è troppo lungo.


Ho scoperto che l'esportazione CSV in geoprocessing è essenzialmente inesistente, sebbene sia possibile farlo in modo interattivo attraverso la finestra di dialogo Esporta dati in ArcMap. Di solito uso solo il csvmodulo Python .
blah238,

1
Per l'esportazione CSV, vedere la domanda correlata: gis.stackexchange.com/questions/26227/…
blah238

4

Ecco del codice che esporta tutti i domini in file Excel. Inoltre, viene visualizzato l'errore quando si tenta di esportare in DBF perché la parola "descrizione" è lunga 11 caratteri.

''' 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 di stampa fisso (riga 20)


grazie per la correzione di bug "descrizione"! L'ho aggiunto alla mia sceneggiatura
Matt Wilson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.