Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- use strict;
- use warnings;
- use Data::Dumper;
- use Encode;
- use utf8;
- use open ":utf8";
- binmode STDIN, ":utf8";
- binmode STDOUT, ":utf8";
- binmode STDERR, ":utf8";
- sub parse_googlelatitude_datetime {
- use DateTime::Format::DateParse;
- my $str = shift;
- # $str =~ s#日本標準時#+0900#; # for JAPANESE String
- $str =~ s/GMT(.*):(.*)/$1$2/;
- # $str =~ s/[時分]/:/g; # for JAPANESE String
- # $str =~ s/秒//; # for JAPANESE String
- while ( $str =~ s/ ([A-Z])[a-z]+ Time/ Time$1/ ) {};
- $str =~ s/Time([A-Z]+)/$1T/;
- my $dt = DateTime::Format::DateParse->parse_datetime($str);
- $dt->set_time_zone('+0000');
- return $dt . "Z";
- }
- sub test_datetime {
- my $str = shift;
- if ( $str =~ m#\s*<cmt>(.+)</cmt>\s*$# ) {
- my $date = $1;
- my $dt = parse_googlelatitude_datetime($date);
- return "<time>$dt</time>";
- }
- else {
- return $str;
- }
- }
- foreach my $datafile (@ARGV) {
- my $gpx_data;
- printf "input: %-40s", $datafile;
- my $filename_str = $datafile;
- $filename_str =~ s/kml//gi;
- $filename_str =~ s/[^A-Za-z]//gi;
- $filename_str = "_$filename_str" if ($filename_str);
- open GPXDATA, "gpsbabel -i kml -f $datafile -o gpx -F - |"
- or die "cannot pipe from gpsbabel: $!";
- while (<GPXDATA>) {
- $gpx_data = $gpx_data . test_datetime($_);
- }
- close GPXDATA;
- use File::Temp;
- my $tmpfile = File::Temp->new();
- binmode( $tmpfile, ":utf8" );
- print $tmpfile $gpx_data;
- open GPXDATA,
- "gpsbabel -i gpx -f $tmpfile -x sort,time -o gpx -F - | gpsbabel -i gpx -f - -x transform,trk=wpt,del -o gpx -F -|"
- or die "cannot pipe from gpsbabel: $!";
- $gpx_data = "";
- while (<GPXDATA>) {
- s#<ele>0\.0+</ele>##;
- s#<name>[^<]+</name>##;
- s#<cmt>[^<]+</cmt>##;
- s#<desc>[^<]+</desc>##;
- $gpx_data = $gpx_data . $_;
- }
- close GPXDATA;
- use Geo::Gpx;
- use DateTime;
- my $gpx = Geo::Gpx->new( xml => $gpx_data );
- my $track_points = $gpx->{tracks}[0]->{segments}[0]->{points};
- my $strftime = '%Y-%m-%d';
- my $dt_first = DateTime->from_epoch(
- epoch => $$track_points[0]->{time},
- time_zone => 'local'
- )->strftime($strftime);
- my $dt_last = DateTime->from_epoch(
- epoch => $$track_points[ $#{$track_points} ]->{time},
- time_zone => 'local'
- )->strftime($strftime);
- my $output_filename_base = $dt_last . $filename_str . "_gl";
- $output_filename_base =
- "$dt_first" . "_" . "$dt_last" . $filename_str . "_gl"
- if ( "$dt_first" ne "$dt_last" );
- my $output_filename = $output_filename_base . ".gpx";
- my $num = 1;
- while ( -s $output_filename ) {
- $output_filename = $output_filename_base . "." . $num++ . ".gpx";
- }
- open GPXFILE, ">$output_filename"
- or die "cannot write file ($!)";
- print GPXFILE $gpx->xml;
- close GPXFILE;
- print " output: ", $output_filename;
- print "\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement