Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Уникальность строк в файле на выходе (http://forum.oszone.net/showthread.php?t=285773)

komix 30-07-2014 13:48 2383171

Уникальность строк в файле на выходе
 
Имеется большое количество файлов с расширением 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 файлы, как правило, именуются следующим образом:

То есть, левый верхний угол является началом отсчета, а далее слева-направо сверху-вниз. Но это не предполагает что все файлы существуют. Набора, к примеру, 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 (координата для дальнего угла по любой из осей), можно ли сделать так чтобы это значение определялось скриптом и при этом не добавился еще один цикл. Так как, пока используется константа - скрипт не универсален для аналогичных задач.


Время: 19:51.

Время: 19:51.
© OSzone.net 2001-