#!/usr/bin/perl -w
# -*- perl -*-

#
# $Id: globe_to_bbd.pl,v 1.3 2000/07/26 00:18:36 eserte Exp $
# Author: Slaven Rezic
#
# Copyright (C) 2000 Slaven Rezic. All rights reserved.
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
# Mail: eserte@cs.tu-berlin.de
# WWW:  http://user.cs.tu-berlin.de/~eserte/
#

use FindBin;
use lib ("$FindBin::RealBin/..", "$FindBin::RealBin/../data");
use GIS::Globe;
use Karte;
use Getopt::Long;
use Strassen;
use strict;

my $only_berlin = 0;
GetOptions("berlin!" => \$only_berlin);

Karte::preload("Standard", "Polar");
my $std = new Karte::Standard;
my $pol = new Karte::Polar;

my $gis = new GIS::Globe -file => "$FindBin::RealBin/../misc/globe/berlin";
$gis->read_files;

my($from_x, $to_x);
my($from_y, $to_y);

if ($only_berlin) {
    my($min_x, $max_x, $min_y, $max_y) = get_berlin_borders();
    my($min_polar_x, $min_polar_y) = $std->map2map($pol, $min_x, $min_y);
    my($max_polar_x, $max_polar_y) = $std->map2map($pol, $max_x, $max_y);
    my($min_inx_x, $min_inx_y)     = $gis->polar_to_index($min_polar_x,
							  $min_polar_y);
    my($max_inx_x, $max_inx_y)     = $gis->polar_to_index($max_polar_x,
							  $max_polar_y);

    $from_x = min($min_inx_x, $max_inx_x);
    $from_y = min($min_inx_y, $max_inx_y);

    $to_x = max($min_inx_x, $max_inx_x);
    $to_y = max($min_inx_y, $max_inx_y);

} else {
    ($from_x, $to_x) = (0, $gis->{Header}{number_of_columns}-1);
    ($from_y, $to_y) = (0, $gis->{Header}{number_of_rows}-1);
}

for my $y ($from_y .. $to_y) {
    for my $x ($from_x .. $to_x) {
	my($h, $polar_x, $polar_y) = $gis->get_data_by_index($x, $y);
	if (defined $h) {
	    my($std_x,$std_y) = $pol->map2map($std, $polar_x, $polar_y);
	    print "$h\tX $std_x,$std_y\n";
	}
    }
}

sub get_berlin_borders {
    my $s = new Strassen "berlin";
    my($min_x, $max_x, $min_y, $max_y);
    while(1) {
	my $ret = $s->next;
	last if !@{$ret->[1]};
	for (@{$ret->[1]}) {
	    my($x,$y) = split /,/;
	    $min_x = $x if !defined $min_x || $x < $min_x;
	    $max_x = $x if !defined $max_x || $x > $max_x;
	    $min_y = $y if !defined $min_y || $y < $min_y;
	    $max_y = $y if !defined $max_y || $y > $max_y;
	}
    }
    ($min_x, $max_x, $min_y, $max_y);
}

# REPO BEGIN
# REPO NAME max /home/e/eserte/src/repository 
# REPO MD5 cb5508697ccc4e13310c7c8848d48052
=head2 max(...)

Return maximum value.

=cut

sub max {
    my $max = $_[0];
    foreach (@_[1..$#_]) {
	$max = $_ if $_ > $max;
    }
    $max;
}
# REPO END

# REPO BEGIN
# REPO NAME min /home/e/eserte/src/repository 
# REPO MD5 6c10863fe5f2cd682c411b802912d26c
=head2 min(...)

Return minimum value.

=cut

sub min {
    my $min = $_[0];
    foreach (@_[1..$#_]) {
	$min = $_ if $_ < $min;
    }
    $min;
}
# REPO END

__END__
