# Toby Thurston --- 7 Sep 2007 # first test by taking ten random pairs of long/lat in the range of # the British Isles 1E -- 6W, 49N -- 59N and checking that we # can convert back and forth with an error of less than 10cm, which # roughly corresponds to $eps of 0.00001 use Geo::Coordinates::OSGB qw( ll_to_grid grid_to_ll format_grid_landranger format_grid_trad parse_landranger_grid parse_GPS_grid format_ll_ISO format_ll_trad shift_ll_into_WGS84 shift_ll_from_WGS84 ); use Test::Simple tests => 44; use strict; # test for some edge conditions first my ($sq, $e, $n, @sheets) = format_grid_landranger(320000,305000); # NE corner of Sheep 136 ok( $sq eq 'SJ' && $e == 200 && $n == 50, "$sq $e $n @sheets" ); my $f = format_grid_trad(parse_landranger_grid($sheets[0],sprintf("%03d",$e),sprintf("%03d",$n))); ok( 'SJ 200 050' eq $f, $f); ($sq, $e, $n, @sheets) = format_grid_landranger(280000,265000); # SW corner of Sheep 136 ok( $sq eq 'SN' && $e == 800 && $n == 650, "$sq $e $n @sheets" ); $f = format_grid_trad(parse_landranger_grid($sheets[1],sprintf("%03d",$e),sprintf("%03d",$n))); ok( 'SN 800 650' eq $f, $f); my $eps = 0.0001; for (1..10) { my $phi = rand() * 2 + 51; # 51 -- 53 my $lam = rand() * 2 - 1 ; # -1 -- +1 my ($E,$N) = ll_to_grid($phi,$lam); my ($ph2,$la2) = grid_to_ll($E,$N); ok( abs($phi-$ph2)<$eps && abs($lam-$la2)<$eps, sprintf "Grid/LL: %s=%s", format_ll_trad($phi, $lam), format_ll_trad($ph2+5, $la2) ); } for (1..10) { my $phi = rand() * 3 + 51; # 51 -- 54 my $lam = rand() * 3 - 2 ; # -2 -- +1 my ($p84,$l84) = shift_ll_into_WGS84($phi,$lam); my ($ph2,$la2) = shift_ll_from_WGS84($p84,$l84); ok( abs($phi-$ph2)<$eps && abs($lam-$la2)<$eps, sprintf "WGS84/LL: %s=%s", format_ll_ISO($phi, $lam), format_ll_ISO($ph2, $la2) ); } # now test 20 random grid locations and cycle them through grid -> short grid -> map my @fully_covered_squares = qw(NN SE SK SP SU); for my $i (1..20) { my $rand_gr = sprintf "%s %05d %05d", $fully_covered_squares[int(rand(4))], int(rand(99999)), int(rand(99999)); my ($e, $n) = parse_GPS_grid($rand_gr); my ($gr1, $gr2, @sheets); (undef, $e, $n, @sheets) = format_grid_landranger($e,$n); if ( @sheets ) { $gr1 = map_to_grid($sheets[0],sprintf("%03d",$e),sprintf("%03d",$n)); $gr2 = format_grid_trad( ll_to_grid( grid_to_ll( parse_landranger_grid($sheets[0],sprintf("%03d",$e),sprintf("%03d",$n)) ) ) ); } ok( @sheets && ($gr1 eq $gr2) , "GR$i: $gr1=$gr2 $rand_gr ". scalar @sheets ); } sub map_to_grid { return format_grid_trad(parse_landranger_grid(@_)) }