#!/usr/bin/perl # make track db BTREE "trackdb" # companion to mk-photo-index5.pl # Andrew Daviel 1998-2006 advax@triumf.ca # reads Garmin GPS track data saved as GPX XML # and creates location database $file = shift or die "need GPX filename" ; $level = 0 ; use XML::LibXML; use DB_File ; use Time::Local ; sub compare { my ($k1,$k2) = @_ ; $k1 <=> $k2 ; } $b = new DB_File::BTREEINFO ; $DB_BTREE->{'compare'} = \&compare ; $b->{'compare'} = \&compare ; $trackh = tie %track, "DB_File", "trackdb", O_RDWR|O_CREAT, 0666, $b or die "Cannot open file trackdb: $!\n" ; $brkt = shift ; $parser = XML::LibXML->new(); $doc = $parser->parse_file($file) ; @trkpt = $doc->getElementsByLocalName('trkpt') ; foreach $trkpt (@trkpt) { undef(%value) ; undef($ndg) ; undef($time2) ; if ($trkpt->hasAttributes) { foreach $attribute ($trkpt->attributes) { $aname = $attribute->name ; $avalue = $attribute->value ; $value{$aname} = $avalue ; } } if ($trkpt->hasChildNodes) { foreach $child ($trkpt->childNodes) { $name = $child->nodeName ; unless ($name eq 'ele' or $name eq 'time') { next ; } $value = $child->textContent; $value{$name} = $value ; } } print "$value{'lat'} $value{'lon'} $value{'ele'} $value{'time'}\n" ; $ndg = $value{'lat'} ; $edg = $value{'lon'} ; if ($value{'time'} =~ /([\d]+)-([\d]+)-([\d]+)T([\d]+):([\d]+):([\d]+)Z/) { $year = $1 ; $mon = $2 ; $mon-- ; $year -= 1900 ; $time2 = timegm($6,$5,$4,$3,$mon,$year) ; $time3 = localtime($time2) ; } else { print "garbled time $value{'time'}\n" ; } if ($time2) { if ($time2 == $brkt) { &brk ; } print "$time $time2 $time3 $ndg,$edg\n" ; if ($ndg > 0 and $time2) { $track{$time2} = "$ndg,$edg" ; } } } if ($brkt) { print STDERR "$track{$brkt}\n" ; } untie (%track) or die ; $trackh = tie %track, "DB_File", "trackdb", O_RDWR|O_CREAT, 0666, $DB_BTREE or die "Cannot open file trackdb: $!\n" ; #foreach (keys %track) { # $time = localtime($_) ; # print "$_ $time $track{$_}\n" ; #} if ($brkt) { print STDERR "$track{$brkt}\n" ; } untie (%track) or die ; sub brk { return ; }