Страница 1 из 1
Копирование значений домена в новое поле заместо кода.
Добавлено: 14 ноя 2014, 12:12
JlEC
Здравствуйте. Вот возник такой вопрос.
Имеется база данных, у неё есть домен код-значение. Так же в ней лежит полигональный класс объектов, в котором очень много полигонов, а так же имеется поле KOD(числовое) в котором указаны коды. Нужно получить шейп, в котором бы было поле со значениями, а не кодами.
В самой базе работается просто, полю код задаётся домен и я вижу значения заместо кодов (например "Дом" заместо 000001 "дерево" заместо 000002 и т. п.". Но шейпу домен не задашь и при экспорте в него значения снова станут кодом.
Я создаю новое текстовое поле и хочу при помощи калькулятора поля скопировать туда именно значения, а ни код. Существует ли в арке какая нибудь ф-ция для калькулятора или какой другой инструмент, чтобы это реализовать?
Re: Копирование значений домена в новое поле заместо кода.
Добавлено: 14 ноя 2014, 12:28
giser
Первое, что пришло в голову:
- сделать "Домен в таблицу";
- сделать соединение основной таблицы и полученной по полю числового кода;
- дальше можно и калькулятором.
Re: Копирование значений домена в новое поле заместо кода.
Добавлено: 14 ноя 2014, 12:37
JlEC
Не ну выкинуть домен в таблицу, создать шейп, соединить по полю код, а потом экпортировать, после удалить ненужные поля и отдать заказчику... Я так и делал, но это геморно ( Вот я и подумал, может есть способ проще?
Вот у меня щас 14 баз, в каждой по слою и 11-и доменам. В слое соответственно 11 полей. Это очень муторно способом описанным выше химичить для каждого поля

По времени долго выходит.
В идеале я пытался найти выражение (или функцию) на питоне или VB для калькулятора, чтобы он в новое поле не значение поля копировал (код), а значение поля из домена. Это бы кучу времени сыкономило, но пока ничего не нашел.
Re: Копирование значений домена в новое поле заместо кода.
Добавлено: 14 ноя 2014, 15:34
Ariki
Код: Выделить всё
# -*- coding: utf-8 -*-
import gc, os, sys, arcpy
script, gdb, table, srcfield, tgtfield = sys.argv
table_path = os.path.join(gdb, table)
fields = arcpy.ListFields(table_path)
for field in fields:
if field.name.lower() == srcfield.lower():
srcdomain = field.domain
break
else:
print >> sys.stderr, 'Field {0} not found'.format(srcfield)
sys.exit(1)
if not srcdomain:
print >> sys.stderr, 'Field {0} has no domain constraint'.format(srcfield)
sys.exit(1)
domains = arcpy.da.ListDomains(gdb)
for domain in domains:
if domain.name == srcdomain:
values = domain.codedValues
break
else:
print >> sys.stderr, 'Domain {0} not found'.format(srcdomain)
sys.exit(1)
if not values:
print >> sys.stderr, 'Domain {0} has no coded values'.format(srcdomain)
sys.exit(1)
cursor = arcpy.UpdateCursor(table_path)
try:
for row in cursor:
old_value = row.getValue(srcfield)
row.setValue(tgtfield, values.get(old_value, unicode(old_value)))
cursor.updateRow(row)
except Exception as ex:
print >> sys.stderr, ex
finally:
row, cursor = None, None
gc.collect()
Сохраняете код в файл с расширением .py (например, domain_values.py), делаете копию БД (чтобы ничего не испортить) и запускаете из командной строки Windows с такими параметрами:
Код: Выделить всё
domain_values.py "C:\path\to.gdb" table_name source_field_name target_field_name
Надеюсь, у вас нет кириллицы в пути к базе и именах таблиц и полей. Иначе могут возникнуть сложности.
Re: Копирование значений домена в новое поле заместо кода.
Добавлено: 14 ноя 2014, 15:55
giser
Нашел стандартное средство. Вам нужно делать экспорт из базы геоданных в шейп с помощью инструмента "Класс объектов в класс объектов" (Feature Class To Feature Class). При этом, в настройках параметров среды инструмента нужно поставить галочку в опции "Перенос описаний домена поля (Transfer Field Domain Descriptions)". Добавится дополнительное поле с описаниями кодированных значений.
PS. Для последних версий ArcGIS (10.1 и 10.2 точно)
Re: Копирование значений домена в новое поле заместо кода.
Добавлено: 14 ноя 2014, 16:42
JlEC
giser писал(а):Нашел стандартное средство. Вам нужно делать экспорт из базы геоданных в шейп с помощью инструмента "Класс объектов в класс объектов" (Feature Class To Class).
Пасибо ограмное. Вот чуял что стандартное средство должно быть, тока как я справку не мучал он мне всё выдавал "экспорт домена в таблицу", что совсем не то.
Кстате этот же инструмент он использует если в арккаталоге нажать по слою и выбрать экспорт в шейп, я им пытался значения получить и не получилось, только не догадался в параметрах инструмента потыкаться

Re: Копирование значений домена в новое поле заместо кода.
Добавлено: 14 ноя 2014, 16:53
giser
Да, вот такая тонкость. Сам не знал. Интересный вопрос, поэтому хотелось разобраться.
JlEC писал(а):Пасибо ограмное. Вот чуял что стандартное средство должно быть, тока как я справку не мучал он мне всё выдавал "экспорт домена в таблицу", что совсем не то.
Я не люблю изобретать велосипед
