Advertisement
Guest User

kmlwpt2gpx.pl

a guest
Sep 25th, 2011
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 3.05 KB | None | 0 0
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;
  5. use Encode;
  6. use utf8;
  7. use open ":utf8";
  8. binmode STDIN,  ":utf8";
  9. binmode STDOUT, ":utf8";
  10. binmode STDERR, ":utf8";
  11.  
  12. sub parse_googlelatitude_datetime {
  13.     use DateTime::Format::DateParse;
  14.     my $str = shift;
  15.   # $str =~ s#日本標準時#+0900#;       # for JAPANESE String
  16.     $str =~ s/GMT(.*):(.*)/$1$2/;
  17.   # $str =~ s/[時分]/:/g;           # for JAPANESE String
  18.   # $str =~ s/秒//;                # for JAPANESE String
  19.     while ( $str =~ s/ ([A-Z])[a-z]+ Time/ Time$1/ ) {};
  20.     $str =~ s/Time([A-Z]+)/$1T/;
  21.     my $dt = DateTime::Format::DateParse->parse_datetime($str);
  22.     $dt->set_time_zone('+0000');
  23.     return $dt . "Z";
  24. }
  25.  
  26. sub test_datetime {
  27.     my $str = shift;
  28.     if ( $str =~ m#\s*<cmt>(.+)</cmt>\s*$# ) {
  29.         my $date = $1;
  30.         my $dt   = parse_googlelatitude_datetime($date);
  31.         return "<time>$dt</time>";
  32.     }
  33.     else {
  34.         return $str;
  35.     }
  36. }
  37.  
  38. foreach my $datafile (@ARGV) {
  39.     my $gpx_data;
  40.     printf "input: %-40s", $datafile;
  41.     my $filename_str = $datafile;
  42.     $filename_str =~ s/kml//gi;
  43.     $filename_str =~ s/[^A-Za-z]//gi;
  44.     $filename_str = "_$filename_str" if ($filename_str);
  45.     open GPXDATA, "gpsbabel -i kml -f $datafile -o gpx -F - |"
  46.       or die "cannot pipe from gpsbabel: $!";
  47.     while (<GPXDATA>) {
  48.         $gpx_data = $gpx_data . test_datetime($_);
  49.     }
  50.     close GPXDATA;
  51.  
  52.     use File::Temp;
  53.     my $tmpfile = File::Temp->new();
  54.     binmode( $tmpfile, ":utf8" );
  55.     print $tmpfile $gpx_data;
  56.  
  57.     open GPXDATA,
  58. "gpsbabel -i gpx -f $tmpfile -x sort,time -o gpx -F - | gpsbabel -i gpx -f - -x transform,trk=wpt,del -o gpx -F -|"
  59.       or die "cannot pipe from gpsbabel: $!";
  60.     $gpx_data = "";
  61.     while (<GPXDATA>) {
  62.         s#<ele>0\.0+</ele>##;
  63.         s#<name>[^<]+</name>##;
  64.         s#<cmt>[^<]+</cmt>##;
  65.         s#<desc>[^<]+</desc>##;
  66.         $gpx_data = $gpx_data . $_;
  67.     }
  68.     close GPXDATA;
  69.  
  70.     use Geo::Gpx;
  71.     use DateTime;
  72.     my $gpx          = Geo::Gpx->new( xml => $gpx_data );
  73.     my $track_points = $gpx->{tracks}[0]->{segments}[0]->{points};
  74.     my $strftime     = '%Y-%m-%d';
  75.     my $dt_first     = DateTime->from_epoch(
  76.         epoch     => $$track_points[0]->{time},
  77.         time_zone => 'local'
  78.     )->strftime($strftime);
  79.     my $dt_last = DateTime->from_epoch(
  80.         epoch     => $$track_points[ $#{$track_points} ]->{time},
  81.         time_zone => 'local'
  82.     )->strftime($strftime);
  83.     my $output_filename_base = $dt_last . $filename_str . "_gl";
  84.     $output_filename_base =
  85.       "$dt_first" . "_" . "$dt_last" . $filename_str . "_gl"
  86.       if ( "$dt_first" ne "$dt_last" );
  87.     my $output_filename = $output_filename_base . ".gpx";
  88.     my $num             = 1;
  89.  
  90.     while ( -s $output_filename ) {
  91.         $output_filename = $output_filename_base . "." . $num++ . ".gpx";
  92.     }
  93.     open GPXFILE, ">$output_filename"
  94.       or die "cannot write file ($!)";
  95.     print GPXFILE $gpx->xml;
  96.     close GPXFILE;
  97.     print " output: ", $output_filename;
  98.     print "\n";
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement