File Coverage

blib/lib/Geo/GoogleEarth/Pluggable/Placemark.pm
Criterion Covered Total %
statement 59 79 74.6
branch 17 40 42.5
condition 4 23 17.3
subroutine 13 15 86.6
pod 10 10 100.0
total 103 167 61.6


line stmt bran cond sub pod time code
1             package Geo::GoogleEarth::Pluggable::Placemark;
2 5     5   37 use base qw{Geo::GoogleEarth::Pluggable::Base};
  5         11  
  5         489  
3 5     5   28 use strict;
  5         10  
  5         81  
4 5     5   20 use warnings;
  5         11  
  5         118  
5 5     5   22 use Scalar::Util qw{reftype blessed};
  5         9  
  5         288  
6 5     5   30 use XML::LibXML::LazyBuilder qw{E};
  5         9  
  5         4536  
7              
8             our $VERSION='0.17';
9              
10             =head1 NAME
11              
12             Geo::GoogleEarth::Pluggable::Placemark - Base Object for Geo::GoogleEarth::Pluggable Placemarks
13              
14             =head1 SYNOPSIS
15              
16             use base qw{Geo::GoogleEarth::Pluggable::Placemark};
17              
18             =head1 DESCRIPTION
19              
20             The is the base of all Geo::GoogleEarth::Pluggable packages.
21              
22             =head1 USAGE
23              
24             =head1 METHODS
25              
26             =head2 type
27              
28             =cut
29              
30 15     15 1 125 sub type {"Placemark"};
31              
32             =head2 style
33              
34             Sets or returns the Placemark Style or StyleMap object.
35              
36             style=>$style is a short cut for styleUrl=>$style->url
37              
38             =cut
39              
40             sub style {
41 5     5 1 8 my $self=shift;
42 5 50       23 $self->{"style"}=shift if @_;
43 5         44 return $self->{"style"};
44             }
45              
46             =head2 styleUrl
47              
48             This overrides style->url if defined.
49              
50             =cut
51              
52             sub styleUrl {
53 5     5 1 8 my $self=shift;
54 5         9 my $url=undef;
55 5 50 33     15 $url=$self->style->url if blessed($self->style) && $self->style->can("url");
56 5   33     35 $self->{"styleUrl"}||=$url;
57 5 50       11 $self->{"styleUrl"}=shift if @_;
58 5         14 return $self->{"styleUrl"};
59             }
60              
61             =head2 LookAt
62              
63             Sets or returns the LookAt Object
64              
65             =cut
66              
67             sub LookAt {
68 0     0 1 0 my $self=shift;
69 0 0       0 $self->{"LookAt"}=shift if @_;
70 0         0 return $self->{"LookAt"};
71             }
72              
73             =head2 visibility
74              
75             Sets or returns visibility. The value is either 1 or 0 but defaults to undef which the same as 1.
76              
77             my $visibility=$placemark->visibility;
78              
79             =cut
80              
81             sub visibility {
82 5     5 1 10 my $self=shift;
83 5 50       13 $self->{"visibility"}=shift if @_;
84 5         28 return $self->{"visibility"};
85             }
86              
87             =head2 node
88              
89             =cut
90              
91             sub node {
92 5     5 1 9 my $self=shift;
93 5         16 my @element=();
94 5 50 33     24 push @element, $self->lookat->node
95             if ref($self->lookat) and $self->lookat->can("node");
96 5 50       20 push @element, E(name=>{}, $self->name)
97             if defined $self->name;
98 5         66 push @element, E(Snippet=>{maxLines=>scalar(@{$self->Snippet})}, join("\n", @{$self->Snippet}));
  5         23  
  5         13  
99 5 50       82 push @element, E(description=>{}, $self->description)
100             if defined $self->description;
101 5 50       18 push @element, E(visibility=>{}, $self->visibility)
102             if defined $self->visibility;
103 5 50       22 push @element, E(styleUrl=>{}, $self->styleUrl)
104             if defined $self->styleUrl;
105 5         20 push @element, $self->subnode;
106 5         80 return E($self->type=>{}, @element);
107             }
108              
109             =head2 coordinates
110              
111             The coordinates array is used consistantly for all placemark objects.
112              
113             my $coordinates=$placemark->coordinates(
114             [
115             [$lon, $lat, $alt],
116             {lat=>$lat, lon=>$lon, alt=>$alt},
117             GPS::Point,
118             Geo::Point,
119             Net::GPSD::Point,
120             ]
121             );
122              
123             my $coordinates=$placemark->coordinates(
124             Geo::Line, #TODO
125             );
126              
127              
128             =cut
129              
130             sub coordinates {
131 0     0 1 0 my $self=shift;
132 0 0       0 $self->{"coordinates"}=shift if @_;
133 0         0 return $self->{"coordinates"};
134             }
135              
136             =head2 coordinates_stringify
137              
138             =cut
139              
140             sub coordinates_stringify {
141 4     4 1 7 my $self=shift;
142 4 50       10 my $data=@_ ? shift : $self->coordinates;
143 4         7 my $string="";
144 4 50       9 if (ref($data) eq "ARRAY") {
145 4         6 $string=join(" ", map {$self->point_stringify($_)} @$data);
  24         50  
146             } else {
147 0         0 die(sprintf(qq{Error: the coordinates_stringify method does not understand coordinates value type "%s"}, ref($data)));
148             }
149 4         13 return $string;
150             }
151              
152             =head2 point_stringify
153              
154             my $string=$placemark->point_stringify($point); #returns "$lon,$lat,$alt"
155              
156             =cut
157              
158             sub point_stringify {
159 24     24 1 36 my $self=shift;
160 24         42 my %data=$self->point_normalize(@_);
161 24         205 return join(",", @data{qw{lon lat alt}});
162             }
163              
164             =head2 point_normalize
165              
166             Most of this code was taken from GPS::Point->initializeMulti
167              
168             my $data=$placemark->point_normalize($point); #returns {lat=>$lat,lon=>$lon,alt=>$alt}
169              
170             =cut
171              
172             sub point_normalize {
173 24     24 1 31 my $self=shift;
174 24         32 my $point=shift;
175 24         30 my $data={};
176 24 50       104 if (ref($point) eq "Geo::Point") {
    50          
    50          
    50          
    50          
177 0 0       0 $point=$point->in('wgs84') unless $point->proj eq "wgs84";
178 0         0 $data->{'lat'}=$point->latitude;
179 0         0 $data->{'lon'}=$point->longitude;
180 0         0 $data->{'alt'}=0;
181             } elsif (ref($point) eq "GPS::Point") {
182 0         0 $data->{'lat'}=$point->lat;
183 0         0 $data->{'lon'}=$point->lon;
184 0   0     0 $data->{'alt'}=$point->alt||0;
185             } elsif (ref($point) eq "Net::GPSD::Point") {
186 0         0 $data->{'lat'}=$point->latitude;
187 0         0 $data->{'lon'}=$point->longitude;
188 0   0     0 $data->{'alt'}=$point->altitude||0;
189             } elsif (reftype($point) eq "HASH") {
190             #{lat=>$lat, lon=>$lon, alt=>$alt}
191 0   0     0 $data->{'lat'}=$point->{'lat'}||$point->{'latitude'};
192 0   0     0 $data->{'lon'}=$point->{'lon'}||$point->{'long'}||$point->{'longitude'};
193             $data->{'alt'}=$point->{'alt'}||$point->{'altitude'}||
194 0   0     0 $point->{'elevation'}||$point->{'hae'}||$point->{'elev'}||0;
195             } elsif (reftype($point) eq "ARRAY") {
196             #[$lon, $lat, $alt]
197 24         45 $data->{'lon'}=$point->[0];
198 24         31 $data->{'lat'}=$point->[1];
199 24   50     59 $data->{'alt'}=$point->[2]||0;
200             }
201 24         60 $data->{$_}+=0 foreach qw{lat lon alt}; #convert to number to "trim" strings that look like numbers.
202 24 50       122 return wantarray ? %$data : $data;
203             }
204              
205             =head1 BUGS
206              
207             Please log on RT and send to the geo-perl email list.
208              
209             =head1 SUPPORT
210              
211             DavisNetworks.com supports all Perl applications including this package.
212              
213             =head1 AUTHOR
214              
215             Michael R. Davis (mrdvt92)
216             CPAN ID: MRDVT
217              
218             =head1 COPYRIGHT
219              
220             This program is free software licensed under the...
221              
222             The BSD License
223              
224             The full text of the license can be found in the LICENSE file included with this module.
225              
226             =head1 SEE ALSO
227              
228             L, L, L
229              
230             =cut
231              
232             1;