Radreise-Wiki:Km.pl: Unterschied zwischen den Versionen
Aus Radreise-Wiki
Jmages (Diskussion | Beiträge) |
Jmages (Diskussion | Beiträge) |
||
Zeile 12: | Zeile 12: | ||
use strict; | use strict; | ||
use Encode qw(encode decode); | use Encode qw (encode decode); | ||
my $smoothAlt = 6; | |||
my $changePlaceHm = 0; | |||
my | my $changeDistHm = 1; | ||
my $makeRetour = 0; # not yet implemented | |||
my $verbose = 0; | |||
#================================== | |||
# Default Settings and Subroutines | |||
require "ini.pl"; | |||
my ($baseDir, $outDir, $username, $password, $encoding, $encAnsi, $encOut) = getIni(); | |||
my ($routeFileName, $routeFileName_e) = get_routeFileName (@ARGV); | |||
my ($track, $rawTrack) = get_trackfile ($routeFileName); | |||
my @track = @$track; | |||
my @rawTrack = @$rawTrack; | |||
#==================== | |||
# Glättung der Höhen | |||
# | |||
# | |||
for (my $j = 1; $j <= $smoothAlt; $j++) { | for (my $j = 1; $j <= $smoothAlt; $j++) { | ||
for (my $i = 1; $i < $#track ; $i++) { | for (my $i = 1; $i < $#track ; $i++) { | ||
my $avgAlt = ($track[$i-1][2] + $track[$i][2] + $track[$i+1][2]) / 3; | my $avgAlt = ($track[$i-1][2] + $track[$i][2] + $track[$i+1][2]) / 3; | ||
$track[$i][2] = $avgAlt; | $track[$i][2] = $avgAlt; | ||
} | } | ||
} | } | ||
Zeile 89: | Zeile 48: | ||
#====================== | #====================== | ||
# Tracklänge berechnen | # Tracklänge berechnen | ||
my $ | my $length = 0; | ||
for (my $i = 0; $i < $#track ; $i++) { | for (my $i = 0; $i < $#track ; $i++) { | ||
Zeile 110: | Zeile 61: | ||
); | ); | ||
$ | $length += $dist; | ||
} | } | ||
Zeile 121: | Zeile 72: | ||
# Ausgabe der Track-Statistik | # Ausgabe der Track-Statistik | ||
printf "Trackpunkte : %6d pt\n", $#track + 1; | |||
printf "Strecke : %6.0f km\n", $length; | |||
printf "Strecke : % | printf "Hm auf : %6.0f<!-- Glattungsfaktor = %d -->\n", $HmSumUp, $smoothAlt; | ||
printf "Hm ab : %6.0f\n", $HmSumDn, $smoothAlt; | |||
printf "Hm auf : % | |||
printf "Hm ab : % | |||
# | # ============== | ||
# Get | # Get Routefile | ||
my $ | my ($fileContent, $pre_Roadbook, $Roadbook, $post_Roadbook) = get_routefile ($routeFileName); | ||
# ============ | my @Roadbook = split "\n", $Roadbook; | ||
# Get | |||
# =============== | |||
# Get Placemarks | |||
my ($PlacemarksRaw, $Placemarks) = get_placemarks (@Roadbook); | |||
my @Placemarks = @$PlacemarksRaw; | |||
my @placeName; | |||
my @touriInfo; | |||
my @geodaten; | |||
my @geodaten_lat; | |||
my @geodaten_lon; | |||
my @geodaten_alt; | |||
my @geodaten_alt_real; | |||
my @geodaten_alt_res; | |||
my @geodaten_info; | |||
my @geodaten_nearest_tp; | |||
my @geodaten_dist_to_tp; | |||
my @roadInfo; | |||
my @kilometrierung; | |||
my @kilometrierung_km; | |||
my @kilometrierung_km_real; | |||
my @kilometrierung_km_res; | |||
my @kilometrierung_km_sum; | |||
my @kilometrierung_km_sum_real; | |||
my @kilometrierung_km_sum_res; | |||
my @kilometrierung_hmup; | |||
my @kilometrierung_hmup_real; | |||
my @kilometrierung_hmup_res; | |||
my @kilometrierung_hmup_sum; | |||
my @kilometrierung_hmup_sum_real; | |||
my @kilometrierung_hmup_sum_res; | |||
my @kilometrierung_hmdn; | |||
my @kilometrierung_hmdn_real; | |||
my @kilometrierung_hmdn_res; | |||
my | my @kilometrierung_hmdn_sum; | ||
my | my @kilometrierung_hmdn_sum_real; | ||
my | my @kilometrierung_hmdn_sum_res; | ||
my @rest; | |||
# ================================= | |||
# Check Placemarks except last one | |||
for (my $i = 0; $i < $#Placemarks; $i++) { | |||
my ($placeName, $touriInfo, $geodaten, $roadInfo, $kilometrierung, $rest) = get_placemarkData ($Placemarks[$i]); | |||
if ($placeName) { | |||
#print encode $encOut, "$placeName\n"; | |||
#print encode $encOut, "\n"; | |||
#print encode $encOut, " $geodaten\n"; | |||
#print encode $encOut, " $kilometrierung\n"; | |||
#print encode $encOut, "\n"; | |||
push @placeName, $placeName; | |||
push @touriInfo, $touriInfo; | |||
push @geodaten, $geodaten; | |||
push @roadInfo, $roadInfo; | |||
push @kilometrierung, $kilometrierung; | |||
push @rest, $rest; | |||
} else { die "ERROR in get_placemarkData\n"; } | |||
# =============== | |||
# Check Geodaten | |||
my ($lat, $lon, $alt, $info) = get_geodaten ($geodaten[$i]); | |||
if ($lat) { | |||
my ($trackPoint, $distance) = getClosestPoint ( $lat, $lon ); | |||
#print encode $encOut, " $lat\n"; | |||
#print encode $encOut, " $lon\n"; | |||
#print encode $encOut, " $alt\n"; | |||
#print encode $encOut, " $trackPoint\n"; | |||
#print encode $encOut, " $distance\n"; | |||
#print encode $encOut, "\n"; | |||
push @geodaten_lat, $lat; | |||
push @geodaten_lon, $lon; | |||
push @geodaten_alt, $alt; | |||
push @geodaten_alt_real, sprintf "%.0f", $track[$trackPoint][2]; | |||
push @geodaten_alt_res, $alt; | |||
push @geodaten_info, $info; | |||
push @geodaten_nearest_tp, $trackPoint; | |||
push @geodaten_dist_to_tp, $distance; | |||
} else { die "ERROR in get_geodaten\n"; } | |||
# ===================== | |||
# Check Kilometrierung | |||
my $ | my ($km, $km_sum, $hmup, $hmdn, $hmup_sum, $hmdn_sum) = get_kilometrierung ($kilometrierung[$i]); | ||
if ($verbose) { print encode $encOut, "$kilometrierung[$i]\n"; } | |||
if ( $ | if ($km) { | ||
# | #print encode $encOut, " $km\n"; | ||
# | #print encode $encOut, " $sum\n"; | ||
#print encode $encOut, " $hmup\n"; | |||
#print encode $encOut, " $hmdn\n"; | |||
#print encode $encOut, "\n"; | |||
push @kilometrierung_km, $km; | |||
push @kilometrierung_km_res, $km; | |||
push @kilometrierung_km_sum, $km_sum; | |||
push @kilometrierung_km_sum_res, $km_sum; | |||
push @kilometrierung_hmup, $hmup; | |||
push @kilometrierung_hmup_res, $hmup; | |||
push @kilometrierung_hmdn, $hmdn; | |||
push @kilometrierung_hmdn_res, $hmdn; | |||
push @kilometrierung_hmup_sum, $hmup_sum; | |||
push @kilometrierung_hmup_sum_res, $hmup_sum; | |||
push @kilometrierung_hmdn_sum, $hmdn_sum; | |||
push @kilometrierung_hmdn_sum_res, $hmdn_sum; | |||
} else { die "ERROR in get_kilometrierung\n"; } | |||
} | |||
# ===================== | |||
# Check last Placemark | |||
my ($placeName, $touriInfo, $geodaten, $roadInfo) = get_lastPlacemarkData ($Placemarks[$#Placemarks]); | |||
if ($placeName) { | |||
#print encode $encOut, "$placeName\n"; | |||
#print encode $encOut, "\n"; | |||
#print encode $encOut, " $geodaten\n"; | |||
#print encode $encOut, "\n"; | |||
push @placeName, $placeName; | |||
push @touriInfo, $touriInfo; | |||
push @geodaten, $geodaten; | |||
push @roadInfo, $roadInfo; | |||
push @kilometrierung, ""; | |||
push @rest, ""; | |||
push @kilometrierung_km, ""; | |||
push @kilometrierung_km_res, ""; | |||
push @kilometrierung_km_sum, ""; | |||
push @kilometrierung_km_sum_res, ""; | |||
push @kilometrierung_hmup, ""; | |||
push @kilometrierung_hmup_res, ""; | |||
push @kilometrierung_hmdn, ""; | |||
push @kilometrierung_hmdn_res, ""; | |||
push @kilometrierung_hmup_sum, ""; | |||
push @kilometrierung_hmup_sum_res, ""; | |||
push @kilometrierung_hmdn_sum, ""; | |||
push @kilometrierung_hmdn_sum_res, ""; | |||
} else { die "ERROR in get_lastPlacemarkData\n"; } | |||
# ================================= | |||
# Check Geodaten of last Placemark | |||
my ($lat, $lon, $alt, $info) = get_geodaten ($geodaten[$#geodaten]); | |||
if ($lat) { | |||
my ($trackPoint, $distance) = getClosestPoint ( $lat, $lon ); | my ($trackPoint, $distance) = getClosestPoint ( $lat, $lon ); | ||
#print encode $encOut, " $lat\n"; | |||
#print encode $encOut, " $lon\n"; | |||
#print encode $encOut, " $alt\n"; | |||
#print encode $encOut, " $trackPoint\n"; | |||
#print encode $encOut, " $distance\n"; | |||
#print encode $encOut, "\n"; | |||
push @geodaten_lat, $lat; | |||
push @geodaten_lon, $lon; | |||
push @geodaten_alt, $alt; | |||
push @geodaten_alt_real, sprintf "%.0f", $track[$trackPoint][2]; | |||
push @geodaten_alt_res, $alt; | |||
push @geodaten_info, $info; | |||
push @geodaten_nearest_tp, $trackPoint; | |||
push @geodaten_dist_to_tp, $distance; | |||
} else { die "ERROR in get_geodaten\n"; } | |||
# ========================= | # ========================= | ||
# Calculate real Distances | # Calculate real Distances | ||
my $ | my $sum_real; | ||
for (my $i=0; $i < $#Placemarks; $i++) { | for (my $i=0; $i < $#Placemarks; $i++) { | ||
my $ | my $km_real; | ||
for (my $j = $ | for (my $j = $geodaten_nearest_tp[$i]; $j < $geodaten_nearest_tp[$i+1] ; $j++) { | ||
my $dist = getDistance ( $track[$j][0], $track[$j][1], $track[$j+1][0], $track[$j+1][1] ); | my $dist = getDistance ( $track[$j][0], $track[$j][1], $track[$j+1][0], $track[$j+1][1] ); | ||
$ | $km_real += $dist; | ||
} | } | ||
$ | $sum_real += $km_real; | ||
push @kilometrierung_km_real, sprintf "%.1f", $km_real; | |||
push @kilometrierung_km_sum_real, sprintf "%.0f", $sum_real; | |||
} | |||
push @kilometrierung_km_real, ""; | |||
push @kilometrierung_km_sum_real, ""; | |||
# ========================== | |||
# Calculate real Höhenmeter | |||
my $sum_hmup; | |||
my $sum_hmdn; | |||
for (my $i=0; $i < $#Placemarks; $i++) { | |||
my ($ | my ($hmup, $hmdn) = getHmSum ($geodaten_nearest_tp[$i], $geodaten_nearest_tp[$i+1]); | ||
$sum_hmup += $hmup; | |||
$sum_hmdn += $hmdn; | |||
$ | push @kilometrierung_hmup_real, sprintf "%.0f", $hmup; | ||
$ | push @kilometrierung_hmdn_real, sprintf "%.0f", $hmdn; | ||
push @kilometrierung_hmup_sum_real, sprintf "%.0f", $sum_hmup; | |||
push @kilometrierung_hmdn_sum_real, sprintf "%.0f", $sum_hmdn; | |||
} | } | ||
push @ | push @kilometrierung_hmup_real, ""; | ||
push @kilometrierung_hmdn_real, ""; | |||
push @kilometrierung_hmup_sum_real, ""; | |||
push @kilometrierung_hmdn_sum_real, ""; | |||
# ===================================== | # ===================================== | ||
Zeile 410: | Zeile 348: | ||
for (my $i=0; $i<$#Placemarks; $i++) { | for (my $i=0; $i<$#Placemarks; $i++) { | ||
if ( $ | if ( $geodaten_nearest_tp[$i] <= $geodaten_nearest_tp[$i+1] ) { | ||
#ok | #ok | ||
Zeile 416: | Zeile 354: | ||
} else { | } else { | ||
print encode $encOut, " | print encode $encOut, "ERROR: Wrong TrackPoint Order in:\n"; | ||
print encode $encOut, "$ | print encode $encOut, " $placeName[$i] :: $geodaten_nearest_tp[$i]\n"; | ||
print encode $encOut, "$ | print encode $encOut, " $placeName[$i+1] :: $geodaten_nearest_tp[$i+1]\n\n"; | ||
} | } | ||
} | } | ||
# ==================== | # =================== | ||
# | # Summarize all Data | ||
my $output = sprintf "%5s %3s %4s %5s %5s %5s %5s %5s %s", | |||
"tp#", | |||
"dist", | |||
"k", | |||
"k_s", | |||
"k_r", | |||
"k_s_r", | |||
"a", | |||
"a_r", | |||
"place"; | |||
if ($verbose) { print encode $encOut, "$output\n"; } | |||
for (my $i=0; $i<=$#Placemarks; $i++) { | for (my $i=0; $i <= $#Placemarks; $i++) { | ||
my $ | my $output = sprintf "%5d %3.0f m %4s %5s %5s %5s %5s %5s %s", | ||
print encode $encOut, $ | $geodaten_nearest_tp[$i], | ||
$geodaten_dist_to_tp[$i], | |||
$kilometrierung_km[$i], | |||
$kilometrierung_km_sum[$i], | |||
$kilometrierung_km_real[$i], | |||
$kilometrierung_km_sum_real[$i], | |||
$geodaten_alt[$i], | |||
$geodaten_alt_real[$i], | |||
$placeName[$i]; | |||
if ($verbose) { print encode $encOut, "$output\n"; } | |||
} | } | ||
# | if ($verbose) { print encode $encOut, "\n"; } | ||
# | |||
# ================== | |||
# Summarize Changes | |||
my $change; | |||
my $output = sprintf "%5s %3s %4s %5s %5s %5s %5s %5s %s", | |||
"tp#", | |||
"dist", | |||
"k", | |||
"k_s", | |||
"k_r", | |||
"k_s_r", | |||
"a", | |||
"a_r", | |||
"place"; | |||
print encode $encOut, "$output\n"; | |||
for (my $i=0; $i <= $#Placemarks; $i++) { | |||
$kilometrierung_km_real[$i] =~ s/\./\,/; | |||
if ($kilometrierung_km[$i] eq $kilometrierung_km_real[$i]) { | |||
$kilometrierung_km[$i] = ""; | |||
$kilometrierung_km_real[$i] = ""; | |||
} else { | |||
$kilometrierung_km_res[$i] = $kilometrierung_km_real[$i]; | |||
$change = 1; | |||
} | |||
if ($kilometrierung_km_sum[$i] eq $kilometrierung_km_sum_real[$i]) { | |||
$kilometrierung_km_sum[$i] = ""; | |||
$kilometrierung_km_sum_real[$i] = ""; | |||
} else { | |||
$ | |||
$kilometrierung_km_sum_res[$i] = $kilometrierung_km_sum_real[$i]; | |||
$change = 1; | |||
} | |||
if ($changePlaceHm) { | |||
if ($geodaten_alt[$i] eq $geodaten_alt_real[$i]) { | |||
$geodaten_alt[$i] = ""; | |||
$geodaten_alt_real[$i] = ""; | |||
} else { | } else { | ||
$geodaten_alt_res[$i] = $geodaten_alt_real[$i]; | |||
$change = 1; | |||
} | } | ||
} else { | |||
$geodaten_alt[$i] = ""; | |||
$geodaten_alt_real[$i] = ""; | |||
} | |||
if ($changeDistHm) { | |||
if ($kilometrierung_hmdn[$i] eq $kilometrierung_hmdn_real[$i]) { | |||
$kilometrierung_hmdn[$i] = ""; | |||
$kilometrierung_hmdn_real[$i] = ""; | |||
} else { | |||
$kilometrierung_hmdn_res[$i] = $kilometrierung_hmdn_real[$i]; | |||
$change = 1; | |||
} | |||
if ($kilometrierung_hmup[$i] eq $kilometrierung_hmup_real[$i]) { | |||
$kilometrierung_hmup[$i] = ""; | |||
$kilometrierung_hmup_real[$i] = ""; | |||
} | } else { | ||
$kilometrierung_hmup_res[$i] = $kilometrierung_hmup_real[$i]; | |||
$change = 1; | |||
} | |||
if ($kilometrierung_hmup_sum[$i] eq $kilometrierung_hmup_sum_real[$i]) { | |||
$kilometrierung_hmup_sum[$i] = ""; | |||
$kilometrierung_hmup_sum_real[$i] = ""; | |||
} else { | |||
$kilometrierung_hmup_sum_res[$i] = $kilometrierung_hmup_sum_real[$i]; | |||
$change = 1; | |||
} | |||
if ($kilometrierung_hmdn_sum[$i] eq $kilometrierung_hmdn_sum_real[$i]) { | |||
$kilometrierung_hmdn_sum[$i] = ""; | |||
$kilometrierung_hmdn_sum_real[$i] = ""; | |||
} else { | } else { | ||
$kilometrierung_hmdn_sum_res[$i] = $kilometrierung_hmdn_sum_real[$i]; | |||
$change = 1; | |||
} | } | ||
} else { | |||
} | } | ||
my $output = sprintf "%5d %3.0f m %4s %5s %5s %5s %5s %5s %s", | |||
$geodaten_nearest_tp[$i], | |||
$geodaten_dist_to_tp[$i], | |||
$kilometrierung_km[$i], | |||
$kilometrierung_km_sum[$i], | |||
$kilometrierung_km_real[$i], | |||
$kilometrierung_km_sum_real[$i], | |||
$geodaten_alt[$i], | |||
$geodaten_alt_real[$i], | |||
$placeName[$i]; | |||
print encode $encOut, "$output\n"; | |||
} | } | ||
# ====================== | |||
# Write Changes to File | |||
if ($change) { | if ($change) { | ||
$fileContent = ""; | |||
$fileContent .= $pre_Roadbook; | |||
for (my $i=0; $i < $#Placemarks; $i++) { | |||
$fileContent .= "=== $placeName[$i] ===\n"; | |||
$fileContent .= "$touriInfo[$i]\n"; | |||
$fileContent .= "{{Geodaten|$geodaten_lat[$i]|$geodaten_lon[$i]|$geodaten_alt_res[$i]|$geodaten_info[$i]}}\n"; | |||
$fileContent .= "$roadInfo[$i]\n"; | |||
if ($kilometrierung[$i] =~ /KilometrierungHm6/) { | |||
$fileContent .= "{{KilometrierungHm6|$kilometrierung_km_res[$i]|$kilometrierung_hmup_res[$i]|$kilometrierung_hmdn_res[$i]|$kilometrierung_km_sum_res[$i]|$kilometrierung_hmup_sum_res[$i]|$kilometrierung_hmdn_sum_res[$i]}}"; | |||
} elsif ($kilometrierung[$i] =~ /KilometrierungHm/) { | |||
$fileContent .= "{{KilometrierungHm|$kilometrierung_km_res[$i]|$kilometrierung_km_sum_res[$i]|$kilometrierung_hmup_sum_res[$i]|$kilometrierung_hmdn_sum_res[$i]}}"; | |||
} else { | |||
$fileContent .= "{{Kilometrierung|$kilometrierung_km_res[$i]|$kilometrierung_km_sum_res[$i]}}"; | |||
} | } | ||
$fileContent .= "\n$rest[$i]"; | |||
} | } | ||
$ | $fileContent .= "=== $placeName[$#Placemarks] ===\n"; | ||
$fileContent .= "$touriInfo[$#Placemarks]\n"; | |||
$fileContent .= "{{Geodaten|$geodaten_lat[$#Placemarks]|$geodaten_lon[$#Placemarks]|$geodaten_alt_res[$#Placemarks]|$geodaten_info[$#Placemarks]}}\n"; | |||
$fileContent .= "$roadInfo[$#Placemarks]"; | |||
$ | $fileContent .= $post_Roadbook; | ||
$ | open FOUT, "> $outDir/${routeFileName_e}_new.tx" or die $!; | ||
print FOUT encode ($encoding, $fileContent); | |||
$ | close FOUT; | ||
} | } | ||
exit; | exit; | ||
#========================================================== | #========================================================== | ||
Zeile 589: | Zeile 603: | ||
} | } | ||
my $dist = acos($val) * 6378.137; # radius of | my $dist = acos($val) * 6378.137; # radius of equator in km | ||
#if (Double.isNaN(dist)) dist = 0; | #if (Double.isNaN(dist)) dist = 0; | ||
return $dist; | return $dist; | ||
} | } |
Version vom 29. Januar 2012, 21:23 Uhr
Das Perl-Skript km.pl wird mit dem Streckennamen als Parameter aufgerufen. Die zugehörige Streckendatei muss bereits im text- und die Trackdatei im track-Verzeichnis vorhanden sein. Beispiel für einen Aufruf:
perl km.pl Donau
Das Skript berechnet die Kilometrierung des Roadbook und speichert das Ergebnis als Datei im Output-Verzeichnis (siehe ini.pl). Die Datei "Donau_new.txt" enthält das neue Roadbook und kann mit einem UTF8-fähigen Texteditor geöffnet und direkt in das Edit-Fenster des Streckenartikels kopiert werden.
Wenn man die Variable $makeRetour = 1 setzt, dann wird zusätzlich eine Datei erzeugt, die das Retour-Roadbook und den Retour-Track enthält.
Quellcode des Skripts:
use strict; use Encode qw (encode decode); my $smoothAlt = 6; my $changePlaceHm = 0; my $changeDistHm = 1; my $makeRetour = 0; # not yet implemented my $verbose = 0; #================================== # Default Settings and Subroutines require "ini.pl"; my ($baseDir, $outDir, $username, $password, $encoding, $encAnsi, $encOut) = getIni(); my ($routeFileName, $routeFileName_e) = get_routeFileName (@ARGV); my ($track, $rawTrack) = get_trackfile ($routeFileName); my @track = @$track; my @rawTrack = @$rawTrack; #==================== # Glättung der Höhen for (my $j = 1; $j <= $smoothAlt; $j++) { for (my $i = 1; $i < $#track ; $i++) { my $avgAlt = ($track[$i-1][2] + $track[$i][2] + $track[$i+1][2]) / 3; $track[$i][2] = $avgAlt; } } #====================== # Tracklänge berechnen my $length = 0; for (my $i = 0; $i < $#track ; $i++) { my $dist = getDistance ( $track[$i][0], $track[$i][1], $track[$i+1][0], $track[$i+1][1] ); $length += $dist; } #============================= # Gesamt-Höhenmeter berechnen my ($HmSumUp, $HmSumDn) = getHmSum (0, $#track); #============================= # Ausgabe der Track-Statistik printf "Trackpunkte : %6d pt\n", $#track + 1; printf "Strecke : %6.0f km\n", $length; printf "Hm auf : %6.0f<!-- Glattungsfaktor = %d -->\n", $HmSumUp, $smoothAlt; printf "Hm ab : %6.0f\n", $HmSumDn, $smoothAlt; # ============== # Get Routefile my ($fileContent, $pre_Roadbook, $Roadbook, $post_Roadbook) = get_routefile ($routeFileName); my @Roadbook = split "\n", $Roadbook; # =============== # Get Placemarks my ($PlacemarksRaw, $Placemarks) = get_placemarks (@Roadbook); my @Placemarks = @$PlacemarksRaw; my @placeName; my @touriInfo; my @geodaten; my @geodaten_lat; my @geodaten_lon; my @geodaten_alt; my @geodaten_alt_real; my @geodaten_alt_res; my @geodaten_info; my @geodaten_nearest_tp; my @geodaten_dist_to_tp; my @roadInfo; my @kilometrierung; my @kilometrierung_km; my @kilometrierung_km_real; my @kilometrierung_km_res; my @kilometrierung_km_sum; my @kilometrierung_km_sum_real; my @kilometrierung_km_sum_res; my @kilometrierung_hmup; my @kilometrierung_hmup_real; my @kilometrierung_hmup_res; my @kilometrierung_hmup_sum; my @kilometrierung_hmup_sum_real; my @kilometrierung_hmup_sum_res; my @kilometrierung_hmdn; my @kilometrierung_hmdn_real; my @kilometrierung_hmdn_res; my @kilometrierung_hmdn_sum; my @kilometrierung_hmdn_sum_real; my @kilometrierung_hmdn_sum_res; my @rest; # ================================= # Check Placemarks except last one for (my $i = 0; $i < $#Placemarks; $i++) { my ($placeName, $touriInfo, $geodaten, $roadInfo, $kilometrierung, $rest) = get_placemarkData ($Placemarks[$i]); if ($placeName) { #print encode $encOut, "$placeName\n"; #print encode $encOut, "\n"; #print encode $encOut, " $geodaten\n"; #print encode $encOut, " $kilometrierung\n"; #print encode $encOut, "\n"; push @placeName, $placeName; push @touriInfo, $touriInfo; push @geodaten, $geodaten; push @roadInfo, $roadInfo; push @kilometrierung, $kilometrierung; push @rest, $rest; } else { die "ERROR in get_placemarkData\n"; } # =============== # Check Geodaten my ($lat, $lon, $alt, $info) = get_geodaten ($geodaten[$i]); if ($lat) { my ($trackPoint, $distance) = getClosestPoint ( $lat, $lon ); #print encode $encOut, " $lat\n"; #print encode $encOut, " $lon\n"; #print encode $encOut, " $alt\n"; #print encode $encOut, " $trackPoint\n"; #print encode $encOut, " $distance\n"; #print encode $encOut, "\n"; push @geodaten_lat, $lat; push @geodaten_lon, $lon; push @geodaten_alt, $alt; push @geodaten_alt_real, sprintf "%.0f", $track[$trackPoint][2]; push @geodaten_alt_res, $alt; push @geodaten_info, $info; push @geodaten_nearest_tp, $trackPoint; push @geodaten_dist_to_tp, $distance; } else { die "ERROR in get_geodaten\n"; } # ===================== # Check Kilometrierung my ($km, $km_sum, $hmup, $hmdn, $hmup_sum, $hmdn_sum) = get_kilometrierung ($kilometrierung[$i]); if ($verbose) { print encode $encOut, "$kilometrierung[$i]\n"; } if ($km) { #print encode $encOut, " $km\n"; #print encode $encOut, " $sum\n"; #print encode $encOut, " $hmup\n"; #print encode $encOut, " $hmdn\n"; #print encode $encOut, "\n"; push @kilometrierung_km, $km; push @kilometrierung_km_res, $km; push @kilometrierung_km_sum, $km_sum; push @kilometrierung_km_sum_res, $km_sum; push @kilometrierung_hmup, $hmup; push @kilometrierung_hmup_res, $hmup; push @kilometrierung_hmdn, $hmdn; push @kilometrierung_hmdn_res, $hmdn; push @kilometrierung_hmup_sum, $hmup_sum; push @kilometrierung_hmup_sum_res, $hmup_sum; push @kilometrierung_hmdn_sum, $hmdn_sum; push @kilometrierung_hmdn_sum_res, $hmdn_sum; } else { die "ERROR in get_kilometrierung\n"; } } # ===================== # Check last Placemark my ($placeName, $touriInfo, $geodaten, $roadInfo) = get_lastPlacemarkData ($Placemarks[$#Placemarks]); if ($placeName) { #print encode $encOut, "$placeName\n"; #print encode $encOut, "\n"; #print encode $encOut, " $geodaten\n"; #print encode $encOut, "\n"; push @placeName, $placeName; push @touriInfo, $touriInfo; push @geodaten, $geodaten; push @roadInfo, $roadInfo; push @kilometrierung, ""; push @rest, ""; push @kilometrierung_km, ""; push @kilometrierung_km_res, ""; push @kilometrierung_km_sum, ""; push @kilometrierung_km_sum_res, ""; push @kilometrierung_hmup, ""; push @kilometrierung_hmup_res, ""; push @kilometrierung_hmdn, ""; push @kilometrierung_hmdn_res, ""; push @kilometrierung_hmup_sum, ""; push @kilometrierung_hmup_sum_res, ""; push @kilometrierung_hmdn_sum, ""; push @kilometrierung_hmdn_sum_res, ""; } else { die "ERROR in get_lastPlacemarkData\n"; } # ================================= # Check Geodaten of last Placemark my ($lat, $lon, $alt, $info) = get_geodaten ($geodaten[$#geodaten]); if ($lat) { my ($trackPoint, $distance) = getClosestPoint ( $lat, $lon ); #print encode $encOut, " $lat\n"; #print encode $encOut, " $lon\n"; #print encode $encOut, " $alt\n"; #print encode $encOut, " $trackPoint\n"; #print encode $encOut, " $distance\n"; #print encode $encOut, "\n"; push @geodaten_lat, $lat; push @geodaten_lon, $lon; push @geodaten_alt, $alt; push @geodaten_alt_real, sprintf "%.0f", $track[$trackPoint][2]; push @geodaten_alt_res, $alt; push @geodaten_info, $info; push @geodaten_nearest_tp, $trackPoint; push @geodaten_dist_to_tp, $distance; } else { die "ERROR in get_geodaten\n"; } # ========================= # Calculate real Distances my $sum_real; for (my $i=0; $i < $#Placemarks; $i++) { my $km_real; for (my $j = $geodaten_nearest_tp[$i]; $j < $geodaten_nearest_tp[$i+1] ; $j++) { my $dist = getDistance ( $track[$j][0], $track[$j][1], $track[$j+1][0], $track[$j+1][1] ); $km_real += $dist; } $sum_real += $km_real; push @kilometrierung_km_real, sprintf "%.1f", $km_real; push @kilometrierung_km_sum_real, sprintf "%.0f", $sum_real; } push @kilometrierung_km_real, ""; push @kilometrierung_km_sum_real, ""; # ========================== # Calculate real Höhenmeter my $sum_hmup; my $sum_hmdn; for (my $i=0; $i < $#Placemarks; $i++) { my ($hmup, $hmdn) = getHmSum ($geodaten_nearest_tp[$i], $geodaten_nearest_tp[$i+1]); $sum_hmup += $hmup; $sum_hmdn += $hmdn; push @kilometrierung_hmup_real, sprintf "%.0f", $hmup; push @kilometrierung_hmdn_real, sprintf "%.0f", $hmdn; push @kilometrierung_hmup_sum_real, sprintf "%.0f", $sum_hmup; push @kilometrierung_hmdn_sum_real, sprintf "%.0f", $sum_hmdn; } push @kilometrierung_hmup_real, ""; push @kilometrierung_hmdn_real, ""; push @kilometrierung_hmup_sum_real, ""; push @kilometrierung_hmdn_sum_real, ""; # ===================================== # Check ascending order of TrackPoints for (my $i=0; $i<$#Placemarks; $i++) { if ( $geodaten_nearest_tp[$i] <= $geodaten_nearest_tp[$i+1] ) { #ok } else { print encode $encOut, "ERROR: Wrong TrackPoint Order in:\n"; print encode $encOut, " $placeName[$i] :: $geodaten_nearest_tp[$i]\n"; print encode $encOut, " $placeName[$i+1] :: $geodaten_nearest_tp[$i+1]\n\n"; } } # =================== # Summarize all Data my $output = sprintf "%5s %3s %4s %5s %5s %5s %5s %5s %s", "tp#", "dist", "k", "k_s", "k_r", "k_s_r", "a", "a_r", "place"; if ($verbose) { print encode $encOut, "$output\n"; } for (my $i=0; $i <= $#Placemarks; $i++) { my $output = sprintf "%5d %3.0f m %4s %5s %5s %5s %5s %5s %s", $geodaten_nearest_tp[$i], $geodaten_dist_to_tp[$i], $kilometrierung_km[$i], $kilometrierung_km_sum[$i], $kilometrierung_km_real[$i], $kilometrierung_km_sum_real[$i], $geodaten_alt[$i], $geodaten_alt_real[$i], $placeName[$i]; if ($verbose) { print encode $encOut, "$output\n"; } } if ($verbose) { print encode $encOut, "\n"; } # ================== # Summarize Changes my $change; my $output = sprintf "%5s %3s %4s %5s %5s %5s %5s %5s %s", "tp#", "dist", "k", "k_s", "k_r", "k_s_r", "a", "a_r", "place"; print encode $encOut, "$output\n"; for (my $i=0; $i <= $#Placemarks; $i++) { $kilometrierung_km_real[$i] =~ s/\./\,/; if ($kilometrierung_km[$i] eq $kilometrierung_km_real[$i]) { $kilometrierung_km[$i] = ""; $kilometrierung_km_real[$i] = ""; } else { $kilometrierung_km_res[$i] = $kilometrierung_km_real[$i]; $change = 1; } if ($kilometrierung_km_sum[$i] eq $kilometrierung_km_sum_real[$i]) { $kilometrierung_km_sum[$i] = ""; $kilometrierung_km_sum_real[$i] = ""; } else { $kilometrierung_km_sum_res[$i] = $kilometrierung_km_sum_real[$i]; $change = 1; } if ($changePlaceHm) { if ($geodaten_alt[$i] eq $geodaten_alt_real[$i]) { $geodaten_alt[$i] = ""; $geodaten_alt_real[$i] = ""; } else { $geodaten_alt_res[$i] = $geodaten_alt_real[$i]; $change = 1; } } else { $geodaten_alt[$i] = ""; $geodaten_alt_real[$i] = ""; } if ($changeDistHm) { if ($kilometrierung_hmdn[$i] eq $kilometrierung_hmdn_real[$i]) { $kilometrierung_hmdn[$i] = ""; $kilometrierung_hmdn_real[$i] = ""; } else { $kilometrierung_hmdn_res[$i] = $kilometrierung_hmdn_real[$i]; $change = 1; } if ($kilometrierung_hmup[$i] eq $kilometrierung_hmup_real[$i]) { $kilometrierung_hmup[$i] = ""; $kilometrierung_hmup_real[$i] = ""; } else { $kilometrierung_hmup_res[$i] = $kilometrierung_hmup_real[$i]; $change = 1; } if ($kilometrierung_hmup_sum[$i] eq $kilometrierung_hmup_sum_real[$i]) { $kilometrierung_hmup_sum[$i] = ""; $kilometrierung_hmup_sum_real[$i] = ""; } else { $kilometrierung_hmup_sum_res[$i] = $kilometrierung_hmup_sum_real[$i]; $change = 1; } if ($kilometrierung_hmdn_sum[$i] eq $kilometrierung_hmdn_sum_real[$i]) { $kilometrierung_hmdn_sum[$i] = ""; $kilometrierung_hmdn_sum_real[$i] = ""; } else { $kilometrierung_hmdn_sum_res[$i] = $kilometrierung_hmdn_sum_real[$i]; $change = 1; } } else { } my $output = sprintf "%5d %3.0f m %4s %5s %5s %5s %5s %5s %s", $geodaten_nearest_tp[$i], $geodaten_dist_to_tp[$i], $kilometrierung_km[$i], $kilometrierung_km_sum[$i], $kilometrierung_km_real[$i], $kilometrierung_km_sum_real[$i], $geodaten_alt[$i], $geodaten_alt_real[$i], $placeName[$i]; print encode $encOut, "$output\n"; } # ====================== # Write Changes to File if ($change) { $fileContent = ""; $fileContent .= $pre_Roadbook; for (my $i=0; $i < $#Placemarks; $i++) { $fileContent .= "=== $placeName[$i] ===\n"; $fileContent .= "$touriInfo[$i]\n"; $fileContent .= "{{Geodaten|$geodaten_lat[$i]|$geodaten_lon[$i]|$geodaten_alt_res[$i]|$geodaten_info[$i]}}\n"; $fileContent .= "$roadInfo[$i]\n"; if ($kilometrierung[$i] =~ /KilometrierungHm6/) { $fileContent .= "{{KilometrierungHm6|$kilometrierung_km_res[$i]|$kilometrierung_hmup_res[$i]|$kilometrierung_hmdn_res[$i]|$kilometrierung_km_sum_res[$i]|$kilometrierung_hmup_sum_res[$i]|$kilometrierung_hmdn_sum_res[$i]}}"; } elsif ($kilometrierung[$i] =~ /KilometrierungHm/) { $fileContent .= "{{KilometrierungHm|$kilometrierung_km_res[$i]|$kilometrierung_km_sum_res[$i]|$kilometrierung_hmup_sum_res[$i]|$kilometrierung_hmdn_sum_res[$i]}}"; } else { $fileContent .= "{{Kilometrierung|$kilometrierung_km_res[$i]|$kilometrierung_km_sum_res[$i]}}"; } $fileContent .= "\n$rest[$i]"; } $fileContent .= "=== $placeName[$#Placemarks] ===\n"; $fileContent .= "$touriInfo[$#Placemarks]\n"; $fileContent .= "{{Geodaten|$geodaten_lat[$#Placemarks]|$geodaten_lon[$#Placemarks]|$geodaten_alt_res[$#Placemarks]|$geodaten_info[$#Placemarks]}}\n"; $fileContent .= "$roadInfo[$#Placemarks]"; $fileContent .= $post_Roadbook; open FOUT, "> $outDir/${routeFileName_e}_new.tx" or die $!; print FOUT encode ($encoding, $fileContent); close FOUT; } exit; #========================================================== #========================================================== sub getDistance { use POSIX qw(acos); my ($tp1_lat, $tp1_lon, $tp2_lat, $tp2_lon) = @_; my $PI = 3.1415926; my $lat1 = $tp1_lat / 180 * $PI; my $lon1 = $tp1_lon / 180 * $PI; my $lat2 = $tp2_lat / 180 * $PI; my $lon2 = $tp2_lon / 180 * $PI; my $val = sin($lat1) * sin($lat2) + cos($lat1) * cos($lat2) * cos($lon2-$lon1); if ($val > +1) { $val = +1; #print " ACOS-Error: $tp1_lon,$tp1_lat !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"; } if ($val < -1) { $val = -1; #print " ACOS-Error: $tp1_lon,$tp1_lat !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"; } my $dist = acos($val) * 6378.137; # radius of equator in km #if (Double.isNaN(dist)) dist = 0; return $dist; } #========================================================== sub getClosestPoint { my ($tp_lat, $tp_lon) = @_; my $minDist = 111111111; my $point = -1; for (my $i = 0; $i <= $#track ; $i++) { my $dist = getDistance ( $track[$i][0], $track[$i][1], $tp_lat, $tp_lon ); if ($dist < $minDist) { $minDist = $dist; $point = $i; } } return ($point, $minDist*1000); } #========================================================== sub getHmSum { my ($tp_begin, $tp_end) = @_; if ($tp_end >= $#track) { $tp_end = $#track-1; } my $HmSumUp = 0; my $HmSumDn = 0; for (my $i = $tp_begin; $i <= $tp_end ; $i++) { my $alt_0 = $track[$i][2]; my $alt_1 = $track[$i+1][2]; my $diff = $alt_1 - $alt_0; if ($diff < 0) { $HmSumDn += $diff * (-1); } if ($diff > 0) { $HmSumUp += $diff * (+1); } } return ($HmSumUp, $HmSumDn); }