Radreise-Wiki:Km.pl: Unterschied zwischen den Versionen
Aus Radreise-Wiki
Aighes (Diskussion | Beiträge) |
Jmages (Diskussion | Beiträge) |
||
(12 dazwischenliegende Versionen desselben Benutzers 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); }