From: Brian E. L. <br...@us...> - 2004-08-21 08:17:21
|
Update of /cvsroot/rideplot/rideplot/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4686 Modified Files: rideplot Log Message: Creates plot data based upon photo timestamps. Doesn't quite plot yet. Index: rideplot =================================================================== RCS file: /cvsroot/rideplot/rideplot/src/rideplot,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** rideplot 10 Sep 2002 12:15:39 -0000 1.5 --- rideplot 21 Aug 2004 08:17:07 -0000 1.6 *************** *** 51,67 **** use GD; # Graphics library use POSIX qw( atan asin cos sin sqrt ); ! use Date::Calc qw( Delta_DHMS Decode_Date_US Decode_Month ); use Getopt::Long; # Command line options use Pod::Usage; # Help uses the embedded POD documentation require LWP::UserAgent; # Http GET etc. use strict; use vars qw( $debug $deg $pi $km_per_mile $nonmetric $dist_m $x_scale $y_scale ! $image $max_x $max_y $white $black $dot_brush $dot_fg $dot_bg $scale ! @data $avg_lat $lat_scale $maxlat $minlat $maxlon $minlon $point $mb_scale ! $mid_lat $mid_lon $data_format $img_x $img_y $londist $latdist $map_url $map_file $map_get ! $maxspeed $use_color @sp_color @sp_brush $maxwidth $maxheight ! $speed_cutoff $cutoff_count $brush_width $brush_color $output_file ! @waypoints $waypoint_file $waypoint_width $waypoint_fill $waypoint_name $waypoint_merge ); # convert degrees/min/sec to decimal degrees. --- 51,72 ---- use GD; # Graphics library use POSIX qw( atan asin cos sin sqrt ); ! use Date::Calc qw( Delta_DHMS Decode_Date_US Decode_Month Add_Delta_DHMS ); use Getopt::Long; # Command line options use Pod::Usage; # Help uses the embedded POD documentation + use Image::EXIF; # Extracts EXIF information from photo require LWP::UserAgent; # Http GET etc. + use Data::Dumper; use strict; use vars qw( $debug $deg $pi $km_per_mile $nonmetric $dist_m $x_scale $y_scale ! $image $max_x $max_y $white $black $dot_brush $dot_fg $dot_bg $scale ! @data $avg_lat $lat_scale $maxlat $minlat $maxlon $minlon $point $mb_scale ! $mid_lat $mid_lon $data_format $img_x $img_y $londist $latdist $map_url $map_file $map_get ! $maxspeed $use_color @sp_color @sp_brush $maxwidth $maxheight ! $speed_cutoff $cutoff_count $brush_width $brush_color $output_file ! @waypoints $waypoint_file $waypoint_width $waypoint_fill $waypoint_name $waypoint_merge ! $photo_dir @photos @mapped_photos $photo_idx ); ! ! $debug = 1; # convert degrees/min/sec to decimal degrees. *************** *** 127,130 **** --- 132,164 ---- } + sub interpolate + { + my ($prevtime, $timestr, $photo_time, $prevlat, $prevlon, $lat, $lon) = @_; + + my ($interplat, $interplon); + # Do linear interpretation + + # Get total difference in seconds + + # compute time in seconds + my @ttime = Delta_DHMS( datetime2array( $prevtime ), + datetime2array( $timestr )); + my $tsec = $ttime[0]*86400 + $ttime[1]*3600 + $ttime[2]*60 + + $ttime[3]; + + # compute delta time in seconds + my @dtime = Delta_DHMS( datetime2array( $prevtime ), + datetime2array( $photo_time )); + my $dsec = $dtime[0]*86400 + $dtime[1]*3600 + $dtime[2]*60 + + $dtime[3]; + + $interplat = $prevlat + ( $lat - $prevlat ) * $dsec / $tsec; + + $interplon = $prevlon + ( $lon - $prevlon ) * $dsec / $tsec; + + + return ($interplat, $interplon); + } + # convert degrees to radians for trig functions sub deg2rad *************** *** 136,140 **** sub rad2deg { ! $_[0] * 180 / $pi; } --- 170,174 ---- sub rad2deg { ! $_[0] * 180.0 / $pi; } *************** *** 190,193 **** --- 224,269 ---- } + sub get_photo_info + { + + my $dir = shift; + + chdir( $dir ) or die "Failed to chdir: $!"; + + my $exif = new Image::EXIF; + + my @file_names = glob("dsc*.jpg"); + + my @photos_tmp; # list of photo information + + + my $file; + foreach $file (@file_names) + { + $debug && print STDERR "Get photo: $file\n"; + $exif->file_name($file); + my $image_info = $exif->get_image_info(); # hash reference + + my $str_buffer = $image_info->{"Image Created"}; + my ($date, $time) = split ' ', $str_buffer; + $date =~ s/:/\//g; + my $timestr = "$date $time"; + + my @ltime = datetime2array($timestr); + + # Photos have local timestamp. Change them to have GMT time + # The "-2" is the skew for the digital camera. + + my @ntime = Add_Delta_DHMS( @ltime, 0,7,-2,0); + + my $photo_timestr = sprintf ("%04d/%02d/%02d %02d:%02d:%02d" ,$ntime[0],$ntime[1],$ntime[2],$ntime[3],$ntime[4],$ntime[5]); + + $debug && print "$file |",$photo_timestr, "|\n"; + push @photos_tmp, [$photo_timestr , $file]; + } + + return @photos_tmp; + } + # initialize constants $pi = 4.0 * atan(1); *************** *** 196,200 **** # handle command-line parameters ! $debug = 0; $use_color = 99; # Unset color variable $data_format = "gpstrans"; # gpstrans gd2 gardown gd2d --- 272,276 ---- # handle command-line parameters ! $debug = 1; $use_color = 99; # Unset color variable $data_format = "gpstrans"; # gpstrans gd2 gardown gd2d *************** *** 222,225 **** --- 298,302 ---- "waypoint-fill" => \$waypoint_fill, "waypoint-name" => \$waypoint_name, # Print the Waypoints name. + "photo_dir=s" => \$photo_dir, # Directory containing photos during tracking "help" => sub { pod2usage({ -message => "\t\tRide Plot\n\t\t---------\n" , -exitval => 1 }); } , ); *************** *** 252,255 **** --- 329,335 ---- @data = (); + # initialize the mapped_photos array + @mapped_photos = (); + # initialize distance accumulator $dist_m = 0; *************** *** 266,269 **** --- 346,360 ---- $cutoff_count = 0; + # Initialize photo_idx variable + $photo_idx = 0; + + if ( $photo_dir ) + { + $debug && print STDERR "Photo Dir: $photo_dir\n"; + @photos = get_photo_info($photo_dir); + $debug && print STDERR "photo list\n"; + $debug && print STDERR Dumper( @photos) ; + } + # parse the track data # Note: though dates/times are included in the input, we assume all points are *************** *** 432,435 **** --- 523,527 ---- } + # Format yyyy/mm/dd 24hh:mm:ss $timestr = "$date $time"; # *************** *** 440,481 **** if ( defined $prevtime ) { - # the previous record is valid - compute dist/time/speed ! # compute distance in meters ! $ldist = dist ( $prevlat, $prevlon, ! $lat, $lon); ! # compute time in seconds ! @ltime = Delta_DHMS( datetime2array( $prevtime ), ! datetime2array( $timestr )); ! $lsec = $ltime[0]*86400 + $ltime[1]*3600 + $ltime[2]*60 + ! $ltime[3]; ! if ( $lsec == 0 ) { ! # multiple data points for same time point ! # avoid division by zero in speed by rejecting it ! # leave prev* variables alone ! next; ! } ! # compute speed in km/h ! # ( dist(m)/1000 ) / ( time(sec)/3600 ) ! # simplifies to ( dist(m) / time(sec)) * 3.6 ! $lspeed = ( $ldist / $lsec ) * 3.60; ! # check against speed cutoff for data filtering ! # (external units in kph or mph "nonmetric", internal units in km/h) ! if (( defined $speed_cutoff ) ! and $lspeed > $speed_cutoff ) { ! # speed is too high - we'll omit this data point ! # leave prev* variables alone ! $debug and printf STDERR "speed cutoff: " ! ."%6.2f meters in %d seconds: " ! ."%6.2f km/h / %6.2f mph\n", ! $ldist, $lsec, ! $lspeed, $lspeed/$km_per_mile; ! $cutoff_count++; ! next; } } else { # the previous entry is invalid - clear dist/time/speed --- 532,634 ---- if ( defined $prevtime ) { ! # the previous record is valid - compute dist/time/speed ! # Check if we have any photos left to check that were taken while ! # collecting tracklog data ! # Did we actually get a list and did we step through it? ! if ( $#photos > 0 && $photo_idx < $#photos ) ! { ! my $continue = 1; ! ! $debug && print STDERR "Continue: $continue. photo_idx $photo_idx \n"; ! ! while ( $photo_idx < $#photos && $continue == 1 ) { ! ! my $time_photo = ${$photos[$photo_idx]}[0]; ! my $photo_name = ${$photos[$photo_idx]}[1]; ! ! $debug && print STDERR "Prevtime: ", $prevtime ,"\n"; ! $debug && print STDERR "Photo timestamp: ", $time_photo ,"\n"; ! $debug && print STDERR "Timestr: ", $timestr ,"\n"; ! ! ! ! if ( $time_photo ge $prevtime && $time_photo lt $timestr ) ! { ! # We have a photo taken during tracklog collection. ! ! ! # Interpolate the lat and lon for this photo based upon time ! # prevtime, timestr, photo_time, prevlat, prevlon, lat, lon ! my ($interplat, $interplon) = interpolate( $prevtime, $timestr, ! ${$photos[$photo_idx]}[0], ! $prevlat, $prevlon, ! $lat, $lon); ! push @mapped_photos, [ $interplat, $interplon, $photo_name ]; ! ! $photo_idx++; ! ! } ! elsif ( $time_photo lt $prevtime ) ! { ! $photo_idx++; ! ! } ! elsif ( $time_photo gt $timestr ) ! { ! $continue = 0; ! } ! else ! { ! $continue = 0; ! } ! ! ! $debug && print STDERR "Incremented on photo_idx: $photo_idx. Total: $#photos\n"; ! } + } + + + # compute distance in meters + $ldist = dist ( $prevlat, $prevlon, + $lat, $lon); + + # compute time in seconds + @ltime = Delta_DHMS( datetime2array( $prevtime ), + datetime2array( $timestr )); + $lsec = $ltime[0]*86400 + $ltime[1]*3600 + $ltime[2]*60 + + $ltime[3]; + if ( $lsec == 0 ) { + # multiple data points for same time point + # avoid division by zero in speed by rejecting it + # leave prev* variables alone + next; + } + + # compute speed in km/h + # ( dist(m)/1000 ) / ( time(sec)/3600 ) + # simplifies to ( dist(m) / time(sec)) * 3.6 + $lspeed = ( $ldist / $lsec ) * 3.60; + + # check against speed cutoff for data filtering + # (external units in kph or mph "nonmetric", internal units in km/h) + if (( defined $speed_cutoff ) + and $lspeed > $speed_cutoff ) + { + # speed is too high - we'll omit this data point + # leave prev* variables alone + $debug and printf STDERR "speed cutoff: " + ."%6.2f meters in %d seconds: " + ."%6.2f km/h / %6.2f mph\n", + $ldist, $lsec, + $lspeed, $lspeed/$km_per_mile; + $cutoff_count++; + next; + } } else { # the previous entry is invalid - clear dist/time/speed *************** *** 542,546 **** # allocate the image and colors ! $image = new GD::Image($max_x+$brush_width*2+2, $max_y+$brush_width*2+2); # Store Image dimensions $img_x = ($max_x+$brush_width*2+2); --- 695,700 ---- # allocate the image and colors ! # I added 10 for picture dots ! $image = new GD::Image($max_x+$brush_width*2+2 , $max_y+$brush_width*2+2 ); # Store Image dimensions $img_x = ($max_x+$brush_width*2+2); *************** *** 650,653 **** --- 804,827 ---- } + # Plot photo points here + # @mapped_photos, [ $interplat, $interplon, $name ]; + + if ( $#mapped_photos > 0 ) + { + + foreach (@mapped_photos) + { + + $debug && print STDERR "Mapped photos\n"; + $debug && print STDERR Dumper ( $_ ); + # plot circle for each photo + # The circlue is blue and is ten pixels in diameter for now. + # my $blue = $image->colorAllocate(0,0,255); + # $image->arc( ll2xy(@{$_}[0..1]) ,10,10,0,360,$blue); + # $image->fill( ll2xy(@{$_}[0..1]) ,$blue); + + } + } + # Open the track file if it's defined. # Only write the track if were not merging the waypoints image. *************** *** 692,696 **** foreach $wp ( @waypoints ) { $wp_image->arc( ! ll2xy($wp->[2], $wp->[3], $maxlat, $minlat, $maxlon, $minlon, $max_x, $max_y ), --- 866,870 ---- foreach $wp ( @waypoints ) { $wp_image->arc( ! ll2xy($wp->[2], $wp->[3], $maxlat, $minlat, $maxlon, $minlon, $max_x, $max_y ), |