Geo-Point
view release on metacpan or search on metacpan
lib/Geo/Line.pm view on Meta::CPAN
my ($first, $last) = $self->points(0, -1);
$self->{GL_ring} = ($first->[0]==$last->[0] && $first->[1]==$last->[1]);
}
sub isFilled() { shift->{GL_fill} }
#----------------
sub in($)
{ my ($self, $projnew) = @_;
return $self if ! defined $projnew || $projnew eq $self->proj;
# projnew can be 'utm'
my ($realproj, @points) = $self->projectOn($projnew, $self->points);
@points ? $self->new(points => \@points, proj => $realproj) : $self;
}
#----------------
lib/Geo/Point.pm view on Meta::CPAN
{ return ($thing->{GP_x}, $thing->{GP_y}) unless @_ > 2;
my $proj = pop @_;
return $thing->in($proj)->longlat;
}
# class method
$thing->new(long => shift, lat => shift, proj => shift);
}
sub xy(@)
{ my $thing = shift;
if(ref $thing) # instance method
{ return ($thing->{GP_x}, $thing->{GP_y}) unless @_ > 2;
my $proj = pop @_;
return $thing->in($proj)->xy;
}
# class method
$thing->new(x => shift, y => shift, proj => shift);
}
sub yx(@)
{ my $thing = shift;
if(ref $thing) # instance method
{ return ($thing->{GP_y}, $thing->{GP_x}) unless @_ > 2;
my $proj = pop @_;
return $thing->in($proj)->yx;
}
# class method
lib/Geo/Point.pm view on Meta::CPAN
sub longitude() {shift->{GP_x}}
sub long() {shift->{GP_x}}
sub latitude() {shift->{GP_y}}
sub lat() {shift->{GP_y}}
sub x() {shift->{GP_x}}
sub y() {shift->{GP_y}}
#----------------
sub in($)
{ my ($self, $newproj) = @_;
# Dirty hacks violate OO, to improve the speed.
return $self if $newproj eq $self->{G_proj};
my ($n, $p) = $self->projectOn($newproj, [$self->{GP_x}, $self->{GP_y}]);
$p ? ref($self)->new(x => $p->[0], y => $p->[1], proj => $n) : $self;
}
lib/Geo/Point.pm view on Meta::CPAN
sub dms(;$)
{ my ($self, $proj) = @_;
my ($long, $lat) = $proj ? $self->in($proj)->longlat : $self->longlat;
my $dmslat = $self->deg2dms($lat, 'N', 'S');
my $dmslong = $self->deg2dms($long, 'E', 'W');
wantarray ? ($dmslat, $dmslong) : "$dmslat, $dmslong";
}
sub dm(;$)
{ my ($self, $proj) = @_;
my ($long, $lat) = $proj ? $self->in($proj)->longlat : $self->longlat;
my $dmlat = $self->deg2dm($lat, 'N', 'S');
my $dmlong = $self->deg2dm($long, 'E', 'W');
wantarray ? ($dmlat, $dmlong) : "$dmlat, $dmlong";
}
sub dmsHTML(;$)
lib/Geo/Proj.pm view on Meta::CPAN
foreach my $nick ($class->listProjections)
{ my $proj = $class->projection($nick);
my $name = $proj->name;
my $norm = $proj->proj4->normalized;
$fh->print("$nick: $name".($defnick eq $nick ? ' (default)':'')."\n");
$fh->print(" $norm\n") if $norm ne $name;
}
}
sub to($@)
{ my $thing = shift;
my $myproj4 = ref $thing ? $thing->proj4 : __PACKAGE__->proj4(shift);
my $toproj4 = __PACKAGE__->proj4(shift);
$myproj4->transform($toproj4, shift);
}
#-----------------------
# These methods may have been implemented in Geo::Point, however may get
# supported by any external library later. Knowledge about projections
lib/Geo/Shape.pm view on Meta::CPAN
$self;
}
#---------------------------
sub proj() { shift->{G_proj} }
sub proj4() { Geo::Proj->proj4(shift->{G_proj}) }
#---------------------------
sub in($) { croak "ERROR: in() not implemented for a ".ref(shift) }
sub projectOn($@)
{ # fast check: nothing to be done
return () if @_<2 || $_[0]->{G_proj} eq $_[1];
my ($self, $projnew) = (shift, shift);
my $projold = $self->{G_proj};
return ($projnew, @_)
lib/Geo/Space.pm view on Meta::CPAN
sub lines() { grep $_->isa('Geo::Line'), shift->components }
sub onlyLines() { not first {! $_->isa('Geo::Line')} shift->components }
sub onlyRings() { not first {! $_->isa('Geo::Line') || ! $_->isRing}
shift->components }
sub in($)
{ my ($self, $projnew) = @_;
return $self if ! defined $projnew || $projnew eq $self->proj;
my @t;
foreach my $component ($self->components)
{ ($projnew, my $t) = $component->in($projnew);
push @t, $t;
}
lib/Geo/Surface.pm view on Meta::CPAN
{ my $self = shift;
my $proj = $self->proj;
map { Geo::Line->new(points => [$_->points], proj => $proj) } $self->inner;
}
*geo_outer = \&geoOuter;
*geo_inner = \&geoInner;
#--------------
sub in($)
{ my ($self, $projnew) = @_;
return $self if ! defined $projnew || $projnew eq $self->proj;
my @newrings;
foreach my $ring ($self->outer, $self->inner)
{ (undef, my @points) = $self->projectOn($projnew, $ring->points);
push @newrings, \@points;
}
my $mp = Math::Polygon::Surface->new(@newrings);
(ref $self)->new($mp, proj => $projnew);
( run in 1.605 second using v1.01-cache-2.11-cpan-5b529ec07f3 )