Написать обработчик

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Ответить
Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Написать обработчик

Сообщение Slinger » 25 май 2013, 12:59

Эта тема является локальным добавлением к этой теме. После импорта kml/kmz через Data Interoperability - Import с указанием доп. параметров на импорт kml_description можно получить что-то подобное
image.jpg
image.jpg (91.86 КБ) 6648 просмотров
поле kml_description, символьное, в .gdb в длину составляет 2048 знаков, что впринципе мне с лихвой хватает и умещает description даже самой максимальной длины, которой он будет.

Далее мне необходимо выявить наименования колонок (objectid, номер, код и т.д.), создать соответствующие поля, а потом ещё найти value этих колонок и занести. Вопрос - в чём данную операцию можно выполнить проще всего ? Полей у меня разное количество, имена и значения уникальны. Возможно ли создать такую модель в modelbuilder ? Или запрограммировать на VBA (питоном не владею) ?

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Написать обработчик

Сообщение Slinger » 27 май 2013, 08:33

Никто для арки ничего и никогда не писал?

Не верю (с).

tsarev
Завсегдатай
Сообщения: 406
Зарегистрирован: 14 авг 2006, 16:21
Репутация: 25

Re: Написать обработчик

Сообщение tsarev » 27 май 2013, 13:56

Я делаю так: исходник беру в KMZ и JSON.
Далее JSON в Access.
Написал функцию, которая встречает, например, первый OBJECTID и присваевает ему 1, а также присваевает 1 всем плоям до следующего OBJECTID.
Далее присваевает каждому полю значение от 1 до ..., например, 15.
Потом перекрестный запрос, разворачивает все в столбики.
Удаляем не нужные символы.
Потом можно подключать к графике.

Как это сделать в Арке - я не знаю.

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Написать обработчик

Сообщение Slinger » 27 май 2013, 23:10

Спасибо за опыт, покурю данную методику.

Неужто никто даже в моделбилдере ничем подобным не занимался?

doujin
Активный участник
Сообщения: 163
Зарегистрирован: 28 июн 2012, 01:02
Репутация: 84
Откуда: Vladivostok

Re: Написать обработчик

Сообщение doujin » 28 май 2013, 03:40

В modelbuilder нет инструментов для обработки html в значении поля. Да и вариантов такой обработки может быть великое множество. Трудно создать стандартное средство, которое бы удовлетворяло всех.
Для 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.

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Написать обработчик

Сообщение Slinger » 28 май 2013, 23:43

2doujin

Спасибо. Я попробовал скормить скрипт в Geoprocessing - Python. Получил такую ошибку:

Код: Выделить всё

Parsing error IndentationError: unexpected indent (line 22)
Это ошибка в строке

Код: Выделить всё

fc = u'Гидротехн_t.gdb\\Placemarks\\Points'
Видимо некорректное имя. Сама .gdb у меня открыта.

doujin
Активный участник
Сообщения: 163
Зарегистрирован: 28 июн 2012, 01:02
Репутация: 84
Откуда: Vladivostok

Re: Написать обработчик

Сообщение doujin » 29 май 2013, 01:14

Из командной строки он относительной ссылкой на класс воспользоваться не сможет. Да и вообще такой обширный код я бы не стал туда вставлять.
Откройте Python IDLE, в Пуск-Программы рядом с ArcGIS'ом должен быть. В нем выберите File-New window. В это новое окно вставте код и сохраните файл с расширением .py Запускать будете от сюда же через F5.
Переменные fc и in_field вам нужно будет исправить самостоятельно. В первой указать полный путь до слоя, который обрабатываете. А во второй имя поля с html описанием. Судя по скрину у вас оно называется kml_description, хотя у меня ArcGIS записал все в PopupInfo.

Ну или вот готовый инструмент.

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Написать обработчик

Сообщение Slinger » 29 май 2013, 23:17

2doujin

Гугл не даёт скачать по неизвестной причине, прикрепите готовый тулбокс к сообщению или залейте на другой хостинг, если не трудно.

doujin
Активный участник
Сообщения: 163
Зарегистрирован: 28 июн 2012, 01:02
Репутация: 84
Откуда: Vladivostok

Re: Написать обработчик

Сообщение doujin » 30 май 2013, 00:39

Вот.
kmz2.zip
(2.88 КБ) 208 скачиваний

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Написать обработчик

Сообщение Slinger » 30 май 2013, 10:37

Класс, огромное спасибо. То что нужно прям.

Ещё вопрос. Как готовый питоновский скрипт скомпилировать в тулбокс .tbx ?

doujin
Активный участник
Сообщения: 163
Зарегистрирован: 28 июн 2012, 01:02
Репутация: 84
Откуда: Vladivostok

Re: Написать обработчик

Сообщение doujin » 30 май 2013, 11:47

"Скомпилировать" - никак. Это совсем из другой оперы. :) Его нужно просто добавить в тулбокс и настроить входные поля. Почитайте вот этот раздел справки: Добавление инструментов-скриптов.

Ответить

Вернуться в «ArcGIS»

Кто сейчас на конференции

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