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

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

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

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

Возникла очередная творческая задача. Имеется много .shp файлов, у которых необходимо поправить .dbf, исправив не только тип поля но и порядок размещения полей. Усердно погуглив и покурив несколько .dbf редакторов, задачу удалось решить, но только для одного .dbf. А необходимо для пары сотен. Есть ли такие редакторы, работающие пакетно с .dbf ? Возможно такие, которые позволяют писать примитивные макросы.

Буду крайне благодарен за любой совет.

bim2010
Гуру
Сообщения: 977
Зарегистрирован: 27 янв 2009, 22:57
Репутация: 258

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

Сообщение bim2010 » 20 авг 2011, 16:55

visual foxpro

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

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

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

Смена типа полей:
-- загнать DBF с нормальную БД (PostgreSQL, MySQL, SQLite) --> сменить тип поля (CAST) --> экспорт назад в DBF
-- Python+ogr2ogr (в OGR SQL тоже есть оператор CAST)
Порядок полей:
-- Python+ogr2ogr: экспорт DBF в CSV --> смена порядка полей в CSV --> назад в DBF (?)
Редактор материалов, модератор форума

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

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

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

порядок размещения полей в SQL запросе должен быть на выходе именно таким, каким он задан в SQL Select'е. По крайней мере это так во всех известных мне реализациях.
Судя по http://www.gdal.org/ogr/ogr_sql.html
никаких описаний того, что это не так там нет. Что простой SQL в ogr2ogr с заменой порядка столбцов не работает?

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

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

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

Действительно, похоже, что хватит одного ogr2ogr. Оператор "-select" меняет порядок полей в выходном файле, с CAST ещё надо разобраться...
Редактор материалов, модератор форума

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

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

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

Спасибо всем за ответы. Если с помощью ogr2ogr действительно можно менять тип поля и порядок полей и у кого достаточно опыта в этом деле - не могли бы вы помочь ?

Пример вложен в сообщение.

Порядок и тип полей должен быть таким:

1) FID
2) Shape
3) KOD (int)
4) NAME (char 40)
5) NUMOBJ (int)
6) FUNKTION (int)
7) ANGLE (float)

Одного работоспособного примера будет достаточно. Написание подобных операций и дальнейшее зацикливание труда уже не составит. Очень надеюсь на помощь.
Вложения
primer.zip
(1.74 КБ) 379 скачиваний

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

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

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

Примерно так:

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

ogr2ogr -f "ESRI Shapefile" 1830-15_04_NEW.shp 1830-15_04.shp -sql "SELECT FID, OGR_GEOMETRY, CAST (KOD AS INTEGER), CAST (NAME AS CHARACTER(40)), CAST (NUMOBJ AS INTEGER), CAST (FUNKTION AS INTEGER), CAST (ANGLE AS FLOAT) FROM '1830-15_04'"
Редактор материалов, модератор форума

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

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

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

Огромное спасибо, всё получилось. Запрос, соответствующий моим требования, выглядит так:

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

ogr2ogr -f "ESRI Shapefile" 1830-15_04_NEW.shp 1830-15_04.shp -sq
l "SELECT CAST (KOD AS INTEGER(9)), CAST (NAME AS CHARACTER(40)), CAST (NUMOBJ A
S INTEGER(9)), CAST (FUNKTION AS INTEGER(9)), CAST (ANGLE AS FLOAT) FROM '1830-1
5_04'"
Однако возникла пара вопросов

1) Не могу никак задать тип Float. Если использовать при указании тип Float, но не указывать длину поля, то берётся максимум и поле становится типом Double. Задание специфичного Numeric'a тоже не прокатило.

2) Есть ли возможность задать точность типа данных Float? В некоторых моих слоях есть колонка с высотами горизонталей и тип у этой колонки должен быть Float. А Float всегда имеет точность до 6 знаков после запятой, поэтому он упорно дописывает несуществующие нули в конце, хотя мне надо до сотых. Можно ли как-это ограничить ?

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

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

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

1) CAST (ANGLE AS NUMERIC(9,2)) не пойдёт разве?
2) Судя по http://www.gdal.org/ogr/ogr_sql.html, задать точность Float нельзя.
Редактор материалов, модератор форума

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

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

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

1) Получится Double, у которого Length 9, Precision 8 и Scale 2. Правда ограничение до сотых присутствует, но не уверен, насколько это устроит руководство.

2) Очень жаль.

Ещё возник вопрос. В описалось ogr2ogr не нашёл опции на перезапись. То есть если имя выходного файла совпадает с именем файла, который уже лежит в той же директории, то обновлённый файл просто не создаётся. Если ли что-нибудь вроде ключа '-o' или около того ?

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

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

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

Перезапись: -overwrite
* 1) А что, double -- не float ?
Редактор материалов, модератор форума

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

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

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

Спасибо за -overwrite, забыл совершенно глянуть основную страницу: http://www.gdal.org/ogr2ogr.html

Ну вроде как float это одиночное с плавающей точкой, а double это двойное с плавающей точкой. Что-то вроде расширенного варианта float'a...

Сдаётся мне, придётся править классификатор вдобавок.

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

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

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

Очередной непонятный ребус к уже вышеописанным вопросам. Необходимо заменить файлы обновлёнными файлами с тем же именем. Как ни странно - ключа не нашёл. Есть только append, который хоть и заменяет существующий файл обновлённым, но ещё вдобавок и подсоединяет его самому к этому же файлу (то есть объекты дублируются). Как-то это можно обойти ?

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

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

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

Slinger писал(а):Необходимо заменить файлы обновлёнными файлами с тем же именем. Как ни странно - ключа не нашёл.
OGR тут не поможет. Можно переименовать в скрипте (?)
Редактор материалов, модератор форума

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

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

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

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

Кстати и цикл своять тоже не получилось. При указании таблицы FROM 'имя таблицы', так или иначе необходимо вводить корректное имя таблицы, дикие карты не поддерживаются.

Ответить

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

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

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