/usr/local/CPAN/Location-GeoTool/Location/GeoTool/Aura.pm
package Location::GeoTool::Aura;
################################################################
#
# Geometric Functions
# Location::GeoTool::Aura
#
use 5.008;
use strict;
use warnings;
use vars qw($VERSION $AUTOLOAD);
$VERSION = 0.96;
use Location::GeoTool;
use Carp;
__PACKAGE__->_make_accessors(
qw(sw se nw ne)
);
sub _new
{
bless {sw=>$_[1],se=>$_[2],nw=>$_[3],ne=>$_[4]}, $_[0];
}
sub create_vertex{_new(@_)}
sub create_side
{
my $class = shift;
my ($south,$west,$north,$east,$datum,$format) = @_;
bless {
sw => Location::GeoTool->create_coord($south,$west,$datum,$format),
se => Location::GeoTool->create_coord($south,$east,$datum,$format),
nw => Location::GeoTool->create_coord($north,$west,$datum,$format),
ne => Location::GeoTool->create_coord($north,$east,$datum,$format),
},$class;
}
sub AUTOLOAD
{
my $self = shift;
my $method = $AUTOLOAD;
$method =~ s/.+://;
return if ($method eq "DESTROY");
if (($method =~ /^format_\w+$/) || ($method =~ /^datum_\w+$/))
{
return Location::GeoTool::Aura->_new(map { $self->$_->$method } ('sw','se','nw','ne'));
}
else
{
croak qq{Can't locate object method "$method" via package "Location::Area::DoCoMo::iArea::Aura"};
}
}
sub array
{
my $self = shift;
my %second = map { $_ => $self->$_->format_second } ('sw','se','nw','ne');
my $north = ($second{ne}->lat > $second{nw}->lat) ? $self->ne->lat : $self->nw->lat;
my $south = ($second{se}->lat > $second{sw}->lat) ? $self->sw->lat : $self->se->lat;
my $east = ($second{ne}->long > $second{se}->long) ? $self->ne->long : $self->se->long;
my $west = ($second{nw}->long > $second{sw}->long) ? $self->sw->long : $self->nw->long;
return ($south,$west,$north,$east);
}
sub get_center
{
my $self = shift;
my $center1 = $self->nw->direction_point($self->se)->pivot(0,0.5)->to_point;
my $center2 = $self->ne->direction_point($self->sw)->pivot(0,0.5)->to_point;
return $center1->direction_point($center2)->pivot(0,0.5)->to_point;
}
sub _make_accessors
{
my($class, @attr) = @_;
for my $attr (@attr) {
no strict 'refs';
*{"$class\::$attr"} = sub { shift->{$attr} };
}
}
1;