#!/usr/bin/perl # calculates km and miles from a path # in a google earth kml file. # Idea and formula by Heiko Braak, # programming by Jochen Puchalla (c) 2007 # mail at puchalla dash online dot de # License: GPL V2 # The input record separator is defined by Perl global # variable $/. It can be anything, including multiple # characters. Normally it is "\n", newline. Here, we # say there is no record separator, so the whole file # is read as one long record, newlines included. # undef $/; # if (!$ARGS[1]) # { # print STDOUT "usage: kml2length.pl file1.kml [file2.kml ...]\n"; # exit(0); # } foreach $file (@ARGV) { if (! open(INPUT,"<$file") ) { print STDERR "Can't open input file $file\n"; next; } print STDOUT "$file:"; $filecore=$file; $filecore =~ s/.kml$//g; if ($file eq $filecore) { print STDERR "$file is not a kml file\n"; next; } $sum=0; $n=0; $convert=""; $pi=3.141592; while ($line=) { if ($line =~ /coordinates/) { $line=; $line =~ s/,/\ /g; $line =~ s/\ <\/coordinates>\n//g; #handle first data line: @values = split(/\ /, $line); $n=0; for ( ; $values[$n+1]!=$values[-2] ; $n=$n+3) { $sum = $sum + sqrt((($values[$n+4]-$values[$n+1])*$pi*6371/180)*(($values[$n+4]-$values[$n+1])*$pi*6371/180)+(6371*cos($pi/180*$values[$n+4])*$pi*($values[$n+3]-$values[$n])/180)*(6371*cos($pi/180*$values[$n+4])*$pi*($values[$n+3]-$values[$n])/180)); } print $convert = sprintf " %5.2f km %5.2f miles (%i waypoints)\n" , $sum, $sum*0.62137, $n+2; } } close INPUT; # close OUTPUT; } exit(0);