#!/usr/bin/perl -w 
# Лицензия "Делайте что хотите", а если очень нужно, то GPL :) 
# Сообщения на английском, чтобы не связываться с локалями и gettext :( .
# Кроме стандартных расширений perl необходим модуль perl::Magick.
#
# Эта программа предназначена для создания файла привязки qpegps из .MAP файлов OZI
# Достаточно корректно обрабатывает файлы привязки километровок Генштаба центра России.
# Все координаты - в десятичных долях градусов

use POSIX;
use File::Basename;
use Image::Magick;
use encoding 'cp1251';


sub degtodec($) { # Градусы в десятичные доли
my ($deg) = @_;
my $res;

    if ($deg > 0) { 
	$res = floor(100/(60/$deg)); #защита от бесконечных дробей
	if ($res == 33) {$res = 3333}; 
	if ($res == 66) {$res = 6667}; 
	$res =~ s/0*$//; # Убрать лишние нули
	return $res;
    } else {
	return 0;
    };
};

sub readozimapfile ($$) {
my ($mapfname, $res) = @_;
my @tmp;
my %point;

    open (IN, $mapfname) or  die "Cannot open $mapfname!";    
    while(<IN>) {
	chomp;
	s/\s//g;
	if (m/^Point/) { # Смотрим только строки с записью точек
	#    print $_."\n";
	    @tmp = split(',', $_);
	    $c = 0;
	    foreach $element (@tmp) { # просматриваем порезанную на части строку и выбираем только цифры 
	        if ($element and not $element =~ m/[a-z]/i ) {
		    ++$c; # счет элементов
		    if ($c == 1) { $point{x} = $element; };
		    if ($c == 2) { $point{y} = $element; };
		    if ($c == 3) { $point{lon} = $element; };
		    if ($c == 4) { unless ($element == 0) {$point{lon} .= ".".degtodec($element); }};
		    if ($c == 5) { $point{lat} = $element; };
		    if ($c == 6) { unless ($element == 0) {$point{lat} .= ".".degtodec($element); }};
		};		
	    };		
	};
	if ($point{x} and $point{y} and $point{lon} and $point{lat}) {
	    if ($point{x} < 500 and $point{y} < 500) { # Верхняя-левая точка
		${$res}{x1} = $point{x};
		${$res}{y1} = $point{y};
		${$res}{lon1} = $point{lon};
		${$res}{lat1} = $point{lat};
	    };
	    if ($point{x} > 1500 and $point{y} > 1500) { # нижняя-правая точка
		${$res}{x2} = $point{x};
		${$res}{y2} = $point{y};
		${$res}{lon2} = $point{lon};
		${$res}{lat2} = $point{lat};
	    };
	};	
	undef %point;
    };
    close (IN);
};


if ( not $#ARGV + 1) { 
    print "OZI .MAP converter v.0.1\n";
    print "\ngpsozitoqpe FILENAME.MAP\n";
    print "\nThis script will convert OZI .MAP files for GENSHTAB maps into qpegps format.\n";	
} else { 

my $mapfname = $ARGV[0];
my $suffixes = "\.[G|g][I|i][F|f]|\.[J|j][P|p][G|g]|\.[P|p][N|n][G|g]|\.[B|b][M|m][P|p]|\.[M|m][A|a][P|p]";
my ($basemapname, $path) = fileparse($mapfname, $suffixes);
   $pngfname = $path.$basemapname.".png"; # считаем, что картинки уже преобразованы
my $scale = 100000; # 1:100000 у нас только километровки
my ($basemap_x, $basemap_y, $basemapclass);
my ($first_x, $first_y, $first_lon, $first_lat);
my ($secnd_x, $secnd_y, $secnd_lon, $secnd_lat);
my %mapkoords; #x1 y1 lon1 lat1 x2 y2 lon2 lat2


    readozimapfile($mapfname, \%mapkoords);
    
    print "Reading $pngfname...\n";
    $bigmap=Image::Magick->new(); # Чтение картинки (долго)
    $x=$bigmap->ReadImage($pngfname);
    warn "$x" if "$x";
    ($basemap_x, $basemap_y, $basemapclass)=$bigmap->Get('width', 'height', 'class'); # Получение свойств картинки
    undef $bigmap;

    open (QGPS, ">> maps.txt");    
	    print QGPS "LINEAR $basemapname.png $scale $basemap_x $basemap_y $mapkoords{lat1} $mapkoords{lon1} $mapkoords{x1} $mapkoords{y1} $mapkoords{lat2} $mapkoords{lon2} $mapkoords{x2} $mapkoords{y2}\n"; # qpegps
    close (QGPS);
};
    


