Please note that I didn't pay a lot of attention to
keeping the "double" notation in the form of higher
precision floating point routines. This means that
the Perl5 code won't be as accurate as the original
C-code. It doesn't matter for my purposes. If
anyone converts to Math::BigFloat for higher precision,
please send me the changes. As it is I did a
quick check and found a difference of only 1.4 meters
between my Perl results and the results from a web-based
datum-shift calculator on the 'net. -- Curt.
####
use Coordinate;
my $position = Coordinate->new();
$position->latitude(48.125);
$position->longitude(-122.500);
$position->datum("NAD27 CONUS MEAN:W of Mississippi/Except Louisiana/Minnesota/Missouri"); # Datum
printf("Starting position(Lat, Long): %s %s\n",
$position->latitude(),
$position->longitude() );
$position->degrees_minutes_seconds(); # Convert to DD MM SS format
printf("Starting position(Lat, Long): %s %s\n",
$position->formatted_latitude(),
$position->formatted_longitude() );
$position->lat_lon_to_utm();
printf("Calculated UTM position(Easting, Northing, Zone): %f %f %s\n",
$position->easting(),
$position->northing(),
$position->zone() );
$position->utm_to_lat_lon();
printf("Calculated Lat, Long position(Lat, Long): %f %f\n",
$position->latitude(),
$position->longitude() );
print "Changing from NAD27 to WGS84 datum...\n";
$position = $position->datum_shift_to_wgs84();
printf("Calculated Lat, Long position(Lat, Long): %f %f\n",
$position->latitude(),
$position->longitude() );
$position->degrees_minutes_seconds(); # Convert to DD MM SS
printf("Calculated Lat, Long position(Lat, Long): %s %s\n",
$position->formatted_latitude(),
$position->formatted_longitude() );
print "Changing from WGS84 to NAD27 datum...\n";
$position = $position->datum_shift_from_wgs84_to( "NAD27 CONUS MEAN:W of Mississippi/Except Louisiana/Minnesota/Missouri" );
printf("Calculated Lat, Long position(Lat, Long): %f %f\n",
$position->latitude(),
$position->longitude() );
print "\n0\n";
my $temp = CoordinateFormat->new( "0" );
printf(" decimal_degrees: %s\n", $temp->decimal_degrees( ) );
printf(" degrees_minutes: %s\n", $temp->degrees_minutes( ) );
printf("degrees_minutes_seconds: %s\n\n", $temp->degrees_minutes_seconds() );
print "180\n";
$temp->raw( "180" );
printf(" decimal_degrees: %s\n", $temp->decimal_degrees( "180") );
printf(" degrees_minutes: %s\n", $temp->degrees_minutes( "180") );
printf("degrees_minutes_seconds: %s\n\n", $temp->degrees_minutes_seconds("180") );
print "180 30\n";
$temp->raw( "180 30" );
printf(" decimal_degrees: %s\n", $temp->decimal_degrees( "180 30") );
printf(" degrees_minutes: %s\n", $temp->degrees_minutes( "180 30") );
printf("degrees_minutes_seconds: %s\n\n", $temp->degrees_minutes_seconds("180 30") );
print "180.50\n";
$temp->raw( "180.50" );
printf(" decimal_degrees: %s\n", $temp->decimal_degrees( "180.50") );
printf(" degrees_minutes: %s\n", $temp->degrees_minutes( "180.50") );
printf("degrees_minutes_seconds: %s\n\n", $temp->degrees_minutes_seconds("180.50") );
$temp->raw( "180 30.50" );
print "180 30.50\n";
printf(" decimal_degrees: %s\n", $temp->decimal_degrees( "180 30.50") );
printf(" degrees_minutes: %s\n", $temp->degrees_minutes( "180 30.50") );
printf("degrees_minutes_seconds: %s\n\n", $temp->degrees_minutes_seconds("180 30.50") );
$temp->raw( "180 30 30" );
print "180 30 30\n";
printf(" decimal_degrees: %s\n", $temp->decimal_degrees( "180 30 30") );
printf(" degrees_minutes: %s\n", $temp->degrees_minutes( "180 30 30") );
printf("degrees_minutes_seconds: %s\n\n", $temp->degrees_minutes_seconds("180 30 30") );
$temp->raw( "180 30 30.5" );
print "180 30 30.5\n";
printf(" decimal_degrees: %s\n", $temp->decimal_degrees("180 30 30.5") );
printf(" degrees_minutes: %s\n", $temp->degrees_minutes("180 30 30.5") );
printf("degrees_minutes_seconds: %s\n\n", $temp->degrees_minutes_seconds("180 30 30.5") );
$temp->raw( "-180 30 30.5" );
print "-180 30 30.5\n";
printf(" decimal_degrees: %s\n", $temp->decimal_degrees("-180 30 30.5") );
printf(" degrees_minutes: %s\n", $temp->degrees_minutes("-180 30 30.5") );
printf("degrees_minutes_seconds: %s\n\n", $temp->degrees_minutes_seconds("-180 30 30.5") );
##
##
Starting position(Lat, Long): 48.125 -122.5
Starting position(Lat, Long): 48 07 30.00000000 -122 30 0.00000000
Calculated UTM position(Easting, Northing, Zone): 537208.685551 5330095.589079 10U
Calculated Lat, Long position(Lat, Long): 48.124997 -122.500000
Changing from NAD27 to WGS84 datum...
Calculated Lat, Long position(Lat, Long): 48.124789 -122.501238
Calculated Lat, Long position(Lat, Long): 48 07 29.23995960 -122 30 4.45751911
Changing from WGS84 to NAD27 datum...
Calculated Lat, Long position(Lat, Long): 48.124997 -122.500000
0
decimal_degrees: 0
degrees_minutes: 00 0.00000000
degrees_minutes_seconds: 00 00 0.00000000
180
decimal_degrees: 180
degrees_minutes: 180 0.00000000
degrees_minutes_seconds: 180 00 0.00000000
180 30
decimal_degrees: 180.50000000
degrees_minutes: 180 30
degrees_minutes_seconds: 180 30 0.00000000
180.50
decimal_degrees: 180.50
degrees_minutes: 180 30.00000000
degrees_minutes_seconds: 180 30 0.00000000
180 30.50
decimal_degrees: 180.50833333
degrees_minutes: 180 30.50
degrees_minutes_seconds: 180 30 30.00000000
180 30 30
decimal_degrees: 180.50833333
degrees_minutes: 180 30.50000000
degrees_minutes_seconds: 180 30 30
180 30 30.5
decimal_degrees: 180.50847222
degrees_minutes: 180 30.50833333
degrees_minutes_seconds: 180 30 30.5
-180 30 30.5
decimal_degrees: -180.50847222
degrees_minutes: -180 30.50833333
degrees_minutes_seconds: -180 30 30.5
##
##
EllipsoidTable->enumerate();
DatumTable->enumerate();