#!/usr/bin/perl # calculates km and miles from a path # in a google earth kml or kmz file. # Idea and formula by Heiko Braak, # programming by Jochen Puchalla (c) 2007-2012 # mail at puchalla dash online dot de # License: GPL V2 if ($#ARGV eq 1) { print STDOUT "usage: kml2length.pl file1.kml [file2.kml ...]\n"; exit(0); } # Version 0.2 my $pi=3.141592; foreach $file (@ARGV) { if (! open(INPUT,"<$file") ) { print STDERR "Can't open input file $file\n"; next; } print STDOUT "$file:"; my $ext = ($file =~ m/([^.]+)$/)[0]; # print $ext; if ($ext eq "kmz") { system("unzip -q -o $file"); $file="doc.kml"; } $ext = ($file =~ m/([^.]+)$/)[0]; if ($ext ne "kml") { print STDERR "$file is not a kml file\n"; next; } open(INPUT,"<$file"); while ($line=) { if ($line =~ /coordinates/) { $sum=0; $n=0; $convert=""; $newline=""; until ( $line =~ m/<\/coordinates>/i ) { $line=; chomp $line; #print $line; $line =~ s/\ \ /\ /g; $line =~ s/\ \ /\ /g; $line =~ s/\ \ /\ /g; $line =~ s/\ \ /\ /g; $line =~ s/\ \ /\ /g; $line =~ s/\ \ /\ /g; $newline= "$newline" . "$line"; } $newline =~ s/<\/coordinates>//g; $newline =~ s/,/\ /g; $newline =~ s/^\ //g; $newline =~ s/\ $//g; # print $newline . "end "; @values = split(/\s/, $newline); # print length($newline) . " characters "; $vals = split(/\s/, $newline); # print " $vals values"; for ($n=0 ; $n<$vals-4 ; $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 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 "\n"; # print "$sum\n"; # print "$n\n"; # print "$values[$n] \n"; # print "$values[$n+1] \n"; # print "$values[$n+3] \n"; # print "$values[$n+4] \n"; } print $convert = sprintf " %5.3f km %5.2f miles (%i waypoints)\n" , $sum, $sum*0.62137, $n/3+1; } } close INPUT; if ($file eq "doc.kml") { system("rm doc.kml"); } } exit(0);