/[maps]/web/googlemap.cgi
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /web/googlemap.cgi

Parent Directory Parent Directory | Revision Log Revision Log


Revision 31 - (show annotations)
Sat Dec 8 20:37:50 2007 UTC (16 years, 3 months ago) by dpavlin
File size: 5351 byte(s)
nicer export to kml button
1 #!/usr/bin/perl
2
3 use warnings;
4 use strict;
5
6 use HTML::GoogleMaps;
7 use CGI;
8 use CGI::Carp qw/fatalsToBrowser/;
9 use File::Find;
10 use Data::Dump qw/dump/;
11
12 use lib '../lib';
13 use blib;
14 use NMEA;
15 use KML;
16
17 my $trace_path = '../nmea/';
18
19 # http://localhost/
20 my $map_key = 'ABQIAAAAVQ5szt9Jd8ws6vgfVQOEmhT2yXp_ZAY8_ufC3CFXhHIE1NvwkxQ1cKf0DwFJcwtpESJEI0hL8QgtYg';
21
22 my @traces;
23 find({ wanted => sub {
24 push @traces, $_ if -f $_;
25 }}, $trace_path);
26
27 my $q = CGI->new;
28
29 my $head = '';
30 my $html = join('', qq{
31 <h1>Select GPS NMEA dump</h1>
32 },
33 $q->start_form( -id => 'trace_frm' ),
34 $q->popup_menu(
35 -name => 'trace',
36 -values => [
37 map {
38 "$_ (" . (stat("$trace_path/$_"))[7] . " bytes)"
39 }
40 sort {
41 (stat("$trace_path/$a"))[9] <=> (stat("$trace_path/$b"))[9]
42 } @traces
43 ],
44 -onChange => 'trace_frm.submit()',
45 ),
46 $q->submit(
47 -name => 'show',
48 -value => 'Show trace'
49 ),
50 $q->br,
51 'Draw ',
52 $q->popup_menu(
53 -name => 'points_filter',
54 -values => [ 'all', 'every', 'total of' ],
55 ),
56 $q->textfield(
57 -name => 'points_count',
58 -value => '',
59 -size => 2,
60 -onChange => 'trace_frm.submit()',
61 ),
62 ' points and ',
63 $q->popup_menu(
64 -name => 'placemark_filter',
65 -values => [ 'total of', 'every' ],
66 ),
67 $q->textfield(
68 -name => 'placemark_count',
69 -value => 5,
70 -size => 2,
71 -onChange => 'trace_frm.submit()',
72 ),
73 ' placemarks',
74 $q->br,
75 );
76
77
78
79 if ( my $trace = $q->param('trace') ) {
80 $trace =~ s/\s.+$//;
81
82 $trace = "$trace_path/$trace";
83
84 my $center_point;
85 my @points;
86 my @placemarks;
87
88 open(my $fh, '<', $trace) || die "can't open $trace: $!";
89 while( <$fh> ) {
90
91 my $hash = NMEA->line( $_ ) || next;
92
93 my $point = [ $hash->{lon}, $hash->{lat} ];
94 $center_point ||= $point;
95
96 push @points, $point;
97
98 push @placemarks, {
99 point => $point,
100 html => join('<br/>',
101 map {
102 ucfirst($_) . ': ' . $hash->{$_}
103 } ( qw/number time lat lon speed course/ )
104 ),
105 %$hash,
106 };
107
108 }
109 close($fh);
110
111 if ( $#points >= 0 ) {
112
113 sub filter_array {
114 my $o = {@_};
115 my ( $count, $filter, $code ) =
116 ( $o->{count}, $o->{filter}, $o->{code} ) ;
117 confess "no CODE?" unless ref($code) eq 'CODE';
118 my @array = @{ $o->{array} };
119
120 warn "count: $count filter: $filter\n";
121
122 my $code_calls = 0;
123
124 if ( $count && $filter =~ m/every/ ) {
125 foreach my $o ( 0 .. $#array ) {
126 next unless $o % $count == 0;
127 $code->( $array[$o] );
128 $code_calls++;
129 }
130 } elsif ( $count && $filter =~ m/total/ ) {
131 # total of
132 if ( $count < 2 ) {
133 # first
134 if ( $array[0]) {
135 $code->( $array[0] );
136 $code_calls++;
137 };
138 # last
139 if ( $count > 1 && $#array > 0 ) {
140 $code->( $array[$#array] );
141 $code_calls++;
142 };
143 return $code_calls;
144 }
145
146 my $d = $#array / ( $count - 1 );
147 foreach my $p ( 0 .. $count - 1 ) {
148 my $o = int($p * $d);
149 die "no element $p at $o from total of ",$#array + 1 unless $array[$o];
150 $code->( $array[$o] );
151 $code_calls++;
152 }
153 } else {
154 # show every
155 foreach my $e ( @array ) {
156 $code->( $e );
157 $code_calls++;
158 }
159 }
160 return $code_calls;
161 }
162
163 my $map = HTML::GoogleMaps->new(
164 key => $map_key,
165 width => '800px',
166 height => '600px',
167 );
168
169 my @poly_points;
170 my $points = filter_array(
171 count => $q->param('points_count'),
172 filter => $q->param('points_filter'),
173 code => sub {
174 my $point = shift;
175 push @poly_points, $point;
176 },
177 array => \@points,
178 );
179
180 die "hum?" unless $#poly_points == $points - 1;
181
182 my @filtered_placemarks;
183
184 my $placemarks = filter_array(
185 count => $q->param('placemark_count'),
186 filter => $q->param('placemark_filter'),
187 code => sub {
188 my $placemark = shift;
189 $map->add_marker( %$placemark, noformat => 1 );
190 push @filtered_placemarks, $placemark;
191 },
192 array => \@placemarks,
193 );
194
195 if ( my $export = $q->param('export') ) {
196 if ( $export =~ m/KML/i ) {
197 print $q->header(
198 -type => 'application/vnd.google-earth.kml+xml',
199 ),
200 KML->output( placemarks => \@filtered_placemarks );
201 exit;
202 } else {
203 die "unknown export format $export";
204 }
205 }
206
207
208 #$map->center(point => "Zagreb, Hrvatska");
209
210 #$map->zoom(10);
211 $map->v2_zoom(20);
212 $map->controls("large_map_control", "map_type_control");
213 $map->map_type('hybrid');
214 $map->center( $center_point ) if $q->param('line') && $center_point;
215
216 $map->add_polyline( points => [ @poly_points ] ) if @poly_points;
217
218 my ( $map_div, $map_script );
219 ( $head, $map_div, $map_script ) = $map->render;
220
221 $html .= join('',
222 $#points + 1, ' points from <tt>', $q->param('trace'), '</tt> showing ',
223 $points ? $points . ' points' . ( $placemarks ? ' and ' : '' ) : '',
224 $placemarks ? $placemarks . ' placemarks' : '',
225 ' export to ',
226 $q->submit(
227 -name => 'export',
228 -value => 'KML'
229 ),
230 qq{
231 $map_div
232 $map_script
233 <a href="http://aprs.gids.nl/nmea/">GPS - NMEA sentence information</a>
234 });
235
236 my $stats = NMEA->stats;
237 $html .= '<table>';
238 foreach my $n ( keys %$stats ) {
239 $html .= "<tr><td>$n</td><td>" . $stats->{$n} . "</td></tr>";
240 }
241 $html .= '</table>';
242
243 } else {
244 $html .= '<em>No points found for ' . $q->param('trace') . '</em>';
245 }
246
247 $html .= $q->end_form;
248 }
249
250 print $q->header;
251 print qq{
252 <html>
253 <head>
254 <title>Read GPS - NMEA sentence and display it on GoogleMaps</title>
255 $head
256 </head>
257 <body>
258 $html
259 </body>
260 </html>
261 };

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26