Ogr2ogr выборка из многих файлов в один через SQL

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

Ogr2ogr выборка из многих файлов в один через SQL

Сообщение Boris » 29 сен 2015, 05:27

Задача:
есть много (>2000) файлов формата *.mif с одинаковой структуры. Для них нужно выполнить выборку по некоторому атрибутивному полю в единый файл MIF/TAB для этого атрибута. Значения в поле известны и счетны (около 100). Для выборки используется SQL оператор Like.
Выборку ogr2ogr выполняет без проблем, если из файла в файл, т.к. говорит, что MIF форат не обновляемый(?). В результате при запуске создается такое же количество файлов MIF, что и было в начале, но уже для каждого из вариантов атрибутивного значения, из них солидное число пустых или с 1-10 записями. Не удобно работать совершенно. Их надо потом объединять, а не понятно чем. Т.е. понятно, что с учетом того, что MIF - текстовый формат, четко описанной структуры, создать объединялку для MIF файлов - не бином Ньютона, но как то хотелось оставаться в рамках стандартных решений.
Хочется:
а) запустить ogr2ogr со *, в качестве имени файла. Он запускается, но уже на 2-м файле ругается, что не может его "fetch".
б) на выходе получить один файл для каждой выборки. Условно для такого подходит SHP с опцией -append, запущенный в цикле командного процессора с оператором FOR для каждого входного файла, что есть отступление от возможности использовать *.mif. Кроме того, SHP имеет ограничение на длину имени поля в 10 символов, а MIF в 32, и такая обработка обрезает имена.
Вопросы:
1) как реализовать, если хочется что бы сразу получилось как в п. а) ?
2) чем можно заменить формат SHP без потери в качестве данных и параметрах проекции, с учетом того, что потом придется делать конвертацию в MIF ?
3) по описанию, мог бы подойти формат VRT как вариант, при котором даже запрос был бы виртуальным до момента создания результирующего файла, но как его создают для вектора? Для растра есть gdalbuildvrt , а как поступаю в случае векторных файлов?

gamm
Гуру
Сообщения: 4107
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1081
Ваше звание: программист
Откуда: Казань

Re: Ogr2ogr выборка из многих файлов в один через SQL

Сообщение gamm » 29 сен 2015, 06:47

я бы написал скрипт на R, в котором сформировал список файлов, а потом делал выборки в цикле: либо грузил последовательно в R, если он поля не режет, и там собирал результат, либо запускал из R ogr2ogr, потом читал MIF/MID как текстовые файлы (без парсинга), обрезал им заголовки (всем, кроме первого), и копировал в хвост первому.

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

Re: Ogr2ogr выборка из многих файлов в один через SQL

Сообщение Дмитрий Барышников » 29 сен 2015, 13:01

1. MapInfo формат обновляемый:
ogr2ogr --formats | grep MapInfo
MapInfo File -vector- (rw+v): MapInfo File

'ro' is read-only driver; 'rw' is read or write (ie. supports CreateCopy); 'rw+' is read, write and update (ie. supports Create). A 'v' is appended for formats supporting virtual IO (/vsimem, /vsigzip, /vsizip, etc).

1) приведите пример команды, потому как мне кажется тут достаточно выполнить ogr2ogr -append и должен получится склееный файл
2) Напрямую работать с MIF без конвертации
3) Не уверен. VRT в случае вектора - это когда нужно:
а) поменять порядок или названия полей не трогая источник
б) предоставить перепроецированный файл
в) выполнить JOIN по какому-то полю.

Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: Ogr2ogr выборка из многих файлов в один через SQL

Сообщение Ariki » 29 сен 2015, 13:23

Boris писал(а): чем можно заменить формат SHP без потери в качестве данных и параметрах проекции, с учетом того, что потом придется делать конвертацию в MIF ?
Дмитрий Барышников писал(а): MapInfo формат обновляемый:
ogr2ogr --formats | grep MapInfo
MapInfo File -vector- (rw+v): MapInfo File
MIF - текстовый формат, он произвольного доступа не поддерживает. Логично было бы использовать TAB, но нужен GDAL 2.0.
Starting with GDAL 2.0, update of existing TAB files is supported (append of new features, modifications and deletions of existing features, adding/renaming/deleting fields, ...). Update of existing MIF/MID files is not supported.

gamm
Гуру
Сообщения: 4107
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1081
Ваше звание: программист
Откуда: Казань

Re: Ogr2ogr выборка из многих файлов в один через SQL

Сообщение gamm » 29 сен 2015, 14:36

значит, таки просто режем и клеим текстовые файлы, невзирая не структуру :mrgreen:

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

Re: Ogr2ogr выборка из многих файлов в один через SQL

Сообщение Boris » 01 окт 2015, 03:03

Ok!
0/ клеить и резать (не понял зачем резать), я таки умею, это тривиально в любом языке программирования, ну может за исключением очень специальных. Хотелось стандартности в работе, а не самодеятельности.
1/ ogr2ogr -append у меня как раз и не сработал. на 2-ом файле в списке

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

F:\#Tmp\Data\Z1>ogr2ogr.exe -f "MapInfo File" ..\5049\zk5049.mif  "*.mif" -where "KN LIKE '50:49%'" -nln zk5049 -append
в GDAL 1.11.3, released 2015/09/16
FAILURE: Couldn't fetch requested layer 'id_00002.mif'!
а в GDAL 2.0.0dev, released 2014/04/16
Unable to open datasource `*.mif' with the following drivers.
2/ так я этого и хочу. мне потом еще за OGR mif Файл править - кодировку устанавливать, лишние скобки удалять, границы карты вычислять, и это не одном файле гораздо приятней делать, чем на 1000. И так уж сложилось, что я не Mapinfo TAB не очень доверяю. В них все в одном - ни подкрутить, ни настроить.
3/ т.е. VRT для объединения многих в один виртуальный - не вариант?
---

trir
Гуру
Сообщения: 5313
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1017
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Ogr2ogr выборка из многих файлов в один через SQL

Сообщение trir » 01 окт 2015, 08:35

В БД всё засунуть и не мучатся

gamm
Гуру
Сообщения: 4107
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1081
Ваше звание: программист
Откуда: Казань

Re: Ogr2ogr выборка из многих файлов в один через SQL

Сообщение gamm » 01 окт 2015, 11:33

Boris писал(а):клеить и резать (не понял зачем резать),
отрезать заголовки всем, кроме первого. Чего проще-то и универсальнее?

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

Re: Ogr2ogr выборка из многих файлов в один через SQL

Сообщение bim2010 » 01 окт 2015, 17:03

Возможно дело и не в этом, но у меня тоже были проблемы работы ogr2ogr.
Список mif файлов в массив:

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

xinput="c:\mif_export\input\"
qf=adir(adf,xinput+"*.*","D")
* массив adf будет содержать информацию обо всех файлах указанного каталога 
*(с подкаталогами, поскольку применена опция "D").
** adf[1,1] - имя файла
** adf[1,2] - размер
** adf[1,3] - дата создания
** adf[1,4] - время создания
** adf[1,5] - атрибуты файла
FOR j=1 To qf   && в этом цикле данные читаются из массива
IF ATC('.mif',adf[j,1])#0
   ***** 
ENDIF  
NEXT
* экспорт mif в shp в цикле:

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

xogr2ogr="C:\osgeo4w\bin\ogr2ogr.exe"
xmif="c:\mif_export\outmif\building.mif"
xshp="c:\mif_export\out\building_a.shp"
xPOINT="'POINT'"
xpoligon="'POLYGON'"
xMULTIPOLYGON="'MULTIPOLYGON'"
xshp3="c:\mif_export\out\building3.shp"
xshp4="c:\mif_export\out\building_p.shp"
xrun=xogr2ogr+ ' -skipfailures '  +  xshp + ' ' + xmif +' -nlt "POLYGON" -where "OGR_GEOMETRY='+xpoligon+'"'
! &xrun
xrun=xogr2ogr+ ' -skipfailures '  +  xshp3 + ' ' + xmif +' -nlt "MULTIPOLYGON" -where "OGR_GEOMETRY='+xMULTIPOLYGON+'"'
! &xrun
xrun=xogr2ogr+ ' -skipfailures '  +  xshp4 + ' ' + xmif +' -nlt "POINT" -where "OGR_GEOMETRY='+xPOINT+'"'
! &xrun
*обрезка

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

xshp_pruning="c:\mif_export\out\region67.shp"
xshp_output="c:\mif_export\out\output.shp"
xshp_outp3="c:\mif_export\out\output3.shp"
! del c:\mif_export\out\output*.*
xrun=xogr2ogr+ ' -clipsrc ' +xshp_pruning + ' ' +  xshp_output + ' ' +  xshp 
! &xrun
xrun=xogr2ogr+ ' -clipsrc ' +xshp_pruning + ' ' +  xshp_outp3 + ' ' +  xshp3 
! &xrun
xresult="c:\mif_export\out\result.shp"
xrun=xogr2ogr+ ' ' +xresult + ' ' +  xshp_output 
! &xrun
xrun=xogr2ogr+ ' -update -append' +xresult + ' ' +  xshp_outp3+ '  -nln result'
! &xrun
У меня заработал в цикле вариант ogr2ogr из папки C:\osgeo4w\bin\ogr2ogr.exe
Или например обрезка не работает, если в слое есть полигоны и мультиполигоны.
В общем я солидарен с gamm.

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

Re: Ogr2ogr выборка из многих файлов в один через SQL

Сообщение Дмитрий Барышников » 01 окт 2015, 22:17

2Boris
1. Да, было верно замечено, что с mif append не работает. Но вот так у меня получилось:

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

$ ogr2ogr -f "MapInfo File" -nln sp_qqq sp_qqq.tab sp1.mif
$ ogr2ogr -f "MapInfo File" -append -nln sp_qqq sp_qqq.tab sp2.mif
$ ogr2ogr -f "MapInfo File" -append -nln sp_qqq sp_qqq.tab sp3.mif
В принципе в конце можно же вот так сделать:

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

$ ogr2ogr -f "MapInfo File" output.mif sp_qqq.tab
И получить искомый глобальный mif

3. Мне кажется не вариант. Во всяком случае я не знаю, как объединить файлы пристыковав один к другому.

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

Re: Ogr2ogr выборка из многих файлов в один через SQL

Сообщение Boris » 02 окт 2015, 01:18

Всем спасибо за советы! Пойду копать.
Утилитой для объединения MIF я владею уже более 10 лет, но как всегда хотелось хоть что то улучшить и убыстрить.
TAB до недавнего времени был совершенно не вариант, потому как:
а) наши дурацкие СК на эксклюзивных глобусах, при обработке превращались в непредсказуемо что на эллипсоиде WGS84.
б) прописывалась кодировка "Neutral", что создавало проблемы с тестами в win1251 и путями с русскими буквами.
в) есть в mapinfo такая фенечка как границы карты, можно спорить это хорошо или плохо, но OGR по умолчанию из 3-градусной зоны делал +-360, что сильно портило данные. MIF был идеален в плане обработки, поскольку за его текстовые данные можно было быть уверенным, что OGR не станет их округлять или оптимизировать без команды.
В Ogr 1.11.x привлекла возможность использовать маску для указания имен файлов, но как мне кажется в 2.0 эта возможность исчезла.
В общем хотелось сложности и мощи, уж больно файлов было много, а данные в них приличным словом не описать "все в одном - и пармезан, и солярка", а приходится идти опять через итерации и промежуточные файлы.

Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: Ogr2ogr выборка из многих файлов в один через SQL

Сообщение Ariki » 02 окт 2015, 15:51

Boris писал(а): в) есть в mapinfo такая фенечка как границы карты, можно спорить это хорошо или плохо, но OGR по умолчанию из 3-градусной зоны делал +-360, что сильно портило данные.
В 2.0 есть возможность указать границы явно. Можно почитать здесь.
Boris писал(а): В Ogr 1.11.x привлекла возможность использовать маску для указания имен файлов, но как мне кажется в 2.0 эта возможность исчезла.
А это зависит от операционной системы. В UNIX-подобных маска разворачивается в список файлов шеллом, так что приложению не нужно об этом заботиться. В Windows, к сожалению, не так.

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

Re: Ogr2ogr выборка из многих файлов в один через SQL

Сообщение Boris » 04 окт 2015, 05:42

Ariki писал(а):
Boris писал(а): В Ogr 1.11.x привлекла возможность использовать маску для указания имен файлов, но как мне кажется в 2.0 эта возможность исчезла.
А это зависит от операционной системы. В UNIX-подобных маска разворачивается в список файлов шеллом, так что приложению не нужно об этом заботиться. В Windows, к сожалению, не так.
Я не специалист в UNIX-шелах, но в этом случае что передается список файлов или команда вызывается по числу файлов, попадающих в маску? Потому как если последнее, то MIF то все равно оказался не обновляемым, а цикл в шелле по файлам в маске, через команду FOR (убогую и тормозную,я признаю - не bash) можно слепить из командной строки и во Win.

maks24
Интересующийся
Сообщения: 21
Зарегистрирован: 27 авг 2014, 11:44
Репутация: 0
Откуда: Новосибирск

Re: Ogr2ogr выборка из многих файлов в один через SQL

Сообщение maks24 » 01 дек 2015, 14:40

Дмитрий Барышников писал(а):2Boris
1. Да, было верно замечено, что с mif append не работает. Но вот так у меня получилось:

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

$ ogr2ogr -f "MapInfo File" -nln sp_qqq sp_qqq.tab sp1.mif
$ ogr2ogr -f "MapInfo File" -append -nln sp_qqq sp_qqq.tab sp2.mif
$ ogr2ogr -f "MapInfo File" -append -nln sp_qqq sp_qqq.tab sp3.mif
Пытаюсь сделать тоже самая. Задача - объединить много миф файлов с одинаковой структурой в один.
Пробовал сначала с mif-ми. Не вышло. Попробовал через tab+mif, тоже не получается. tab+tab тоже не вышло.
ogr2ogr --version
GDAL 1.11.3, released 2015/09/16

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

ogr2ogr -f "mapinfo file" -update -nln sVodaRuchi -append tab\sVodaRuchi.tab 2\tab\sVodaRuchi.tab --config CPL_DEBUG ON
OGR: OGROpen(2\tab\sVodaRuchi.tab/0037B918) succeeded as MapInfo File.
OGR: OGROpen(tab\sVodaRuchi.tab) failed.
OGR: OGROpen(tab\sVodaRuchi.tab/0037ED08) succeeded as MapInfo File.
FAILURE:
Unable to open existing output datasource `tab\sVodaRuchi.tab'.

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

Re: Ogr2ogr выборка из многих файлов в один через SQL

Сообщение Boris » 01 дек 2015, 18:29

Если кому надо, то вот программа на VBS, выполняется без установки дополнительного ПО на всех WIn компьютерах, начиная с Win XP. Запуск из командной строки:
cscript mergeMIFs.vbs "одиночный_MIF" "объединенный_MIF"
mergeMIFs.7z
Предназначен для сбора множества MIF файлов одинаковой структуры в один объединенный файл.
(1.36 КБ) 343 скачивания

Ответить

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

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

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