komix
30-07-2014, 13:48
Имеется большое количество файлов с расширением tab (ГИС MapInfo) следующего вида:
!table
!version 300
!charset WindowsCyrillic
Definition Table
File "1-1.tif"
Type "RASTER"
(2426188.2551,926616.5365) (0,0) Label "Pt 1",
(2438713.8233,926968.4006) (5920,0) Label "Pt 2",
(2439065.6875,914442.8324) (5920,5920) Label "Pt 3",
(2426540.1193,914090.9682) (0,5920) Label "Pt 4"
CoordSys NonEarth Units "m"
Units "m"
RasterStyle 1 80
Этот файл необходим, чтобы "посадить" на координатную сетку растровую картинку с именем "1-1.tif", где между строками Type "RASTER" и CoordSys NonEarth Units "m" идут строки, в которых описываются в скобках сначала местные координаты, а затем координаты углов растра в пикселях. Все остальные строки в tab-файле постоянны. Растровые и tab файлы, как правило, именуются следующим образом:http://s017.radikal.ru/i426/1407/f6/f873d926f6fe.png
То есть, левый верхний угол является началом отсчета, а далее слева-направо сверху-вниз. Но это не предполагает что все файлы существуют. Набора, к примеру, 5-3.tab 5-3.tif, может не быть, а набор 6-3, 5-4 или 6-4 могут существовать.
Задача следующая: необходимо из всех tab файлов в папке создать один общий tab с такой же структурой, где координаты углов растра будут пересчитаны в соответствии с их номерами набора.
Написать данную часть скрипта не составило особых проблем. В моем исполнении выглядит она так:@echo off
set OutFile=%~n1.tab
if exist ..\%OutFile% del /q ..\%OutFile%
echo !table>..\%OutFile%
echo !version 300>>..\%OutFile%
echo !charset WindowsCyrillic>>..\%OutFile%
echo.>>..\%OutFile%
echo Definition Table>>..\%OutFile%
echo File "%OutFile:~0,-4%.tif">>..\%OutFile%
echo Type "RASTER">>..\%OutFile%
setlocal enableextensions enabledelayedexpansion
for %%a in (*.tab) do (
set File=%%~na
for /f "tokens=1,2 delims=-." %%b in ("!File!") do (
set /a yCount=%%b
set /a xCount=%%c
)
for /f "tokens=1,2,3,4 delims=,() " %%b in ('findstr /i "label" !File!.tab') do (
set MapX=%%b
set MapY=%%c
if %%d==0 (set /a PixelX=^(!xCount!-1^)^*5920) else (set /a PixelX=!xCount!*5920)
if %%e==0 (set /a PixelY=-^(!yCount!-1^)^*5920) else (set /a PixelY=-!yCount!*5920)
)
)
endlocal
echo CoordSys NonEarth Units "m">>..\%OutFile%
echo Units "m">>..\%OutFile%
echo RasterStyle 1 80>>..\%OutFile%
exit /b 0
Проблема заключается в том что соседние tab файлы имеют минимум одну, максимум две общих точки, то есть, при пересчете, в итоге, получается дубликат строки, а необходимо чтобы координаты (как местные, так и углов) были уникальные. На это месте я застрял. А также в конце каждой уникальной строки необходимо дописать Label "Pt N", где N порядковый номер строки (это, в принципе, я и сам сделаю). А еще, может быть, есть более логичное решение этой задачи, я для себя нашел только такое, если Вы найдете другой метод или упростите мой, с радостью его рассмотрю и учту в скрипте.
P.S. А еще меня в скрипте смущает то, что я при пересчете использую не переменную, а константу 5920 (координата для дальнего угла по любой из осей), можно ли сделать так чтобы это значение определялось скриптом и при этом не добавился еще один цикл. Так как, пока используется константа - скрипт не универсален для аналогичных задач.
!table
!version 300
!charset WindowsCyrillic
Definition Table
File "1-1.tif"
Type "RASTER"
(2426188.2551,926616.5365) (0,0) Label "Pt 1",
(2438713.8233,926968.4006) (5920,0) Label "Pt 2",
(2439065.6875,914442.8324) (5920,5920) Label "Pt 3",
(2426540.1193,914090.9682) (0,5920) Label "Pt 4"
CoordSys NonEarth Units "m"
Units "m"
RasterStyle 1 80
Этот файл необходим, чтобы "посадить" на координатную сетку растровую картинку с именем "1-1.tif", где между строками Type "RASTER" и CoordSys NonEarth Units "m" идут строки, в которых описываются в скобках сначала местные координаты, а затем координаты углов растра в пикселях. Все остальные строки в tab-файле постоянны. Растровые и tab файлы, как правило, именуются следующим образом:http://s017.radikal.ru/i426/1407/f6/f873d926f6fe.png
То есть, левый верхний угол является началом отсчета, а далее слева-направо сверху-вниз. Но это не предполагает что все файлы существуют. Набора, к примеру, 5-3.tab 5-3.tif, может не быть, а набор 6-3, 5-4 или 6-4 могут существовать.
Задача следующая: необходимо из всех tab файлов в папке создать один общий tab с такой же структурой, где координаты углов растра будут пересчитаны в соответствии с их номерами набора.
Написать данную часть скрипта не составило особых проблем. В моем исполнении выглядит она так:@echo off
set OutFile=%~n1.tab
if exist ..\%OutFile% del /q ..\%OutFile%
echo !table>..\%OutFile%
echo !version 300>>..\%OutFile%
echo !charset WindowsCyrillic>>..\%OutFile%
echo.>>..\%OutFile%
echo Definition Table>>..\%OutFile%
echo File "%OutFile:~0,-4%.tif">>..\%OutFile%
echo Type "RASTER">>..\%OutFile%
setlocal enableextensions enabledelayedexpansion
for %%a in (*.tab) do (
set File=%%~na
for /f "tokens=1,2 delims=-." %%b in ("!File!") do (
set /a yCount=%%b
set /a xCount=%%c
)
for /f "tokens=1,2,3,4 delims=,() " %%b in ('findstr /i "label" !File!.tab') do (
set MapX=%%b
set MapY=%%c
if %%d==0 (set /a PixelX=^(!xCount!-1^)^*5920) else (set /a PixelX=!xCount!*5920)
if %%e==0 (set /a PixelY=-^(!yCount!-1^)^*5920) else (set /a PixelY=-!yCount!*5920)
)
)
endlocal
echo CoordSys NonEarth Units "m">>..\%OutFile%
echo Units "m">>..\%OutFile%
echo RasterStyle 1 80>>..\%OutFile%
exit /b 0
Проблема заключается в том что соседние tab файлы имеют минимум одну, максимум две общих точки, то есть, при пересчете, в итоге, получается дубликат строки, а необходимо чтобы координаты (как местные, так и углов) были уникальные. На это месте я застрял. А также в конце каждой уникальной строки необходимо дописать Label "Pt N", где N порядковый номер строки (это, в принципе, я и сам сделаю). А еще, может быть, есть более логичное решение этой задачи, я для себя нашел только такое, если Вы найдете другой метод или упростите мой, с радостью его рассмотрю и учту в скрипте.
P.S. А еще меня в скрипте смущает то, что я при пересчете использую не переменную, а константу 5920 (координата для дальнего угла по любой из осей), можно ли сделать так чтобы это значение определялось скриптом и при этом не добавился еще один цикл. Так как, пока используется константа - скрипт не универсален для аналогичных задач.