/[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

Diff of /web/googlemap.cgi

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 13 by dpavlin, Sun Dec 2 19:05:29 2007 UTC revision 31 by dpavlin, Sat Dec 8 20:37:50 2007 UTC
# Line 4  use warnings; Line 4  use warnings;
4  use strict;  use strict;
5    
6  use HTML::GoogleMaps;  use HTML::GoogleMaps;
7    use CGI;
8  use CGI::Carp qw/fatalsToBrowser/;  use CGI::Carp qw/fatalsToBrowser/;
9    use File::Find;
10  use Data::Dump qw/dump/;  use Data::Dump qw/dump/;
11    
12  # http://localhost/  use lib '../lib';
13  my $map_key = 'ABQIAAAAVQ5szt9Jd8ws6vgfVQOEmhT2yXp_ZAY8_ufC3CFXhHIE1NvwkxQ1cKf0DwFJcwtpESJEI0hL8QgtYg';  use blib;
14    use NMEA;
15  my $trace = '/home/dpavlin/x/openmoko/gps/foo.loc';  use KML;
   
 my $map = HTML::GoogleMaps->new(key => $map_key);  
 #$map->center(point => "Zagreb, Hrvatska");  
   
 sub deg {  
         my $a = shift;  
         if ( $a =~ m/^(\d+)(\d\d\.\d\d+)$/ ) {  
                 return sprintf("%1.6f", $1 + ( $2 / 60 ));  
         } else {  
                 warn "## skipped $a\n";  
                 return;  
         }  
 }  
   
 my $got_it;  
   
 sub recalc {  
         my ( $lat, $lat_ns, $lon, $lon_ew ) = @_;  
   
         $lat = -$lat if $lat_ns eq 'S';  
         $lon = -$lon if $lon_ew eq 'W';  
16    
17          return if ( $got_it->{ $lat . $lon }++ );  my $trace_path = '../nmea/';
18    
19          $lat = deg( $lat ) || return;  # http://localhost/
20          $lon = deg( $lon ) || return;  my $map_key = 'ABQIAAAAVQ5szt9Jd8ws6vgfVQOEmhT2yXp_ZAY8_ufC3CFXhHIE1NvwkxQ1cKf0DwFJcwtpESJEI0hL8QgtYg';
21    
22          warn "## $lon $lat\n";  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          return [ $lon, $lat ];                  my $hash = NMEA->line( $_ ) || next;
 }  
92    
93  open(my $fh, '<', $trace) || die "can't open $trace: $!";                  my $point = [ $hash->{lon}, $hash->{lat} ];
94  while( <$fh> ) {                  $center_point ||= $point;
         if ( m/\$GPRMC/ ) {  
                 chomp;  
                 my @a = split(/,/,$_);  
95    
96                  next unless $#a = 12;                  push @points, $point;
97    
98                  warn "## [$#a] $_\n";                  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                  my ( undef, $time, $validity, $lat, $lat_ns, $lon, $lon_ew, $speed, $course, $date, $var, $var_ew ) = @a;          }
109            close($fh);
110    
111                  next unless $validity eq 'A';          if ( $#points >= 0 ) {
112    
113                  my $point = recalc( $lat, $lat_ns, $lon, $lon_ew ) || next;                  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                  $map->add_marker(                  my $stats = NMEA->stats;
237                          point => $point,                  $html .= '<table>';
238                          html => "Time: $time<br/>Validity: $validity</br>Lat: $lat $lat_ns<br/>Lon: $lon $lon_ew<br/>Speed: $speed<br/>Course: $course",                  foreach my $n ( keys %$stats ) {
239                  ) if $validity eq 'A';                          $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          }          }
 }  
 close($fh);  
   
 #$map->zoom(10);  
 #$map->v2_zoom(0);  
 $map->controls("large_map_control", "map_type_control");  
 $map->map_type('hybrid');  
246    
247  my ($head, $map_div, $map_script) = $map->render;          $html .= $q->end_form;
248    }
249    
250  print "Content-type: text/html\n\r\n\r";  print $q->header;
251  print qq{  print qq{
252  <html>  <html>
253    <head>
254  <title>Read GPS - NMEA sentence and display it on GoogleMaps</title>  <title>Read GPS - NMEA sentence and display it on GoogleMaps</title>
255  <head>$head</head>  $head
256    </head>
257  <body>  <body>
258  $map_div  $html
   
 $map_script  
 <a href="http://aprs.gids.nl/nmea/">GPS - NMEA sentence information</a>  
259  </body>  </body>
260  </html>  </html>
261  };  };

Legend:
Removed from v.13  
changed lines
  Added in v.31

  ViewVC Help
Powered by ViewVC 1.1.26