Копирование значений домена в новое поле заместо кода.
-
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 21 фев 2012, 19:46
- Репутация: 0
Копирование значений домена в новое поле заместо кода.
Здравствуйте. Вот возник такой вопрос.
Имеется база данных, у неё есть домен код-значение. Так же в ней лежит полигональный класс объектов, в котором очень много полигонов, а так же имеется поле KOD(числовое) в котором указаны коды. Нужно получить шейп, в котором бы было поле со значениями, а не кодами.
В самой базе работается просто, полю код задаётся домен и я вижу значения заместо кодов (например "Дом" заместо 000001 "дерево" заместо 000002 и т. п.". Но шейпу домен не задашь и при экспорте в него значения снова станут кодом.
Я создаю новое текстовое поле и хочу при помощи калькулятора поля скопировать туда именно значения, а ни код. Существует ли в арке какая нибудь ф-ция для калькулятора или какой другой инструмент, чтобы это реализовать?
Имеется база данных, у неё есть домен код-значение. Так же в ней лежит полигональный класс объектов, в котором очень много полигонов, а так же имеется поле KOD(числовое) в котором указаны коды. Нужно получить шейп, в котором бы было поле со значениями, а не кодами.
В самой базе работается просто, полю код задаётся домен и я вижу значения заместо кодов (например "Дом" заместо 000001 "дерево" заместо 000002 и т. п.". Но шейпу домен не задашь и при экспорте в него значения снова станут кодом.
Я создаю новое текстовое поле и хочу при помощи калькулятора поля скопировать туда именно значения, а ни код. Существует ли в арке какая нибудь ф-ция для калькулятора или какой другой инструмент, чтобы это реализовать?
-
- Завсегдатай
- Сообщения: 388
- Зарегистрирован: 09 ноя 2012, 09:25
- Репутация: 113
- Откуда: Москва
Re: Копирование значений домена в новое поле заместо кода.
Первое, что пришло в голову:
- сделать "Домен в таблицу";
- сделать соединение основной таблицы и полученной по полю числового кода;
- дальше можно и калькулятором.
- сделать "Домен в таблицу";
- сделать соединение основной таблицы и полученной по полю числового кода;
- дальше можно и калькулятором.
-
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 21 фев 2012, 19:46
- Репутация: 0
Re: Копирование значений домена в новое поле заместо кода.
Не ну выкинуть домен в таблицу, создать шейп, соединить по полю код, а потом экпортировать, после удалить ненужные поля и отдать заказчику... Я так и делал, но это геморно ( Вот я и подумал, может есть способ проще?
Вот у меня щас 14 баз, в каждой по слою и 11-и доменам. В слое соответственно 11 полей. Это очень муторно способом описанным выше химичить для каждого поля
По времени долго выходит.
В идеале я пытался найти выражение (или функцию) на питоне или VB для калькулятора, чтобы он в новое поле не значение поля копировал (код), а значение поля из домена. Это бы кучу времени сыкономило, но пока ничего не нашел.
Вот у меня щас 14 баз, в каждой по слою и 11-и доменам. В слое соответственно 11 полей. Это очень муторно способом описанным выше химичить для каждого поля

В идеале я пытался найти выражение (или функцию) на питоне или VB для калькулятора, чтобы он в новое поле не значение поля копировал (код), а значение поля из домена. Это бы кучу времени сыкономило, но пока ничего не нашел.
-
- Гуру
- Сообщения: 731
- Зарегистрирован: 12 янв 2011, 22:40
- Репутация: 304
- Ваше звание: ∀
Re: Копирование значений домена в новое поле заместо кода.
Спойлер
Код: Выделить всё
# -*- 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()
Код: Выделить всё
domain_values.py "C:\path\to.gdb" table_name source_field_name target_field_name
-
- Завсегдатай
- Сообщения: 388
- Зарегистрирован: 09 ноя 2012, 09:25
- Репутация: 113
- Откуда: Москва
Re: Копирование значений домена в новое поле заместо кода.
Нашел стандартное средство. Вам нужно делать экспорт из базы геоданных в шейп с помощью инструмента "Класс объектов в класс объектов" (Feature Class To Feature Class). При этом, в настройках параметров среды инструмента нужно поставить галочку в опции "Перенос описаний домена поля (Transfer Field Domain Descriptions)". Добавится дополнительное поле с описаниями кодированных значений.
PS. Для последних версий ArcGIS (10.1 и 10.2 точно)
PS. Для последних версий ArcGIS (10.1 и 10.2 точно)
Последний раз редактировалось giser 14 ноя 2014, 17:04, всего редактировалось 1 раз.
-
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 21 фев 2012, 19:46
- Репутация: 0
Re: Копирование значений домена в новое поле заместо кода.
Пасибо ограмное. Вот чуял что стандартное средство должно быть, тока как я справку не мучал он мне всё выдавал "экспорт домена в таблицу", что совсем не то.giser писал(а):Нашел стандартное средство. Вам нужно делать экспорт из базы геоданных в шейп с помощью инструмента "Класс объектов в класс объектов" (Feature Class To Class).
Кстате этот же инструмент он использует если в арккаталоге нажать по слою и выбрать экспорт в шейп, я им пытался значения получить и не получилось, только не догадался в параметрах инструмента потыкаться

-
- Завсегдатай
- Сообщения: 388
- Зарегистрирован: 09 ноя 2012, 09:25
- Репутация: 113
- Откуда: Москва
Re: Копирование значений домена в новое поле заместо кода.
Да, вот такая тонкость. Сам не знал. Интересный вопрос, поэтому хотелось разобраться.

Я не люблю изобретать велосипедJlEC писал(а):Пасибо ограмное. Вот чуял что стандартное средство должно быть, тока как я справку не мучал он мне всё выдавал "экспорт домена в таблицу", что совсем не то.

Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя