Экспортировать все домены с закодированными значениями из базы геоданных

11

Сегодня утром в списке рассылки ESRI-L возник вопрос о том, как просмотреть или экспортировать все домены кодированных значений для базы геоданных. Цель состоит в том, чтобы представить содержимое доменов в виде таблицы, чтобы их было легко читать.

Инструмент DomainToTable делает это легко для одного домена, но когда доменов много, он быстро становится утомительным. Лучший совет, который я мог бы дать, - это функция пакетной обработки , но даже это требует знания или поиска имен доменов по отдельности.

Конечно, есть лучший способ?

Мэтт Уилки
источник
1
Вероятно, можно адаптировать этот код (см. Сообщение Криса Снайдера), чтобы получить то, что вы хотите: forums.arcgis.com/threads/…
blah238
Все домены перечислены в поле «DomainName» таблицы GDB_Domains. Вы можете легко зацикливать имена и передавать их в инструмент геообработки DomainToTable с помощью простого кода. Вы также должны быть осторожны с подтипами, поскольку каждый подтип потенциально может иметь свой собственный домен.
Брент Эдвардс
@BrentEdwards, где ты видишь GDB_Domainsстол? Я открыл персональный GDB с доменами в Access, а его там нет. Я нашел GDB_Itemsс Definitionполем, которое, кажется, содержит домены, но они похоронены в XML.
Мэтт Вилки
Вы используете ArcGIS 10? GDB_Domains существовал только в 9.3 и ранее. Смотрите: blogs.esri.com/esri/arcgis/2010/03/15/…
blah238
спасибо за эту страницу @ blah238. Я не знал об этом (и да, я использую v10)
Мэтт Уилки

Ответы:

12

Вот кое-что, что я собрал, которое работает на простых GDB, которые у меня есть под рукой. Я не знаю, как он может или не может обрабатывать подтипы с несколькими доменами (см. Комментарий Брента).

Применение:

python export_gdb_domains.py [input geodatabase]

Он экспортирует таблицы в тот же GDB, откуда он получает домены. Он потерпит неудачу, если таблицы уже существуют.

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

Обновленная версия на github: https://github.com/envygeo/arcplus/blob/master/ArcToolbox/Scripts/export_gdb_domains.py . При желании пишет в XLS и перезаписывает существующие таблицы.

Ресурсы:


история

Сначала я пытался использовать каталог результатов и файлы .csv для результатов, но получал сообщение «ОШИБКА 000142: имя поля в таблице dBASE не может быть длиннее 10 символов» . Кажется, он всегда интерпретирует путь как часть имени таблицы (cf table = line) {shrug}.

[Позже]: @ dgj32784 нашел причину, 'description'в 11 символов это слишком долго.

Мэтт Уилки
источник
Я обнаружил, что CSV-экспорт в геообработке практически отсутствует, хотя вы можете сделать это в интерактивном режиме через диалоговое окно «Экспорт данных» в ArcMap. Я обычно просто использую csvмодуль Python .
blah238
1
Об экспорте в CSV см. Связанный вопрос: gis.stackexchange.com/questions/26227/…
blah238
4

Вот некоторый код, который экспортирует все домены в файлы Excel. Кроме того, вы получаете сообщение об ошибке при попытке экспорта в DBF, поскольку слово «описание» имеет длину 11 символов.

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

РЕДАКТИРОВАТЬ: фиксированный формат печати (строка 20)

dgj32784
источник
спасибо за исправление ошибки "описание"! Я добавил его в свой сценарий
Мэтт Вилки