Geo-Functions
view release on metacpan or search on metacpan
lib/Geo/Functions.pm view on Meta::CPAN
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);
( run in 0.696 second using v1.01-cache-2.11-cpan-39bf76dae61 )