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 )