Написать обработчик
-
- Гуру
- Сообщения: 879
- Зарегистрирован: 17 июн 2010, 23:14
- Репутация: 207
- Откуда: Москва
Написать обработчик
Эта тема является локальным добавлением к этой теме. После импорта kml/kmz через Data Interoperability - Import с указанием доп. параметров на импорт kml_description можно получить что-то подобное
поле kml_description, символьное, в .gdb в длину составляет 2048 знаков, что впринципе мне с лихвой хватает и умещает description даже самой максимальной длины, которой он будет.
Далее мне необходимо выявить наименования колонок (objectid, номер, код и т.д.), создать соответствующие поля, а потом ещё найти value этих колонок и занести. Вопрос - в чём данную операцию можно выполнить проще всего ? Полей у меня разное количество, имена и значения уникальны. Возможно ли создать такую модель в modelbuilder ? Или запрограммировать на VBA (питоном не владею) ?
поле kml_description, символьное, в .gdb в длину составляет 2048 знаков, что впринципе мне с лихвой хватает и умещает description даже самой максимальной длины, которой он будет.
Далее мне необходимо выявить наименования колонок (objectid, номер, код и т.д.), создать соответствующие поля, а потом ещё найти value этих колонок и занести. Вопрос - в чём данную операцию можно выполнить проще всего ? Полей у меня разное количество, имена и значения уникальны. Возможно ли создать такую модель в modelbuilder ? Или запрограммировать на VBA (питоном не владею) ?
-
- Гуру
- Сообщения: 879
- Зарегистрирован: 17 июн 2010, 23:14
- Репутация: 207
- Откуда: Москва
Re: Написать обработчик
Никто для арки ничего и никогда не писал?
Не верю (с).
Не верю (с).
-
- Завсегдатай
- Сообщения: 406
- Зарегистрирован: 14 авг 2006, 16:21
- Репутация: 25
Re: Написать обработчик
Я делаю так: исходник беру в KMZ и JSON.
Далее JSON в Access.
Написал функцию, которая встречает, например, первый OBJECTID и присваевает ему 1, а также присваевает 1 всем плоям до следующего OBJECTID.
Далее присваевает каждому полю значение от 1 до ..., например, 15.
Потом перекрестный запрос, разворачивает все в столбики.
Удаляем не нужные символы.
Потом можно подключать к графике.
Как это сделать в Арке - я не знаю.
Далее JSON в Access.
Написал функцию, которая встречает, например, первый OBJECTID и присваевает ему 1, а также присваевает 1 всем плоям до следующего OBJECTID.
Далее присваевает каждому полю значение от 1 до ..., например, 15.
Потом перекрестный запрос, разворачивает все в столбики.
Удаляем не нужные символы.
Потом можно подключать к графике.
Как это сделать в Арке - я не знаю.
-
- Гуру
- Сообщения: 879
- Зарегистрирован: 17 июн 2010, 23:14
- Репутация: 207
- Откуда: Москва
Re: Написать обработчик
Спасибо за опыт, покурю данную методику.
Неужто никто даже в моделбилдере ничем подобным не занимался?
Неужто никто даже в моделбилдере ничем подобным не занимался?
-
- Активный участник
- Сообщения: 163
- Зарегистрирован: 28 июн 2012, 01:02
- Репутация: 84
- Откуда: Vladivostok
Re: Написать обработчик
В modelbuilder нет инструментов для обработки html в значении поля. Да и вариантов такой обработки может быть великое множество. Трудно создать стандартное средство, которое бы удовлетворяло всех.
Для ArcGIS 10.x геообработку прийдется писать на python. ESRI от VBA отказывается. Возможно, не лишним будет его начать учить.
С некоторым упрощением и допущениями вашу задачу можно решить таком скриптом:
По крайней мере для примера ваших данных из первой темы рабтает. Скармливаем ему класс, который получили после импорта kmz/kml файла средствами ArcGIS.
Для ArcGIS 10.x геообработку прийдется писать на python. ESRI от VBA отказывается. Возможно, не лишним будет его начать учить.
С некоторым упрощением и допущениями вашу задачу можно решить таком скриптом:
Код: Выделить всё
# coding: utf-8
from HTMLParser import HTMLParser
import arcpy
# реализация для парсера html
# полагаем, что в описании kml всегда таблица
# тогда просто собираем значения из ячеек таблицы в список
class MyHTMLParser(HTMLParser):
def html2list(self, data):
self.tmp = []
self.feed(data)
return self.tmp
def handle_data(self, data):
self.tmp.append(data)
# экземпляр парсера
parser = MyHTMLParser()
# входной класс объектов в нем же и будем добавлять поля
fc = u'Гидротехн_t.gdb\\Placemarks\\Points'
# путь можно брать из параметра, если добавить скрипт в toolbox
# fc = arcpy.GetParameterAsText(0)
# поле с описанием kml
in_field = u'PopupInfo'
# собираем описания kml из поля входного класса
in_data = []
with arcpy.da.SearchCursor(fc, in_field) as s_cur:
for row in s_cur:
in_data.append(row[0])
# обрабатываем эти описания
fields_order = []
fields_values = []
for data in in_data:
# парсим html и выкидываем заголовки таблицы и колонку OBJECTID
par = parser.html2list(data)[4:]
# предположим, что пустых значений в таблице описаний не было
# тогда каждый четный элемент это заголовок поля
fields_order.append([par for i in range(0, len(par), 2)])
# а каждый нечетный это значение поля, запишем их соответственно в словарь
fields_values.append({par: par[i+1] for i in range(0, len(par), 2)})
# пусть в рамках одного слоя количество колонок в описании одинаково для каждого
# объекта, иначе нужно написать обработку для составления корректного списка
# полей. Так же примем, что все поля будут текстовые
fields = fields_order[0]
for field in fields:
# посчитаем длину поля на основании самого длинного его значения
length = max([len(i[field]) for i in fields_values])
arcpy.AddField_management(fc, field, 'TEXT', 0, 0, length + 1)
# запишем значения полей
with arcpy.da.UpdateCursor(fc, fields) as u_cur:
for i, row in enumerate(u_cur):
for j, field in enumerate(fields):
row[j] = fields_values[field]
u_cur.updateRow(row)
По крайней мере для примера ваших данных из первой темы рабтает. Скармливаем ему класс, который получили после импорта kmz/kml файла средствами ArcGIS.
-
- Гуру
- Сообщения: 879
- Зарегистрирован: 17 июн 2010, 23:14
- Репутация: 207
- Откуда: Москва
Re: Написать обработчик
2doujin
Спасибо. Я попробовал скормить скрипт в Geoprocessing - Python. Получил такую ошибку:
Это ошибка в строке
Видимо некорректное имя. Сама .gdb у меня открыта.
Спасибо. Я попробовал скормить скрипт в Geoprocessing - Python. Получил такую ошибку:
Код: Выделить всё
Parsing error IndentationError: unexpected indent (line 22)
Код: Выделить всё
fc = u'Гидротехн_t.gdb\\Placemarks\\Points'
-
- Активный участник
- Сообщения: 163
- Зарегистрирован: 28 июн 2012, 01:02
- Репутация: 84
- Откуда: Vladivostok
Re: Написать обработчик
Из командной строки он относительной ссылкой на класс воспользоваться не сможет. Да и вообще такой обширный код я бы не стал туда вставлять.
Откройте Python IDLE, в Пуск-Программы рядом с ArcGIS'ом должен быть. В нем выберите File-New window. В это новое окно вставте код и сохраните файл с расширением .py Запускать будете от сюда же через F5.
Переменные fc и in_field вам нужно будет исправить самостоятельно. В первой указать полный путь до слоя, который обрабатываете. А во второй имя поля с html описанием. Судя по скрину у вас оно называется kml_description, хотя у меня ArcGIS записал все в PopupInfo.
Ну или вот готовый инструмент.
Откройте Python IDLE, в Пуск-Программы рядом с ArcGIS'ом должен быть. В нем выберите File-New window. В это новое окно вставте код и сохраните файл с расширением .py Запускать будете от сюда же через F5.
Переменные fc и in_field вам нужно будет исправить самостоятельно. В первой указать полный путь до слоя, который обрабатываете. А во второй имя поля с html описанием. Судя по скрину у вас оно называется kml_description, хотя у меня ArcGIS записал все в PopupInfo.
Ну или вот готовый инструмент.
-
- Гуру
- Сообщения: 879
- Зарегистрирован: 17 июн 2010, 23:14
- Репутация: 207
- Откуда: Москва
Re: Написать обработчик
2doujin
Гугл не даёт скачать по неизвестной причине, прикрепите готовый тулбокс к сообщению или залейте на другой хостинг, если не трудно.
Гугл не даёт скачать по неизвестной причине, прикрепите готовый тулбокс к сообщению или залейте на другой хостинг, если не трудно.
-
- Активный участник
- Сообщения: 163
- Зарегистрирован: 28 июн 2012, 01:02
- Репутация: 84
- Откуда: Vladivostok
-
- Гуру
- Сообщения: 879
- Зарегистрирован: 17 июн 2010, 23:14
- Репутация: 207
- Откуда: Москва
Re: Написать обработчик
Класс, огромное спасибо. То что нужно прям.
Ещё вопрос. Как готовый питоновский скрипт скомпилировать в тулбокс .tbx ?
Ещё вопрос. Как готовый питоновский скрипт скомпилировать в тулбокс .tbx ?
-
- Активный участник
- Сообщения: 163
- Зарегистрирован: 28 июн 2012, 01:02
- Репутация: 84
- Откуда: Vladivostok
Re: Написать обработчик
"Скомпилировать" - никак. Это совсем из другой оперы.
Его нужно просто добавить в тулбокс и настроить входные поля. Почитайте вот этот раздел справки: Добавление инструментов-скриптов.

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