Exporter tous les domaines de valeurs codées à partir d'une géodatabase

11

Sur la liste de diffusion ESRI-L ce matin, il y avait une question sur la façon de voir ou d'exporter tous les domaines de valeurs codées pour une géodatabase. L'objectif est de présenter le contenu des domaines sous forme de tableau, afin qu'ils soient faciles à lire.

L' outil DomainToTable le fait facilement pour un seul domaine, mais lorsqu'il existe de nombreux domaines, il devient rapidement fastidieux. Le meilleur conseil que je pouvais donner était la fonctionnalité de traitement par lots , mais même cela nécessite de connaître ou de rechercher individuellement les noms de domaines.

Il y a sûrement une meilleure façon?

Matt Wilkie
la source
1
Peut probablement adapter ce code (voir l'article de Chris Snyder) pour obtenir ce que vous voulez: forums.arcgis.com/threads/…
blah238
Tous les domaines sont répertoriés dans le champ "DomainName" de la table GDB_Domains. Vous pouvez facilement parcourir les noms et les insérer dans l'outil de géotraitement DomainToTable via un code simple. Vous devez également être prudent avec les sous-types car chaque sous-type peut potentiellement avoir son propre domaine.
Brent Edwards,
@BrentEdwards, où voyez-vous une GDB_Domainstable? J'ai ouvert une gdb personnelle avec des domaines dans Access et elle n'y est pas. J'ai trouvé GDB_Itemsun Definitionchamp qui semble contenir les domaines, mais ils sont enterrés en XML.
matt wilkie
Utilisez-vous ArcGIS 10? GDB_Domains n'existait que dans 9.3 et versions antérieures. Voir: blogs.esri.com/esri/arcgis/2010/03/15/…
blah238
merci pour cette page @ blah238. Je ne savais pas à ce sujet (et oui j'utilise la v10)
Matt Wilkie

Réponses:

12

Voici quelque chose que j'ai mis en place qui fonctionne sur les simples gdb que j'ai sous la main. Je ne sais pas comment il pourrait ou non gérer les sous-types avec plusieurs domaines (voir le commentaire de Brent).

Usage:

python export_gdb_domains.py [input geodatabase]

Il exporte les tables vers la même gdb dont il obtient les domaines. Il échouera si la ou les tables existent déjà.

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

Version mise à jour sur github à https://github.com/envygeo/arcplus/blob/master/ArcToolbox/Scripts/export_gdb_domains.py . Écrit éventuellement sur XLS et écrase les tables existantes.

Ressources:


Histoire

Au départ, j'ai essayé d'utiliser un répertoire de sortie et des fichiers .csv pour les résultats, mais j'ai continué à obtenir "ERREUR 000142: Le nom du champ dans la table dBASE ne peut pas dépasser 10 caractères" . Il semble toujours interpréter le chemin comme faisant partie du nom de la table (cf table = ligne) {haussement d'épaules}.

[Plus tard]: @ dgj32784 a trouvé la cause, 'description'à 11 caractères, c'est trop long.

Matt Wilkie
la source
J'ai constaté que l'exportation CSV dans le géotraitement est essentiellement inexistante, bien que vous puissiez le faire de manière interactive via la boîte de dialogue Exporter les données dans ArcMap. J'utilise généralement le csvmodule Python .
blah238
1
Sur l'exportation CSV, voir la question connexe: gis.stackexchange.com/questions/26227/…
blah238
4

Voici du code qui exporte tous les domaines vers des fichiers Excel. En outre, vous obtenez l'erreur lorsque vous essayez d'exporter vers DBF car le mot "description" comporte 11 caractères.

''' 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: format d'impression fixe (ligne 20)

dgj32784
la source
merci pour la correction du bug 'description'! Je l'ai ajouté à mon script
matt wilkie