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

Legend:
Removed from v.23  
changed lines
  Added in v.30

  ViewVC Help
Powered by ViewVC 1.1.26