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

Legend:
Removed from v.14  
changed lines
  Added in v.25

  ViewVC Help
Powered by ViewVC 1.1.26