Пакетное редактирование DBF

Вопросы общего характера по ГИС и дистанционному зондированию, не связанные с конкретным ПО.
Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: Пакетное редактирование DBF

Сообщение Boris » 22 авг 2011, 12:47

Slinger писал(а): Ну вроде как float это одиночное с плавающей точкой, а double это двойное с плавающей точкой. Что-то вроде расширенного варианта float'a...
Что-то мне подсказывает, что спецификация на DBF III, а именно он лежит в основе SHP,
судя по http://ru.wikipedia.org/wiki/DBF и http://www.autopark.ru/ASBProgrammerGuide/DBFSTRUC.HTM
не предусматривает ни Double, ни Float.

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

Re: Пакетное редактирование DBF

Сообщение Slinger » 22 авг 2011, 13:39

Interger, Long integer и Double обозначены в DBF редакторах и структуре как таковой как Numerical. От 1 до 4 знаков - Short, от 5 до 9 знаков - Long, от 10 до, кажется, 135 - Double. Под количеством знаков я подразумеваю Field Width, максимальное количество символов в ячейке этого типа поля. Float задаётся отдельным типом в DBF редакторе, длина от 1 д 10 знаков. В любом случае через OGR не выходит задать именно Float, он воспринимает его как Numerical и в зависимости от количества знаков ArcMap назначает тип поля Int, Long или Double.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Пакетное редактирование DBF

Сообщение Александр Мурый » 22 авг 2011, 20:05

Slinger писал(а):Очень жаль. Придётся пользоваться ren, copy и del соответственно. Безумие конечно...

Кстати и цикл своять тоже не получилось. При указании таблицы FROM 'имя таблицы', так или иначе необходимо вводить корректное имя таблицы, дикие карты не поддерживаются.
OGR имеет Python-биндинги, при умении на питоне такое проще решить. Ну а лично я написал бы shell-скрипт с получением для каждого набора данных имени слоя). Типа такого:

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


#!/bin/sh

find . -type f -iname "*.shp" -print0 | xargs -0 -I % ls % | while read SHP; do
TABLE=$(ogrinfo -al -so "$SHP" | grep "Layer name:" | cut -d":" -f2 | sed 's/^[\t]*//')
NEW_SHP=$(basename "$SHP" .shp)_NEW.shp

ogr2ogr -f "ESRI Shapefile" "$NEW_SHP" "$SHP" -sql "SELECT CAST (KOD AS INTEGER(9)), CAST (NAME AS CHARACTER(40)), CAST (NUMOBJ AS INTEGER(9)), CAST (FUNKTION AS INTEGER(9)), CAST (ANGLE AS NUMERIC(9,2)) FROM $TABLE"

done

В данном случае скрипт меняет поля одинаково для всех шейпов в данном каталоге и всех вложенных каталогах.
Последний раз редактировалось Александр Мурый 26 авг 2011, 13:43, всего редактировалось 1 раз.
Редактор материалов, модератор форума

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

Re: Пакетное редактирование DBF

Сообщение Slinger » 22 авг 2011, 22:37

Возможно глупый вопрос, но как подобное запускать ? Сам питон есть (к аркгису идёт) и питоновские макросы (.py) тоже удавалось запускать. А... как с подобным обращаться ? Или где-то про это почитать можно ?

Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Пакетное редактирование DBF

Сообщение Дмитрий Барышников » 22 авг 2011, 22:50

Это шелл файл для Линукса. В Windows надо искать соответствующие утилиты find, sh и др. если такое вообще есть. Или использовать linux/unix сервер в интернете если своего нет.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Пакетное редактирование DBF

Сообщение Александр Мурый » 22 авг 2011, 22:54

По питону много литературы в сети. Спецы (которые здесь, кстати, есть), возможно, подскажут подробнее.
Про написанное выше мною можно почитать тут. Запускается это хозяйство в любом дистрибутиве Linux с установленным GDAL/OGR (можно и в других Unix-подобных ОС). В Windows -- под Cygwin.

P.S.Если интересно попробовать Linux для подобных задач, рекомендую посмотреть OSGeo Live
Редактор материалов, модератор форума

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

Re: Пакетное редактирование DBF

Сообщение Slinger » 23 авг 2011, 10:47

Спасибо за советы. Правда боюсь это для меня тяжко всё. Да и время поджимает, увы.

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

Re: Пакетное редактирование DBF

Сообщение Slinger » 25 авг 2011, 21:40

Возвращаясь опять к ogr'у. После экспорта из AutoCAD MAP 3D объектов типа "текст" я получаю несколько специальных полей, одно из которых называется TEXT_ANGLE и подразумевает под собой угол поворота надписи. Правда в радианах. А необходимо в градусах. Для этого в моём .shp присутствует специальная колонка ANGLE. Вопрос. Могу ли я с помощью огра и каких-либо его -sql выборок получить выходной .shp, у которого значение колонки angle будет обновлено значениями колонки text_angle, умноженными на 57.2957795 ?

В описании отсутствует что-либо подобное, но мало ли...

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Пакетное редактирование DBF

Сообщение Александр Мурый » 25 авг 2011, 23:04

Насколько я понимаю, OGR SQL не поддерживает UPDATE/INSERT и т.п. Как вариант, можно конвертировать в SQLite (SpatiaLite?) и там сделать умножение.
Редактор материалов, модератор форума

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

Re: Пакетное редактирование DBF

Сообщение Slinger » 25 авг 2011, 23:20

Жаль. Спасибо за ответ и совет :!:

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

Re: Пакетное редактирование DBF

Сообщение Slinger » 26 авг 2011, 11:26

Очередной вопрос. Оказывается вчерашний мой пост оказался некой дезинформацией в плане выдаваемых значений в полях. Специальная колонка TEXT_ANGLE, которая создаётся при экспорте из Autocad Map 3D, содержит угол поворота подписи в градусах, что мне и необходимо. Однако называться колонка должна не text_angle, а просто Angle. Вопрос. Возможно ли с помощью огра на этапе выходного шейпа, помимо использования CAST, ещё и переименовать колонки ? Огровский хэлп что-то говорит об использовании aliases при изменении колонок, одна алиасы это псевдонимы. А возможно ли всё-таки именно переименовать колонки ?

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Пакетное редактирование DBF

Сообщение Александр Мурый » 26 авг 2011, 13:59

Slinger писал(а):Возможно ли с помощью огра на этапе выходного шейпа, помимо использования CAST, ещё и переименовать колонки ? Огровский хэлп что-то говорит об использовании aliases при изменении колонок, одна алиасы это псевдонимы. А возможно ли всё-таки именно переименовать колонки ?
Я не очень понял из хелпа отличие нового имени поля от его псевдонима, но у меня получилось переименовать некоторые поля так (выборочно):

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


ogr2ogr -f "ESRI Shapefile" "$NEW_SHP" "$SHP" \
-sql "SELECT CAST (KOD AS INTEGER(9)) AS 'kod', \
CAST (NAME AS CHARACTER(40)) AS 'new_name',\
CAST (NUMOBJ AS INTEGER(9)),\
CAST (FUNKTION AS INTEGER(9)),\
CAST (ANGLE AS NUMERIC(9,2)) AS 'text_angle'\
FROM $TABLE"
Редактор материалов, модератор форума

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Пакетное редактирование DBF

Сообщение Voltron » 26 авг 2011, 14:00

RTFM.
OGR SQL supports renaming the fields following the SQL92 specification by using the AS keyword according to the following example:

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

SELECT *, OGR_STYLE AS STYLE FROM polylayer
Это значит, что правильно сформировав запрос можно не только изменить тип поля, но дать ему другое название.

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

ogr2ogr outdataset indataset -sql "SELECT src_field1 AS dst_field1, src_field2 AS dst_field2 FROM sourcelayer"

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

Re: Пакетное редактирование DBF

Сообщение Slinger » 26 авг 2011, 14:53

Как раз буквально полчаса назад сам разобрался с синтаксисом и вполне успешно. Огромное спасибо за ответы :!:

UPD:

Поизучав синтаксис повторно, удалось решить задачку и с переводом радианных величин в градусные. То есть в моём экспортированном шейпе имеется колонка ANGLE, содержащая угол поворота подписи в радианах. Я хочу получить в результате работы огра колонку с тем же именем, тогда я пишу что-то вроде того:

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

SELECT CAST (ANGLE*57.29577151 AS NUMERIC (9,2)) AS AGNLE
В этом случае я получу ту же самую колонку, но уже содержащую градусы. Пришлось использовать переименование "AS ANGLE", потому как выражение "ANGLE*57.29577151" выдается в результате колонкой с именем "Field1_3" или около того. Так что можно считать, что все задачи и вопросы на текущий момент решены.

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

Re: Пакетное редактирование DBF

Сообщение Slinger » 27 авг 2011, 21:50

Решил попробовать всю вышеописанную операцию у себя дома:

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

SELECT CAST (ANGLE*57.29577151 AS NUMERIC (9,2)) AS AGNLE
В результате получаю ошибку:

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

ERROR 1: Type mismatch or improper type of arguments to * operator.
И как понять такие чудеса, если даже подобная операция в примере проводится ?

UPD:

Сработала такая комбинация:

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

SELECT CAST (ANGLE AS NUMERIC (9,2))*57.29577151 AS AGNLE
Интересная однако вещь этот огр. И не менее интерес его синтаксис.

Вопрос закрыт, надеюсь навсегда =)

Ответить

Вернуться в «Общие вопросы»

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

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