Geo-Functions-0.07/0000755000076400007640000000000010702244416013460 5ustar mdavismdavisGeo-Functions-0.07/README0000644000076400007640000000014710534420230014333 0ustar mdavismdavisIf you have any comments I'd love to hear from you. Thanks, Mike (mrdvt92) qw/perl michaelrdavis com/ Geo-Functions-0.07/MANIFEST0000644000076400007640000000015010534515473014614 0ustar mdavismdavisCHANGES lib/Geo/Functions.pm LICENSE Makefile.PL MANIFEST This list of files META.yml README t/base.t Geo-Functions-0.07/Makefile.PL0000644000076400007640000000074710552631370015444 0ustar mdavismdavisuse ExtUtils::MakeMaker; WriteMakefile( NAME => q{Geo::Functions}, VERSION_FROM => q{lib/Geo/Functions.pm}, PREREQ_PM => { strict => 0, vars => 0, Exporter => 0, Geo::Constants => 0.06, }, ($] >= 5.005 ? ( ABSTRACT_FROM => 'lib/Geo/Functions.pm', ) : () ), ); Geo-Functions-0.07/lib/0000755000076400007640000000000010702244416014226 5ustar mdavismdavisGeo-Functions-0.07/lib/Geo/0000755000076400007640000000000010702244416014740 5ustar mdavismdavisGeo-Functions-0.07/lib/Geo/Functions.pm0000644000076400007640000000773510702244226017261 0ustar mdavismdavisrequire Exporter; package Geo::Functions; =head1 NAME Geo::Functions - Package for standard Geo:: functions. =head1 SYNOPSIS use Geo::Functions qw{deg_rad deg_dms rad_deg}; #import into namespace print "Degrees: ", deg_rad(3.14/4), "\n"; use Geo::Functions; my $obj = Geo::Functions->new; print "Degrees: ", $obj->deg_rad(3.14/2), "\n"; =head1 DESCRIPTION =head1 CONVENTIONS Function naming convention is "format of the return" underscore "format of the parameters." For example, you can read the deg_rad function as "degrees given radians" or "degrees from radians". =cut use strict; use vars qw($VERSION $PACKAGE @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); @ISA = qw(Exporter); @EXPORT_OK = (qw{deg_rad rad_deg deg_dms rad_dms dms_deg dm_deg round mps_knots knots_mps}); $VERSION = sprintf("%d.%02d", q{Revision: 0.07} =~ /(\d+)\.(\d+)/); use Geo::Constants qw{RAD DEG KNOTS}; =head1 CONSTRUCTOR =head2 new The new() constructor my $obj = Geo::Functions->new(); =cut sub new { my $this = shift(); my $class = ref($this) || $this; my $self = {}; bless $self, $class; $self->initialize(@_); return $self; } =head1 METHODS =cut sub initialize { my $self = shift(); my $param = shift(); } =head2 deg_dms Degrees given degrees minutes seconds. my $deg=deg_dms(39, 29, 17.134); my $deg=deg_dms(39, 29, 17.134, 'N'); =cut sub deg_dms { my $self=shift(); my $d=ref($self) ? shift()||0 : $self; my $m=shift()||0; my $s=shift()||0; my $nsew=shift()||'N'; my $sign = ($nsew=~m/[SW-]/i) ? -1 : 1; #matches "-" to support -1 return $sign * ($d + ($m + $s/60)/60); } =head2 deg_rad Degrees given radians. my $deg=deg_rad(3.14); =cut sub deg_rad { my $self=shift(); my $rad=ref($self) ? shift() : $self; return $rad*DEG(); } =head2 rad_deg Radians given degrees. my $rad=rad_deg(90); =cut sub rad_deg { my $self=shift(); my $deg=ref($self) ? shift() : $self; return $deg*RAD(); } =head2 rad_dms Radians given degrees minutes seconds. my $rad=rad_dms(45 30 20.0); =cut sub rad_dms { return rad_deg(deg_dms(@_)); } =head2 round Round to the nearest integer. This formula rounds toward +/- infinity. my $int=round(42.2); =cut sub round { my $self=shift(); my $number=ref($self) ? shift() : $self; return int($number + 0.5 * ($number <=> 0)); } =head2 dms_deg Degrees minutes seconds given degrees. my ($d, $m, $s, $sign)=dms_deg($degrees, qw{N S}); my ($d, $m, $s, $sign)=dms_deg($degrees, qw{E W}); =cut sub dms_deg { my $self=shift(); my $number=ref($self) ? shift() : $self; my @sign=@_; my $sign=$number >= 0 ? $sign[0]||1 : $sign[1]||-1; $number=abs($number); my $d=int($number); my $m=int(($number-$d) * 60); my $s=((($number-$d) * 60) - $m) * 60; my @dms=($d, $m, $s, $sign); return wantarray ? @dms : join(" ", @dms); } =head2 dm_deg Degrees minutes given degrees. my ($d, $m, $sign)=dm_deg($degrees, qw{N S}); my ($d, $m, $sign)=dm_deg($degrees, qw{E W}); =cut sub dm_deg { my $self=shift(); my $number=ref($self) ? shift() : $self; my @sign=@_; my $sign=$number >= 0 ? $sign[0]||1 : $sign[1]||-1; $number=abs($number); my $d=int($number); my $m=($number-$d) * 60; my @dm=($d, $m, $sign); return wantarray ? @dm : join(" ", @dm); } =head2 mps_knots meters per second given knots my $mps=mps_knots(50.0); =cut sub mps_knots { my $self=shift(); my $number=ref($self) ? shift() : $self; return $number * KNOTS(); } =head2 knots_mps knots given meters per second my $knots=knots_mps(25.0); =cut sub knots_mps { my $self=shift(); my $number=ref($self) ? shift() : $self; return $number / KNOTS(); } 1; __END__ =head1 TODO =head1 BUGS Please send to the geo-perl email list. =head1 LIMITS =head1 AUTHOR Michael R. Davis qw/perl michaelrdavis com/ =head1 LICENSE Copyright (c) 2006 Michael R. Davis (mrdvt92) This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO Geo::Constants Geo::Ellipsoids Geo-Functions-0.07/LICENSE0000644000076400007640000000026010534420230014454 0ustar mdavismdavisCopyright (c) 2006 Michael R. Davis (mrdvt92) All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Geo-Functions-0.07/META.yml0000664000076400007640000000071510702244416014736 0ustar mdavismdavis# http://module-build.sourceforge.net/META-spec.html #XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX# name: Geo-Functions version: 0.07 version_from: lib/Geo/Functions.pm installdirs: site requires: Exporter: 0 Geo::Constants: 0.06 strict: 0 vars: 0 distribution_type: module generated_by: ExtUtils::MakeMaker version 6.30 Geo-Functions-0.07/CHANGES0000644000076400007640000000063510702244001014445 0ustar mdavismdavis2007-10-07 v0.07 * Absolutely nothing. It's a perl testing thing. 2006-01-15 v0.06 * Added mps_knots and knots_mps functions 2006-01-12 v0.05 * Added methods dms_deg and dm_deg 2006-12-09 v0.04 * Documentation 2006-12-08 v0.03 * Added () for imported Geo::Constants as some systems don't like barewords * Added rad_dms method 2006-12-05 v0.02 * Documentation 2006-12-02 v0.01 * Original version Geo-Functions-0.07/t/0000755000076400007640000000000010702244416013723 5ustar mdavismdavisGeo-Functions-0.07/t/base.t0000644000076400007640000000546510552636635015047 0ustar mdavismdavis#!/usr/bin/perl -w # -*- perl -*- # # $Id: base.t,v 0.1 2006/02/21 eserte Exp $ # Author: Michael R. Davis # =head1 NAME base.t - Good examples concerning how to use this module =cut use strict; use lib q{lib}; use lib q{../lib}; use constant NEAR_DEFAULT => 7; sub near { my $x=shift(); my $y=shift(); my $p=shift()||NEAR_DEFAULT; if (($x-$y)/$y < 10**-$p) { return 1; } else { return 0; } } BEGIN { if (!eval q{ use Test; 1; }) { print "1..0 # tests only works with installed Test module\n"; exit; } } BEGIN { plan tests => 2239 } # just check that all modules can be compiled ok(eval {require Geo::Functions; 1}, 1, $@); my $o = Geo::Functions->new(); ok(ref $o, "Geo::Functions"); ok ($o->deg_rad(atan2(1,1)), 45); ok ($o->deg_dms(40,42,46.5,"N"), 40+(42+46.5/60)/60); ok ($o->rad_dms(40,42,46.5,"N"), $o->rad_deg(40+(42+46.5/60)/60)); ok ($o->rad_deg(45), atan2(1,1)); ok ($o->round(45.9), 46); foreach (qw{5 10 25 50}) { ok($_, $o->mps_knots($o->knots_mps($_))); } use Geo::Functions qw{deg_rad deg_dms rad_deg round rad_dms dms_deg dm_deg mps_knots knots_mps}; ok (deg_rad(atan2(1,1)), 45); ok (deg_dms(40,42,46.5,"s"), -1*(40+(42+46.5/60)/60)); ok (deg_dms(40,42,46.5,"S"), -1*(40+(42+46.5/60)/60)); ok (deg_dms(40,42,46.5,"w"), -1*(40+(42+46.5/60)/60)); ok (deg_dms(40,42,46.5,"W"), -1*(40+(42+46.5/60)/60)); ok (deg_dms(40,42,46.5,-1), -1*(40+(42+46.5/60)/60)); ok (deg_dms(40,42,46.5,-40), -1*(40+(42+46.5/60)/60)); ok (deg_dms(40,42,46.5,"N"), 1*(40+(42+46.5/60)/60)); ok (deg_dms(40,42,46.5,"n"), 1*(40+(42+46.5/60)/60)); ok (deg_dms(40,42,46.5,""), 1*(40+(42+46.5/60)/60)); ok (deg_dms(40,42,46.5,undef), 1*(40+(42+46.5/60)/60)); ok (deg_dms(40,42,46.5), 1*(40+(42+46.5/60)/60)); ok (rad_deg(45), atan2(1,1)); ok (rad_deg(90), atan2(1,0)); ok (rad_deg(180), atan2(0,-1)); ok (rad_deg(-90), atan2(-1,0)); ok (round(0), 0); ok (round(5.1), 5); ok (round(5.5), 6); ok (round(5.6), 6); ok (round(-5.1), -5); ok (round(-5.5), -6); ok (round(-5.6), -6); ok (rad_dms(55, 34, 76, "N"), rad_deg(deg_dms(55, 34, 76, "N"))); foreach my $d1 (0,5,15,67,88) { foreach my $m1 (0,3,43,57) { foreach my $s1 (5,15,34,45,56) { foreach my $sign1 (qw{N S}) { my ($d2,$m2,$s2,$sign2)=dms_deg(deg_dms($d1,$m1,$s1,$sign1), qw{N S}); my ($d3,$m3,$sign3)=dm_deg(deg_dms($d1,$m1,$s1,$sign1), qw{N S}); ok ($d1, $d2); ok ($m1, $m2); ok (near $s1, $s2); ok ($sign1, $sign2); ok ($d1, $d3); ok (near $m1+$s1/60, $m3); ok ($sign1, $sign3); } foreach my $sign1 (qw{E W}) { my ($d2,$m2,$s2,$sign2)=dms_deg(deg_dms($d1,$m1,$s1,$sign1), qw{E W}); ok ($d1, $d2); ok ($m1, $m2); ok (near $s1, $s2); ok ($sign1, $sign2); } } } } foreach (qw{5 10 25 50}) { ok($_, mps_knots(knots_mps($_))); }