Страница 1 из 3
Пакетное редактирование DBF
Добавлено: 20 авг 2011, 16:39
Slinger
Возникла очередная творческая задача. Имеется много .shp файлов, у которых необходимо поправить .dbf, исправив не только тип поля но и порядок размещения полей. Усердно погуглив и покурив несколько .dbf редакторов, задачу удалось решить, но только для одного .dbf. А необходимо для пары сотен. Есть ли такие редакторы, работающие пакетно с .dbf ? Возможно такие, которые позволяют писать примитивные макросы.
Буду крайне благодарен за любой совет.
Re: Пакетное редактирование DBF
Добавлено: 20 авг 2011, 16:55
bim2010
visual foxpro
Re: Пакетное редактирование DBF
Добавлено: 20 авг 2011, 17:25
Александр Мурый
Смена типа полей:
-- загнать DBF с нормальную БД (PostgreSQL, MySQL, SQLite) --> сменить тип поля (CAST) --> экспорт назад в DBF
-- Python+ogr2ogr (в OGR SQL тоже есть оператор CAST)
Порядок полей:
-- Python+ogr2ogr: экспорт DBF в CSV --> смена порядка полей в CSV --> назад в DBF (?)
Re: Пакетное редактирование DBF
Добавлено: 20 авг 2011, 22:28
Boris
порядок размещения полей в SQL запросе должен быть на выходе именно таким, каким он задан в SQL Select'е. По крайней мере это так во всех известных мне реализациях.
Судя по
http://www.gdal.org/ogr/ogr_sql.html
никаких описаний того, что это не так там нет. Что простой SQL в ogr2ogr с заменой порядка столбцов не работает?
Re: Пакетное редактирование DBF
Добавлено: 20 авг 2011, 23:09
Александр Мурый
Действительно, похоже, что хватит одного ogr2ogr. Оператор "-select" меняет порядок полей в выходном файле, с CAST ещё надо разобраться...
Re: Пакетное редактирование DBF
Добавлено: 21 авг 2011, 14:22
Slinger
Спасибо всем за ответы. Если с помощью ogr2ogr действительно можно менять тип поля и порядок полей и у кого достаточно опыта в этом деле - не могли бы вы помочь ?
Пример вложен в сообщение.
Порядок и тип полей должен быть таким:
1) FID
2) Shape
3) KOD (int)
4) NAME (char 40)
5) NUMOBJ (int)
6) FUNKTION (int)
7) ANGLE (float)
Одного работоспособного примера будет достаточно. Написание подобных операций и дальнейшее зацикливание труда уже не составит. Очень надеюсь на помощь.
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'"
Re: Пакетное редактирование DBF
Добавлено: 21 авг 2011, 21:43
Slinger
Огромное спасибо, всё получилось. Запрос, соответствующий моим требования, выглядит так:
Код: Выделить всё
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 знаков после запятой, поэтому он упорно дописывает несуществующие нули в конце, хотя мне надо до сотых. Можно ли как-это ограничить ?
Re: Пакетное редактирование DBF
Добавлено: 21 авг 2011, 21:59
Александр Мурый
1) CAST (ANGLE AS NUMERIC(9,2)) не пойдёт разве?
2) Судя по
http://www.gdal.org/ogr/ogr_sql.html, задать точность Float нельзя.
Re: Пакетное редактирование DBF
Добавлено: 21 авг 2011, 22:06
Slinger
1) Получится Double, у которого Length 9, Precision 8 и Scale 2. Правда ограничение до сотых присутствует, но не уверен, насколько это устроит руководство.
2) Очень жаль.
Ещё возник вопрос. В описалось ogr2ogr не нашёл опции на перезапись. То есть если имя выходного файла совпадает с именем файла, который уже лежит в той же директории, то обновлённый файл просто не создаётся. Если ли что-нибудь вроде ключа '-o' или около того ?
Re: Пакетное редактирование DBF
Добавлено: 21 авг 2011, 22:16
Александр Мурый
Перезапись: -overwrite
* 1) А что, double -- не float ?
Re: Пакетное редактирование DBF
Добавлено: 21 авг 2011, 22:28
Slinger
Спасибо за -overwrite, забыл совершенно глянуть основную страницу:
http://www.gdal.org/ogr2ogr.html
Ну вроде как float это одиночное с плавающей точкой, а double это двойное с плавающей точкой. Что-то вроде расширенного варианта float'a...
Сдаётся мне, придётся править классификатор вдобавок.
Re: Пакетное редактирование DBF
Добавлено: 22 авг 2011, 11:32
Slinger
Очередной непонятный ребус к уже вышеописанным вопросам. Необходимо заменить файлы обновлёнными файлами с тем же именем. Как ни странно - ключа не нашёл. Есть только append, который хоть и заменяет существующий файл обновлённым, но ещё вдобавок и подсоединяет его самому к этому же файлу (то есть объекты дублируются). Как-то это можно обойти ?
Re: Пакетное редактирование DBF
Добавлено: 22 авг 2011, 12:16
Александр Мурый
Slinger писал(а):Необходимо заменить файлы обновлёнными файлами с тем же именем. Как ни странно - ключа не нашёл.
OGR тут не поможет. Можно переименовать в скрипте (?)
Re: Пакетное редактирование DBF
Добавлено: 22 авг 2011, 12:28
Slinger
Очень жаль. Придётся пользоваться ren, copy и del соответственно. Безумие конечно...
Кстати и цикл своять тоже не получилось. При указании таблицы FROM 'имя таблицы', так или иначе необходимо вводить корректное имя таблицы, дикие карты не поддерживаются.