Пакетная обработка ogr2ogr tab-shp

Аватара пользователя
Anton_Kh
Участник
Сообщения: 61
Зарегистрирован: 13 мар 2012, 18:10
Репутация: 37
Откуда: Харьков
Контактная информация:

Пакетная обработка ogr2ogr tab-shp

Сообщение Anton_Kh » 10 авг 2012, 14:16

Необходимо переконвертировать большое количество файлов формата .TAB в .shp при этом сменить проекцию "+proj=eqdc +lat_0=0 +lon_0=31 +lat_1=47.75 +lat_2=50.25 +x_0=800000 +y_0=-4900000 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs" на проекцию WGS 84 / UTM zone 36N

При этом нужно чтоб имена файлов сохранились.

Среди файлов к обработке есть и точечные, линейные и полигональные, названия файлов довольно разные.

Пробовал так:
for fname in *.TAB; do ogr2ogr -s_srs "+proj=eqdc +lat_0=0 +lon_0=31 +lat_1=47.75 +lat_2=50.25 +x_0=800000 +y_0=-4900000 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs" -t_srs "EPSG:32636" -f "ESRI Shapefile" new/$fname.shp *.TAB; done
При попытке выполнения команды выдает 43 строчи с надписью:
FAILURE: Couldn't fetch requested layer 'bounds_forest.TAB'!
Команда выполнялась из директории с файлами .TAB

пробовал как через консоль так и bash-скриптом.

По одному файлу выполняется хоть и с ошибкой - срезает несколько полей атрибутивной таблицы, но заставить пакетно обработать не получается.

Как правильно составить цикл?

OC: Xubuntu 10.04
Версия GDAL/OGR 1.6.3
Версия QGIS 1.9.0-Master

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

Re: Пакетна обработка ogr2ogr tab-shp

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

Попробуйте так:

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

for fname in *.TAB; do shp="$(basename $fname .TAB).shp"; ogr2ogr -s_srs "+proj=eqdc +lat_0=0 +lon_0=31 +lat_1=47.75 +lat_2=50.25 +x_0=800000 +y_0=-4900000 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs" -t_srs "EPSG:32636" -f "ESRI Shapefile" new/"$shp" $fname; done
Если вдруг у вас в TAB смешанная геометрия -- это уже сложнее. Я как-то делал для себя "наколеночный" скриптец с ogr2ogr для перегона табов в шейпы с разной геометрией. Если понадобится -- могу поискать в закромах.
Anton_Kh писал(а):По одному файлу выполняется ... с ошибкой - срезает несколько полей атрибутивной таблицы
А про это можно подробнее?
Редактор материалов, модератор форума

Аватара пользователя
Anton_Kh
Участник
Сообщения: 61
Зарегистрирован: 13 мар 2012, 18:10
Репутация: 37
Откуда: Харьков
Контактная информация:

Re: Пакетна обработка ogr2ogr tab-shp

Сообщение Anton_Kh » 10 авг 2012, 23:36

во всех TAB проекция одинаковая.

А по
А про это можно подробнее?
немного не разобрался сам в проблеме.
При выполнении
ogr2ogr -s_srs "+proj=eqdc +lat_0=0 +lon_0=31 +lat_1=47.75 +lat_2=50.25 +x_0=800000 +y_0=-4900000 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs" -t_srs "EPSG:32636" -f "ESRI Shapefile" new/fill.shp fill.TAB
Атрибутивные поля остаются, но при этом выдает следующее:
Warning 6: Normalized/laundered field name: 'free_topo_line_id' to 'free_topo_'
и изменяет имя полей атрибутивной таблицы, укорачивая их до 10 символов, отрезая лишние символы.

Аватара пользователя
Anton_Kh
Участник
Сообщения: 61
Зарегистрирован: 13 мар 2012, 18:10
Репутация: 37
Откуда: Харьков
Контактная информация:

Re: Пакетна обработка ogr2ogr tab-shp

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

Ваш рецепт в целом помог! Спасибо!
Побочные эффекты:
выдало большую пачку ошибок типа:
Warning 6: Normalized/laundered field name: 'square_position' to 'square_pos'
Warning 6: Normalized/laundered field name: 'compartment_boundary_id' to 'compartmen'
т.к. не нравятся длинные названия полей таблицы.

так же для некоторых файлов выдало ошибки:
ERROR 1: Attempt to write non-point (LINESTRING) geometry to point shapefile.
ERROR 1: Terminating translation prematurely after failed
translation of layer kvartal_polygon_annotation1 (use -skipfailures to skip errors)
Подскажите пожалуйста, в чем суть ошибки и как ее лечить?

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9128
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 747
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: Пакетна обработка ogr2ogr tab-shp

Сообщение Максим Дубинин » 10 авг 2012, 23:53

это не ошибка, это предупреждение
никак не лечится, длина названия поля 10 символов - ограничение формата
пристегивайтесь, турбулентность прямо по курсу

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

Re: Пакетна обработка ogr2ogr tab-shp

Сообщение Александр Мурый » 11 авг 2012, 00:01

Anton_Kh писал(а): Атрибутивные поля остаются, но при этом выдает следующее:
Warning 6: Normalized/laundered field name: 'free_topo_line_id' to 'free_topo_'
и изменяет имя полей атрибутивной таблицы, укорачивая их до 10 символов, отрезая лишние символы.
Это нормально, у шейп-файлов (точнее, у их атрибутивных таблиц в DBF) есть ограничение на 10 символов в имени поля.
Anton_Kh писал(а): так же для некоторых файлов выдало ошибки:
ERROR 1: Attempt to write non-point (LINESTRING) geometry to point shapefile.
ERROR 1: Terminating translation prematurely after failed
translation of layer kvartal_polygon_annotation1 (use -skipfailures to skip errors)
Подскажите пожалуйста, в чем суть ошибки и как ее лечить?
Суть ошибки в том, что я говорил выше: формат MapInfo TAB позволяет хранить геометрию разных типов (точки, линии, полигоны) и не только геометрию, но и кучу всего остального (текст, оформление). Шейп-файлы же чётко разделяются по типам геометрии, поэтому при конвертации вылазят ошибки.
Можно (как советуется в тексте ошибки, кстати) использовать опцию "-skipfailures", но при этом у вас будет сохраняться в шейп-файл только один какой-то тип геометрии. Для полной конвертации TAB --> SHP нужен лёгкий скриптинг :)
P.S. Найду свой скрипт -- выложу.
Редактор материалов, модератор форума

Аватара пользователя
Anton_Kh
Участник
Сообщения: 61
Зарегистрирован: 13 мар 2012, 18:10
Репутация: 37
Откуда: Харьков
Контактная информация:

Re: Пакетна обработка ogr2ogr tab-shp

Сообщение Anton_Kh » 11 авг 2012, 00:11

Легкий скриптинг... :D

Я пока написал цикл для того чтоб задать этот вопрос (первое сообщение) пол дня уделал :)
P.S. Найду свой скрипт -- выложу.
Буду очень благодарен!

Аватара пользователя
Anton_Kh
Участник
Сообщения: 61
Зарегистрирован: 13 мар 2012, 18:10
Репутация: 37
Откуда: Харьков
Контактная информация:

Re: Пакетна обработка ogr2ogr tab-shp

Сообщение Anton_Kh » 11 авг 2012, 00:11

попробую разобраться с -skipfailur

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

Re: Пакетна обработка ogr2ogr tab-shp

Сообщение Александр Мурый » 11 авг 2012, 01:29

amuriy писал(а): P.S. Найду свой скрипт -- выложу.
Проще было накатать новый.

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


#!/bin/sh
mkdir shp

ls *.TAB | while read tab; do
geom=$(ogrinfo -al $tab | grep "Geometry: Unknown (any)" )
if [ -n "$geom" ]; then
ogr2ogr -skipfailures -s_srs '+proj=eqdc +lat_0=0 +lon_0=31 +lat_1=47.75 +lat_2=50.25 +x_0=800000 +y_0=-4900000 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs' -t_srs "EPSG:32636" -f "ESRI Shapefile" -nlt "POINT" shp/"$(basename $tab .TAB)__point.shp" $tab
ogr2ogr -skipfailures -s_srs '+proj=eqdc +lat_0=0 +lon_0=31 +lat_1=47.75 +lat_2=50.25 +x_0=800000 +y_0=-4900000 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs' -t_srs "EPSG:32636" -f "ESRI Shapefile" -nlt "LINESTRING" shp/"$(basename $tab .TAB)__line.shp" $tab
ogr2ogr -skipfailures -s_srs '+proj=eqdc +lat_0=0 +lon_0=31 +lat_1=47.75 +lat_2=50.25 +x_0=800000 +y_0=-4900000 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs' -t_srs "EPSG:32636" -f "ESRI Shapefile" -nlt "POLYGON" shp/"$(basename $tab .TAB)__polygon.shp" $tab
else
ogr2ogr -s_srs '+proj=eqdc +lat_0=0 +lon_0=31 +lat_1=47.75 +lat_2=50.25 +x_0=800000 +y_0=-4900000 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs' -t_srs "EPSG:32636" -f "ESRI Shapefile" shp/"$(basename $tab .TAB).shp" $tab
fi
done

Надо поместить скрипт в каталог с файлами *.TAB, сделать исполняемым (команда "chmod +x multigeom_tab_to_shp.sh"), запустить. Результатом будет набор шейп-файлов в каталоге "shp", разбитых, если это надо, по типам.
Вложения
multigeom_tab_to_shp.gz
(436 байт) 805 скачиваний
Редактор материалов, модератор форума

Аватара пользователя
Anton_Kh
Участник
Сообщения: 61
Зарегистрирован: 13 мар 2012, 18:10
Репутация: 37
Откуда: Харьков
Контактная информация:

Re: Пакетна обработка ogr2ogr tab-shp

Сообщение Anton_Kh » 15 авг 2012, 10:42

спасибо за скрипт!

особенности работы:
с некоторые файлы разделил по категориям, некоторые не поделил (в основном точечные файлы таковыми и оставил).
часть генерированных файлов пустые - без объектов.

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

Re: Пакетна обработка ogr2ogr tab-shp

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

Anton_Kh писал(а): с некоторые файлы разделил по категориям, некоторые не поделил (в основном точечные файлы таковыми и оставил).
TAB'ы бывают разными :) Если нужно протестировать, приложите какой-нибудь из этих проблемных точечных слоёв.
Anton_Kh писал(а): часть генерированных файлов пустые - без объектов.
Опять же, надо проверять на реальных данных. Скрипт до безобразия прост, при желании сюда ещё можно накрутить всяких условий / проверок и т.д.
Редактор материалов, модератор форума

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9128
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 747
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: Пакетна обработка ogr2ogr tab-shp

Сообщение Максим Дубинин » 15 авг 2012, 11:46

Извините, влезу. Есть нюансы в таком подходе.

Этот подход может не подойти, так как при конвертации может происходить конвертация типов геометрии, что может приводить к появлению копии данных с другой геометрией, например, такая команда приведет к созданию линейного shape-файла, несмотря на то, что в исходном файле могло не быть линий, а только полигоны.

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

ogr2ogr -skipfailures output_LINESTRING.shp input.mif -nlt "LINESTRING"
поэтому просто перебирать типы - плохо.

Лучше так:

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

ogr2ogr -skipfailures output_LINESTRING.shp input.mif -nlt "LINESTRING" -sql "SELECT * FROM Input WHERE OGR_GEOMETRY='LINESTRING'"
Соответственно цикл (извините, под Win) у меня вышел такой:

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

for %i in (*.mif) do for %n in (POINT LINESTRING POLYGON MULTIPOLYGON MULTIPOINT MULTILINESTRING) do ogr2ogr -skipfailures shp/%~ni_%n.shp %i -nlt "%n" -sql "SELECT * FROM '%~ni' WHERE OGR_GEOMETRY='%n'"
Если типа нет, то создастся пустышка.
пристегивайтесь, турбулентность прямо по курсу

Аватара пользователя
Anton_Kh
Участник
Сообщения: 61
Зарегистрирован: 13 мар 2012, 18:10
Репутация: 37
Откуда: Харьков
Контактная информация:

Re: Пакетна обработка ogr2ogr tab-shp

Сообщение Anton_Kh » 15 авг 2012, 12:36

Если типа нет, то создастся пустышка.
Собственно так и получилось.

При обработке полигонов получилось 2 файла с данными - полигональный и линейный, и точечный файл пустой.
Вложения
kvartal_polygon_coverage_shp.zip
Получившийся результат
(101.82 КБ) 445 скачиваний
kvartal_polygon_coverage_tab.zip
Исходные данные
(26.13 КБ) 460 скачиваний

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9128
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 747
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: Пакетна обработка ogr2ogr tab-shp

Сообщение Максим Дубинин » 15 авг 2012, 12:43

я написал выше как это решается
пристегивайтесь, турбулентность прямо по курсу

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

Re: Пакетна обработка ogr2ogr tab-shp

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

Спасибо, Максим, за подсказку. Anton_Kh, буду смотреть.
Вообще, нужен, конечно, нормальный рабочий скрипт с чётким разделением по типам и без "пустышек".
Редактор материалов, модератор форума

Ответить

Вернуться в «GDAL/OGR»

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

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