#!/usr/bin/perl # Convert wgs84 to clark80 as example of a lat-long to lat-long conversion. use strict; use warnings; use Test::More tests => 21; use lib qw[blib/lib blib/arch]; use_ok('Geo::Proj4'); my $version = Geo::Proj4->libVersion; ok(defined $version, "library version $version"); ok(1,'Start testing Lat/Long to/from UTM'); my $from = Geo::Proj4->new(proj => 'latlong', ellps => 'WGS84'); defined $from or die Geo::Proj4->error; isa_ok($from, "Geo::Proj4"); is($from->normalized, '+proj=latlong +ellps=WGS84'); ok($from->isLatlong); ok($from->isGeodesic); ok(not $from->isGeocentric); my $proj = Geo::Proj4->new("+proj=latlong +ellps=clrk80"); isa_ok($proj, "Geo::Proj4"); defined $proj or die Geo::Proj4->error; is($proj->normalized, '+proj=latlong +ellps=clrk80'); ok($proj->isLatlong); ok($proj->isGeodesic); ok(not $proj->isGeocentric); #$from->dump; #$proj->dump; # convert from wgs84 to clark80 my @rv = ( { name => "imaginary" , wgs_lat => 38.40249 , wgs_long => -122.82888 , cl_lat => 38.40249 , cl_long => -122.82888 } ); sub about($$$) { my ($float1, $float2, $text) = @_; my $dist = abs($float1/$float2 -1); if($dist < 0.0001) { ok(1, $text) } else { my $percent = sprintf "%.6f", $dist; ok(0, "$text fail: $float1/$float2 $percent%"); } } foreach my $c (@rv) { my $point = [ $c->{wgs_long}, $c->{wgs_lat} ]; my $pr = $from->transform($proj, $point); my ($cl_long, $cl_lat) = @$pr; about($cl_lat, $c->{cl_lat}, "$c->{name} forward clark80 lat"); about($cl_long, $c->{cl_long}, "$c->{name} forward clark80 long"); my $w_pr = $proj->transform($from, [$cl_long, $cl_lat] ); my ($w_long, $w_lat) = @$w_pr; about($w_lat, $c->{wgs_lat}, "$c->{name} inverse lat"); about($w_long, $c->{wgs_long}, "$c->{name} inverse long"); } # # repeated forward-inverse # my $one = $rv[0]; my ($w_lat, $w_long) = @{$one}{ qw/wgs_lat wgs_long/ }; my ($cl_lat, $cl_long); for (1..10) { ($cl_long, $cl_lat) = $proj->forward($w_lat, $w_long); ($w_lat, $w_long) = $proj->inverse($cl_long, $cl_lat); } about($w_lat, $one->{wgs_lat}, "Run 10 wgs_lat"); about($w_long, $one->{wgs_long}, "Run 10 wgs_long"); about($cl_lat, $one->{cl_lat}, "Run 10 cl_lat"); about($cl_long, $one->{cl_long}, "Run 10 cl_long");