добавить атрибут(столбец) в mif

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

добавить атрибут(столбец) в mif

Сообщение maks24 » 21 мар 2016, 13:14

Необходимо добавить поле в mif файлах и записать туда значение.
Для начала пытаюсь вставить столбец.
Пробую это реализовать через ogr2ogr и sqlite диалог аналогично примеру из статьи, но не получается. Попробовал тоже самое с шейпом - аналогично. Пишет что не видит таблицу :?:

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

ogrinfo -dialect sqlite -sql "ALTER TABLE h_i ADD COLUMN city char(254) AFTER class" h_i.shp
INFO: Open of `h_i.shp'    using driver `ESRI Shapefile' successful.
ERROR 1: In ExecuteSQL(): sqlite3_prepare(ALTER TABLE h_i ADD COLUMN city char(254) AFTER class):
  no such table: h_i

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

Re: добавить атрибут(столбец) в mif

Сообщение Boris » 21 мар 2016, 14:16

Где ссылка на статью? Где версия GDAL? Откуда уверенность, что драйвер MIF является обновляемым?

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

F:\#Tmp\orto\#1>ogrinfo -dialect sqlite -sql "ALTER TABLE QZ001 ADD COLUMN city char(254) AFTER ID1" QZ001.MIF
Had to open data source read-only.
INFO: Open of `QZ001.MIF'
      using driver `MapInfo File' successful.
ERROR 1: In ExecuteSQL(): sqlite3_prepare(ALTER TABLE QZ001 ADD COLUMN city char(254) AFTER ID1):
  no such table: QZ001

F:\#Tmp\orto\#1>ogrinfo -sql "ALTER TABLE QZ001 ADD COLUMN city varchar(254) AFTER ID1" QZ001.MIF
Had to open data source read-only.
INFO: Open of `QZ001.MIF'
      using driver `MapInfo File' successful.

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

Re: добавить атрибут(столбец) в mif

Сообщение maks24 » 21 мар 2016, 14:42

статья

Насчёт mif не уверен, а точнее уже сталкивался что с ним номер не проходит. Поэтому выше написал что пробовал на шейпе. Ошибку насчёт таблицы пишет. Но на самом деле поле добавить получается. Однако если у кого есть решение для mif файлов, хотелось бы о нём узнать. Потому что прогонять через шейпы это проблемы с кодировками и возможно ещё какиенибудь всплывут.

В других случаях проблему того что mif не обновляемый решал записью данного mif-a в другой с префиксом через ogr2ogr. Например сдвиг координат
ogr2ogr -f "mapinfo file" -dialect sqlite -sql "SELECT ShiftCoords(geometry,40075014.13,0), * FROM lay1" 2lay1.mif lay1.mif

Но можно ли приспособить команду alter table к ogr2ogr?

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

Re: добавить атрибут(столбец) в mif

Сообщение trir » 21 мар 2016, 15:12

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.
http://www.gdal.org/drv_mitab.html

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

Re: добавить атрибут(столбец) в mif

Сообщение Boris » 21 мар 2016, 16:35

Я понимаю, что это тема про GDAL и кучу интересных функций, но для того, что бы добавить в MIF колонку прогонять его через OGR? ПО моему, это муху - микроскопом. MIF/MID - это же линейный текстовый файл.
Уверен на 100% , что MapInfo такие задачи решает создавая копию таблицы и затирая ею исходную. Для чего такая трепетность - "Нет, только без создания копий!"?

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

Re: добавить атрибут(столбец) в mif

Сообщение maks24 » 22 мар 2016, 06:27

trir, спасибо, сейчас буду пробовать через tab. Если правильно текст понял..

Boris, согласен что достаточно простой формат, добавить колонку это посути в файле mif вставить строчку типа city char(20) и прибавить 1 к числу атрибутов. А в миде поставить запятую после всех атрибутов. Но сам я не сказать что програмирую, поэтому написать скрипт с такой обработкой займёт у меня не разумное кол-во времени.
По поводу прогонять через мапинфо. Задачу необходимо решить пакетно, иначе смысл теряется, у меня порядка 200 карт разнородного материала, и пакетно с ними я ещё другие штуки проделываю. Т.е. так что бы можно было запустить cmd скрипт в командной строке. С этим отлично справляется огр, либо другие утилиты запускающиеся из командной строки. И если кто-то знает простую такую утилиту, буду рад слышать.
Вот к примеру как я хотел реализовать, еслибы mif был перезаписываемый:
for /d %%i in (*) do (for %%n in (%%i\h_*.mif) do ogrinfo -sql "ALTER TABLE %%~nn ADD COLUMN city char(254) AFTER class" %%i\%%~nxn)
Затем можно запустить такой же цикл с поочередным открыванием папок и нужных mif-фов для добавление в это поле имя папки (в моём случае это и нужно сделать, т.к. имя папки это название населённого пункта, а мне его как раз не хватает в семантике).

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

Re: добавить атрибут(столбец) в mif

Сообщение maks24 » 22 мар 2016, 07:29

Boris, кстати насчёт создания копий то я не против. Есть идеи как запустить команду alter table в огр2огр с записью в копию?

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

Re: добавить атрибут(столбец) в mif

Сообщение maks24 » 22 мар 2016, 09:26

Спасибо что навели на правильное решение. С tab действительно работает перезапись, но например в моей версии GDAL 2.0.0dev, released 2014/04/16 работать не захотело. И почему-то мало в каких сборках используется gdal 2 и более.
Нашёл в сборке Мапсервера MS4W GDAL 2.0.2, released 2016/01/26
В нём всё получилось через tab файлы.
Скрипт в итоге такой, может кому пригодится:

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


rem конвертируем mif в tab внутри всех подкаталогов
for /d %%i in (*) do (for %%n in (%%i\*.mif) do ogr2ogr -f "mapinfo file" %%i\%%~nn.tab %%i\%%~nxn)

rem добавляем атрибут city после атрибута class (для файлов с тремя разными масками - три цикла отдельно)

for /d %%i in (*) do (for %%n in (%%i\h_*.tab) do ogrinfo -sql "ALTER TABLE %%~nn ADD COLUMN city varchar(254) AFTER class" %%i\%%~nxn)
for /d %%i in (*) do (for %%n in (%%i\*road.tab) do ogrinfo -sql "ALTER TABLE %%~nn ADD COLUMN city varchar(254) AFTER class" %%i\%%~nxn)
for /d %%i in (*) do (for %%n in (%%i\*city.tab) do ogrinfo -sql "ALTER TABLE %%~nn ADD COLUMN city varchar(254) AFTER class" %%i\%%~nxn)

rem добавляем наименование города по имени папки (для файлов с тремя разными масками - три цикла отдельно)

for /d %%i in (*) do (for %%n in (%%i\h_*.tab) do ogrinfo -dialect sqlite -sql "UPDATE '%%~nn' SET city = '%%i'" %%i\%%~nxn)
for /d %%i in (*) do (for %%n in (%%i\*road.tab) do ogrinfo -dialect sqlite -sql "UPDATE '%%~nn' SET city = '%%i'" %%i\%%~nxn)
for /d %%i in (*) do (for %%n in (%%i\*city.tab) do ogrinfo -dialect sqlite -sql "UPDATE '%%~nn' SET city = '%%i'" %%i\%%~nxn)

rem конвертируем обратно tab в mif. MIF при этом старый затирается новым.
for /d %%i in (*) do (for %%n in (%%i\*.tab) do ogr2ogr -f "mapinfo file" %%i\%%~nn.mif %%i\%%~nxn)

rem удаляем файлы tab из папок
SetLocal EnableExtensions
set mask=.tab, .dat, .map, .id, .ind
for %%e in (%mask%) do del /f /a /q /s "*%%e"

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

Re: добавить атрибут(столбец) в mif

Сообщение Boris » 22 мар 2016, 15:06

В Mapinfo есть MapBasic, хотя это раздел про OGR, но гвозди удобней забивать молотком. Я сам MapBasic как среду программирования не люблю. Поэтому использую механизмы прямого обращения к MapInfo через OLE, благо это умеет любой язык программирования, в том числе и встроенные в Windows JavaScript и VBScript. Для массовой обработки TAB файлов при наличии MapInfo лучше использовать команды MapBasic-а пересылая их MapInfo на прямую. Любой тестовый файл с командами MapBasic, не использующих проверку условий и циклы, можно вставить в окно MapBasic и выполнить выделив его целиком. Это не всегда удобно, поэтому я использую самодельную программу на VBScript, которая запускается на любом компьютере Windows с XP и выше:

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

cscript.exe doMapbasic_in_MapInfo.vbs %1 %2 %3
Программа doMapbasic_in_MapInfo.vbs читает входной файл с командами
на языке MapBasic и выполняет их в одной из запущенных копий программы MapInfo
' параметры:
' doMapbasic_in_MapInfo.vbs %1 [%2] [%3]
' %1 - "имя входного файла с командами"
' %2 - параметр 'останавливаться при ошибках' - Yes/No. По умолчанию - "Yes"
' %3 - log="имя файла, в который записывается порядок выполнения команд"
' по умолчанию - это файл "doMapbasic_in_MapInfo.vbs.LOG"
' в текущем каталоге запуска команды.
'
Вложения
doMapbasic_in_MapInfo.vbs.7z
выкладывается повторно.
(10.38 КБ) 394 скачивания

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

Re: добавить атрибут(столбец) в mif

Сообщение maks24 » 23 мар 2016, 10:47

Boris. Интересный вариант. Было бы интересно увидеть решение поставленной задачи такими средствами.
В любом случае как я понял необходимо наличие mapinfo, изучить немного mapbasic и VBScript.

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

Re: добавить атрибут(столбец) в mif

Сообщение Boris » 23 мар 2016, 11:19

Наличие MapInfo - обязательное условие, команды mapbasic - факультативо, VBScript - не обязательно, т.к. "посылатель" команд уже написан в присланном модуле. ПРограмма просто читает входной текстовый файл с командами на mapbasic и пересылает его работающей копии MapInfo. Каждая команда и результат ее выполнения отображается в окне "Info". Список команд mapbasic обычно мною создается так:
1. открывается окно mapbasic. раньше это было в меню "опции", с леточным интерфейсом - не знаю где :(
2. выполняется последовательность команд для одной таблицы.
3. обязательно закрывается эта таблица, иначе на 127 (или 1023) открытом файле mapinfo выдаст ошибку.
4. копируется полученный текст и по его образцу создается набор команд командой FOR командной строки (это как я видел для вас не проблема).
5. полученный текстовый файл задается как 1-ый параметр в "cscript.exe doMapbasic_in_MapInfo.vbs %1 %2 %3"
Для простоты обработки можно применить небольшой трюк открывать все таблицы для обработки с одним именем, например А, используя команду "Open Table "путь к файлу" As A". Тогда вся обработка требует единственной переменной - пути к открываемому файлу.
При наличии такого скрипта командной строки любые повторяющие действия, особенно импорт-экспорт, сжатие, перестроение, которые занимают всего одну строку, требуют минимума времени.
Самая трудоемкая операция, которая мною так выполнялась - экспорт огромной карты на Московскую область с подложкой снимком 2.5 м/пиксель и кучей слоев в масштабе 1:10000 в набор растров через команду "экспорт окна": бралась сетка и по ней осуществлялся перебор - центрировать в окне, задать масштаб, экспортировать в файл, перейти к следующей ячейке-планшету. Работало почти сутки, но все файлы получились. Обычная печать из рабочего набора умирала где-то на 4 часу.

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

Re: добавить атрибут(столбец) в mif

Сообщение maks24 » 23 мар 2016, 13:38

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

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

Re: добавить атрибут(столбец) в mif

Сообщение Boris » 23 мар 2016, 15:58

Если я правильно понял вопрос, то - Да. Подготовленный рабочий набор, который был слишком объемен для вывода стандартными средствами на печать в требуемом масштабе, удалось вывести по странично, путем экспорта окна. В основном из-за растра, но и векторных слоев и оформления там было богато, окно карты через стандартный интерфейс "многостраничный отчет" не выводилось. Вывод его как одного окна с последующим делением в фотошопе или еще как не проходил из-за растра, который превышал возможности MapInfo, не смотря на то, что на компьютере имелся покупной программный растеризатор в растр, в смысле не Adobe Acrobat.

Ответить

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

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

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