Radreise-Wiki:Km.pl: Unterschied zwischen den Versionen
Aus Radreise-Wiki
Jmages (Diskussion | Beiträge) |
Jmages (Diskussion | Beiträge) |
||
| (13 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
| Zeile 3: | Zeile 3: | ||
perl km.pl Donau | perl km.pl Donau | ||
Das Skript berechnet die Kilometrierung und speichert das Ergebnis als Datei im Output- | Das Skript berechnet die Kilometrierung des Roadbook und speichert das Ergebnis als Datei im Output-Verzeichnis (siehe [[Radreise-Wiki:ini.pl|ini.pl]]). Die Datei "Donau_new.tx" 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 ''$changePlaceHm = 1'' setzt, werden sämtliche Orts-Höhenmeter über die Höhendaten des Tracks neu berechnet. | |||
'''Quellcode des Skripts:''' | |||
<nowiki> | <nowiki> | ||
use strict; | |||
use Encode qw (encode decode); | |||
my $smoothAlt = 6; | |||
my $changePlaceHm = 1; | |||
my $changeDistHm = 1; | |||
my $makeRetour = 0; # not yet implemented | |||
my $verbose = 0; | |||
#================================== | |||
# Default Settings and Subroutines | |||
push @INC, '.'; | |||
require "ini.pl"; | |||
my ($baseDir, $outDir, $username, $password, $encoding, $encAnsi, $encOut) = getIni(); | |||
my $dir_txt = "$baseDir/text"; | |||
my $dir_trk = "$baseDir/tracks"; | |||
my ($routeFileName, $routeFileName_e) = get_routeFileName (@ARGV); | |||
my ($track, $rawTrack) = get_trackfile ($dir_trk, $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 / 1000; | |||
} | |||
#============================= | |||
# Gesamt-Höhenmeter berechnen | |||
my ($HmSumUp, $HmSumDn) = getHmSum (0, $#track); | |||
#============================= | |||
# Ausgabe der Track-Statistik | |||
my $length_s = sprintf "%0.0f", $length; | |||
my $HmSumUp_s = sprintf "%0.0f", $HmSumUp; | |||
my $HmSumDn_s = sprintf "%0.0f", $HmSumDn; | |||
printf "Trackpunkte : %6d pt\n", $#track + 1; | |||
print encode $encOut, "| Länge = $length_s\n"; | |||
print encode $encOut, "| Höhenmeter (auf) = $HmSumUp_s<!-- Glättungsfaktor = $smoothAlt -->\n"; | |||
print encode $encOut, "| Höhenmeter (ab) = $HmSumDn_s\n"; | |||
# ============== | |||
# Get Routefile | |||
my ($fileContent, $pre_Roadbook, $Roadbook, $post_Roadbook) = | |||
get_routefile ($dir_txt, $routeFileName); | |||
if ($fileContent =~ /ERROR/) { | |||
die "$routeFileName not existent\n"; | |||
} | |||
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) { | |||
if ($verbose) { 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, \@track ); | |||
#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 ne "x") { | |||
#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 { | |||
print encode $encOut, "ERROR in get_kilometrierung: $placeName[$i]\n"; | |||
die; | |||
} | |||
} | |||
# ===================== | |||
# 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, \@track ); | |||
#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] ) / 1000; | |||
$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 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); | |||
} | |||
</nowiki> | |||
[[Kategorie: Verwaltungs-Software]] | |||
Aktuelle Version vom 12. Januar 2018, 18: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.tx" 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 $changePlaceHm = 1 setzt, werden sämtliche Orts-Höhenmeter über die Höhendaten des Tracks neu berechnet.
Quellcode des Skripts:
use strict;
use Encode qw (encode decode);
my $smoothAlt = 6;
my $changePlaceHm = 1;
my $changeDistHm = 1;
my $makeRetour = 0; # not yet implemented
my $verbose = 0;
#==================================
# Default Settings and Subroutines
push @INC, '.';
require "ini.pl";
my ($baseDir, $outDir, $username, $password, $encoding, $encAnsi, $encOut) = getIni();
my $dir_txt = "$baseDir/text";
my $dir_trk = "$baseDir/tracks";
my ($routeFileName, $routeFileName_e) = get_routeFileName (@ARGV);
my ($track, $rawTrack) = get_trackfile ($dir_trk, $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 / 1000;
}
#=============================
# Gesamt-Höhenmeter berechnen
my ($HmSumUp, $HmSumDn) = getHmSum (0, $#track);
#=============================
# Ausgabe der Track-Statistik
my $length_s = sprintf "%0.0f", $length;
my $HmSumUp_s = sprintf "%0.0f", $HmSumUp;
my $HmSumDn_s = sprintf "%0.0f", $HmSumDn;
printf "Trackpunkte : %6d pt\n", $#track + 1;
print encode $encOut, "| Länge = $length_s\n";
print encode $encOut, "| Höhenmeter (auf) = $HmSumUp_s<!-- Glättungsfaktor = $smoothAlt -->\n";
print encode $encOut, "| Höhenmeter (ab) = $HmSumDn_s\n";
# ==============
# Get Routefile
my ($fileContent, $pre_Roadbook, $Roadbook, $post_Roadbook) =
get_routefile ($dir_txt, $routeFileName);
if ($fileContent =~ /ERROR/) {
die "$routeFileName not existent\n";
}
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) {
if ($verbose) { 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, \@track );
#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 ne "x") {
#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 {
print encode $encOut, "ERROR in get_kilometrierung: $placeName[$i]\n";
die;
}
}
# =====================
# 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, \@track );
#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] ) / 1000;
$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 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);
}