#!/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);