Ogr2ogr выборка из многих файлов в один через SQL
-
- Гуру
- Сообщения: 4208
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Ogr2ogr выборка из многих файлов в один через SQL
Задача:
есть много (>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 , а как поступаю в случае векторных файлов?
есть много (>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 , а как поступаю в случае векторных файлов?
-
- Гуру
- Сообщения: 4107
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1081
- Ваше звание: программист
- Откуда: Казань
Re: Ogr2ogr выборка из многих файлов в один через SQL
я бы написал скрипт на R, в котором сформировал список файлов, а потом делал выборки в цикле: либо грузил последовательно в R, если он поля не режет, и там собирал результат, либо запускал из R ogr2ogr, потом читал MIF/MID как текстовые файлы (без парсинга), обрезал им заголовки (всем, кроме первого), и копировал в хвост первому.
- Дмитрий Барышников
- Гуру
- Сообщения: 2572
- Зарегистрирован: 17 ноя 2009, 19:17
- Репутация: 261
- Откуда: Москва
Re: Ogr2ogr выборка из многих файлов в один через SQL
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 по какому-то полю.
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 по какому-то полю.
-
- Гуру
- Сообщения: 731
- Зарегистрирован: 12 янв 2011, 22:40
- Репутация: 304
- Ваше звание: ∀
Re: Ogr2ogr выборка из многих файлов в один через SQL
Boris писал(а): чем можно заменить формат SHP без потери в качестве данных и параметрах проекции, с учетом того, что потом придется делать конвертацию в MIF ?
MIF - текстовый формат, он произвольного доступа не поддерживает. Логично было бы использовать TAB, но нужен GDAL 2.0.Дмитрий Барышников писал(а): MapInfo формат обновляемый:
ogr2ogr --formats | grep MapInfo
MapInfo File -vector- (rw+v): MapInfo File
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.
-
- Гуру
- Сообщения: 4107
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1081
- Ваше звание: программист
- Откуда: Казань
Re: Ogr2ogr выборка из многих файлов в один через SQL
значит, таки просто режем и клеим текстовые файлы, невзирая не структуру
-
- Гуру
- Сообщения: 4208
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Re: Ogr2ogr выборка из многих файлов в один через SQL
Ok!
0/ клеить и резать (не понял зачем резать), я таки умею, это тривиально в любом языке программирования, ну может за исключением очень специальных. Хотелось стандартности в работе, а не самодеятельности.
1/ ogr2ogr -append у меня как раз и не сработал. на 2-ом файле в списке
в GDAL 1.11.3, released 2015/09/16
3/ т.е. VRT для объединения многих в один виртуальный - не вариант?
---
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 2.0.0dev, released 2014/04/16FAILURE: Couldn't fetch requested layer 'id_00002.mif'!
2/ так я этого и хочу. мне потом еще за OGR mif Файл править - кодировку устанавливать, лишние скобки удалять, границы карты вычислять, и это не одном файле гораздо приятней делать, чем на 1000. И так уж сложилось, что я не Mapinfo TAB не очень доверяю. В них все в одном - ни подкрутить, ни настроить.Unable to open datasource `*.mif' with the following drivers.
3/ т.е. VRT для объединения многих в один виртуальный - не вариант?
---
-
- Гуру
- Сообщения: 5313
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1017
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Ogr2ogr выборка из многих файлов в один через SQL
В БД всё засунуть и не мучатся
-
- Гуру
- Сообщения: 4107
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1081
- Ваше звание: программист
- Откуда: Казань
Re: Ogr2ogr выборка из многих файлов в один через SQL
отрезать заголовки всем, кроме первого. Чего проще-то и универсальнее?Boris писал(а):клеить и резать (не понял зачем резать),
-
- Гуру
- Сообщения: 977
- Зарегистрирован: 27 янв 2009, 22:57
- Репутация: 258
Re: Ogr2ogr выборка из многих файлов в один через SQL
Возможно дело и не в этом, но у меня тоже были проблемы работы ogr2ogr.
Список mif файлов в массив:* экспорт mif в shp в цикле:
*обрезка
У меня заработал в цикле вариант ogr2ogr из папки C:\osgeo4w\bin\ogr2ogr.exe
Или например обрезка не работает, если в слое есть полигоны и мультиполигоны.
В общем я солидарен с gamm.
Список 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
Код: Выделить всё
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
Или например обрезка не работает, если в слое есть полигоны и мультиполигоны.
В общем я солидарен с gamm.
- Дмитрий Барышников
- Гуру
- Сообщения: 2572
- Зарегистрирован: 17 ноя 2009, 19:17
- Репутация: 261
- Откуда: Москва
Re: Ogr2ogr выборка из многих файлов в один через SQL
2Boris
1. Да, было верно замечено, что с mif append не работает. Но вот так у меня получилось:
В принципе в конце можно же вот так сделать:
И получить искомый глобальный mif
3. Мне кажется не вариант. Во всяком случае я не знаю, как объединить файлы пристыковав один к другому.
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
3. Мне кажется не вариант. Во всяком случае я не знаю, как объединить файлы пристыковав один к другому.
-
- Гуру
- Сообщения: 4208
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Re: Ogr2ogr выборка из многих файлов в один через SQL
Всем спасибо за советы! Пойду копать.
Утилитой для объединения MIF я владею уже более 10 лет, но как всегда хотелось хоть что то улучшить и убыстрить.
TAB до недавнего времени был совершенно не вариант, потому как:
а) наши дурацкие СК на эксклюзивных глобусах, при обработке превращались в непредсказуемо что на эллипсоиде WGS84.
б) прописывалась кодировка "Neutral", что создавало проблемы с тестами в win1251 и путями с русскими буквами.
в) есть в mapinfo такая фенечка как границы карты, можно спорить это хорошо или плохо, но OGR по умолчанию из 3-градусной зоны делал +-360, что сильно портило данные. MIF был идеален в плане обработки, поскольку за его текстовые данные можно было быть уверенным, что OGR не станет их округлять или оптимизировать без команды.
В Ogr 1.11.x привлекла возможность использовать маску для указания имен файлов, но как мне кажется в 2.0 эта возможность исчезла.
В общем хотелось сложности и мощи, уж больно файлов было много, а данные в них приличным словом не описать "все в одном - и пармезан, и солярка", а приходится идти опять через итерации и промежуточные файлы.
Утилитой для объединения MIF я владею уже более 10 лет, но как всегда хотелось хоть что то улучшить и убыстрить.
TAB до недавнего времени был совершенно не вариант, потому как:
а) наши дурацкие СК на эксклюзивных глобусах, при обработке превращались в непредсказуемо что на эллипсоиде WGS84.
б) прописывалась кодировка "Neutral", что создавало проблемы с тестами в win1251 и путями с русскими буквами.
в) есть в mapinfo такая фенечка как границы карты, можно спорить это хорошо или плохо, но OGR по умолчанию из 3-градусной зоны делал +-360, что сильно портило данные. MIF был идеален в плане обработки, поскольку за его текстовые данные можно было быть уверенным, что OGR не станет их округлять или оптимизировать без команды.
В Ogr 1.11.x привлекла возможность использовать маску для указания имен файлов, но как мне кажется в 2.0 эта возможность исчезла.
В общем хотелось сложности и мощи, уж больно файлов было много, а данные в них приличным словом не описать "все в одном - и пармезан, и солярка", а приходится идти опять через итерации и промежуточные файлы.
-
- Гуру
- Сообщения: 731
- Зарегистрирован: 12 янв 2011, 22:40
- Репутация: 304
- Ваше звание: ∀
Re: Ogr2ogr выборка из многих файлов в один через SQL
В 2.0 есть возможность указать границы явно. Можно почитать здесь.Boris писал(а): в) есть в mapinfo такая фенечка как границы карты, можно спорить это хорошо или плохо, но OGR по умолчанию из 3-градусной зоны делал +-360, что сильно портило данные.
А это зависит от операционной системы. В UNIX-подобных маска разворачивается в список файлов шеллом, так что приложению не нужно об этом заботиться. В Windows, к сожалению, не так.Boris писал(а): В Ogr 1.11.x привлекла возможность использовать маску для указания имен файлов, но как мне кажется в 2.0 эта возможность исчезла.
-
- Гуру
- Сообщения: 4208
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Re: Ogr2ogr выборка из многих файлов в один через SQL
Я не специалист в UNIX-шелах, но в этом случае что передается список файлов или команда вызывается по числу файлов, попадающих в маску? Потому как если последнее, то MIF то все равно оказался не обновляемым, а цикл в шелле по файлам в маске, через команду FOR (убогую и тормозную,я признаю - не bash) можно слепить из командной строки и во Win.Ariki писал(а):А это зависит от операционной системы. В UNIX-подобных маска разворачивается в список файлов шеллом, так что приложению не нужно об этом заботиться. В Windows, к сожалению, не так.Boris писал(а): В Ogr 1.11.x привлекла возможность использовать маску для указания имен файлов, но как мне кажется в 2.0 эта возможность исчезла.
-
- Интересующийся
- Сообщения: 21
- Зарегистрирован: 27 авг 2014, 11:44
- Репутация: 0
- Откуда: Новосибирск
Re: Ogr2ogr выборка из многих файлов в один через SQL
Пытаюсь сделать тоже самая. Задача - объединить много миф файлов с одинаковой структурой в один.Дмитрий Барышников писал(а):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'.
-
- Гуру
- Сообщения: 4208
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Re: Ogr2ogr выборка из многих файлов в один через SQL
Если кому надо, то вот программа на VBS, выполняется без установки дополнительного ПО на всех WIn компьютерах, начиная с Win XP. Запуск из командной строки:
cscript mergeMIFs.vbs "одиночный_MIF" "объединенный_MIF"
cscript mergeMIFs.vbs "одиночный_MIF" "объединенный_MIF"
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей