Radreise-Wiki:Overview.pl: Unterschied zwischen den Versionen

Aus Radreise-Wiki
Zeile 1: Zeile 1:
Das Perl-Skript '''overview.pl''' generiert ein KML-File in dem alle Tracks des Hauptnetzes enthalten sind. Die Tracks werden ohne Punktereduzierung übernommen, sodaß die Datei recht umfangreich wird. Von GoogleEarth kann sie jedoch noch verarbeitet werden. Mit der '''Overview.kml''' Datei kann bei neue Strecken gut überprüft werden, ob sie ins Hauptnetz passen und wie die Anschlüsse zu legen sind.
Das Perl-Skript '''overview.pl''' generiert ein KML-File in dem alle Tracks des Hauptnetzes enthalten sind. Die Tracks werden ohne Punktereduzierung übernommen, sodaß die Datei recht umfangreich wird. Von GoogleEarth kann sie jedoch noch verarbeitet werden. Mit der '''Overview.kml''' Datei kann bei neue Strecken gut überprüft werden, ob sie ins Hauptnetz passen und wie die Anschlüsse zu legen sind.
'''Quellcode des Skripts:'''


  <nowiki>
  <nowiki>
  use strict;
  use strict;
   
   
# Encoding Stuff
  use Encode qw(encode decode);
  use Encode qw(encode decode);
my $encUTF8 = 'utf-8';  # UTF-8
my $encDOS  = 'cp850' ; # DOS Fenster
my $encAnsi = 'cp1252'; # Windows Ansi
my $encOut  = $encDOS;
use URI::Escape qw( uri_escape_utf8 );
use CGI; my $cgi = new CGI;
# Default Directories
   
   
# Default Settings
  require "ini.pl";
  require "ini.pl";
  my ($baseDir, $outDir, $username, $password) = getIni();
  my ($baseDir, $outDir, $username, $password, $encoding, $encAnsi, $encOut) = getIni();
   
   
  my $selectedType;
  my $selectedType;
Zeile 36: Zeile 29:
   
   
  open FIN, "$baseDir/RouteList.txt" or die "$! : $baseDir/RouteList.txt";
  open FIN, "$baseDir/RouteList.txt" or die "$! : $baseDir/RouteList.txt";
  while (<FIN>) { push @routeList, decode $encUTF8, $_; }
  while (<FIN>) { push @routeList, decode $encoding, $_; }
  close (FIN);
  close (FIN);
   
   
Zeile 64: Zeile 57:
  $routeFileName = encode $encAnsi, $routeName;
  $routeFileName = encode $encAnsi, $routeName;
   
   
  my $urlstring  = uri_escape_utf8($routeFileName);
  $routeURL = encodeRouteNameURL($routeFileName);
$urlstring =~ s/%20/\_/g;
$urlstring =~ s/\(/%28/g;
$urlstring =~ s/\)/%29/g;
$urlstring =~ s/\'/%27/g;
$routeURL = $urlstring;
   
   
  # ==================
  # ==================
  # Reading Trackfile
  # Reading Trackfile
   
   
  print encode $encDOS, "Reading Trackfile : $routeFileName\n";
  print encode $encOut, "Reading Trackfile : $routeFileName\n";
   
   
  open FIN, "$baseDir/tracks/$routeFileName.txt" or die "$! : $baseDir/tracks/$routeFileName.txt";
  open FIN, "$baseDir/tracks/$routeFileName.txt" or die "$! : $baseDir/tracks/$routeFileName.txt";
Zeile 84: Zeile 72:
  # Reading Textfile
  # Reading Textfile
   
   
  print encode $encDOS, "Reading Textfile  : $routeFileName\n";
  print encode $encOut, "Reading Textfile  : $routeFileName\n";
   
   
  my $content;
  my $content;
  open FILE, "$baseDir/text/$routeFileName.txt" or die "$baseDir/text/$routeFileName.txt: $!";
  open FILE, "$baseDir/text/$routeFileName.txt" or die "$baseDir/text/$routeFileName.txt: $!";
  while (<FILE>) { $content .= decode $encUTF8, $_; }
  while (<FILE>) { $content .= decode $encoding, $_; }
  close FILE;
  close FILE;
   
   
Zeile 117: Zeile 105:
  /xs) {
  /xs) {
   
   
  print encode $encDOS, "Chapters in $routeName are not correct!\n";  
  print encode $encOut, "Chapters in $routeName are not correct!\n";  
  exit(1);
  exit(1);
  }
  }
Zeile 210: Zeile 198:
  if ($roadInfo  ne "") { $road  = 1; }
  if ($roadInfo  ne "") { $road  = 1; }
   
   
  my $placeNameURL = $cgi->escape($placeName);
  my $placeNameURL = encodePlaceNameURL($placeName);
$placeNameURL    =~ s/\%20/\_/g;
$placeNameURL    =~ s/\%/\./g;
  if ($placeName{$placeName} > 1) {
  if ($placeName{$placeName} > 1) {
  $placeNameURL .= "_$placeName{$placeName}";
  $placeNameURL .= "_$placeName{$placeName}";
Zeile 267: Zeile 254:
  if ($roadInfo  ne "") { $road  = 1; }
  if ($roadInfo  ne "") { $road  = 1; }
   
   
  my $placeNameURL = $cgi->escape($placeName);
  my $placeNameURL = encodePlaceNameURL($placeName);
$placeNameURL    =~ s/\%20/\_/g;
$placeNameURL    =~ s/\%/\./g;
  if ($placeName{$placeName} > 1) {
  if ($placeName{$placeName} > 1) {
  $placeNameURL .= "_$placeName{$placeName}";
  $placeNameURL .= "_$placeName{$placeName}";
Zeile 433: Zeile 419:
  }
  }
   
   
  &saveFileIfChangedOrNew ("$baseDir/", "Overview.kml", encode ($encUTF8, $content), 1);
  &saveFileIfChangedOrNew ("$baseDir/", "Overview.kml", encode ($encoding, $content), 1);
   
   
  exit(0);
  exit(0);
Zeile 470: Zeile 456:
  print encode $encOut, "Saving KML-File  : $routeName\n";
  print encode $encOut, "Saving KML-File  : $routeName\n";
   
   
  &saveFileIfChangedOrNew ("$baseDir/kml/", "$routeFileName.kml", encode ($encUTF8, $content), 1);
  &saveFileIfChangedOrNew ("$baseDir/kml/", "$routeFileName.kml", encode ($encoding, $content), 1);
   
   
  if      ($category eq "Fluss-Radfernweg") {
  if      ($category eq "Fluss-Radfernweg") {
Zeile 510: Zeile 496:
  }
  }
  }
  }
   
  </nowiki>
#==========================================================
use Digest::MD5;
qw(md5_hex);
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
sub saveFileIfChangedOrNew {
(my $path, my $fileName, my $file, my $kmz) = @_;
if (open(FILE, "< $path$fileName")) {
my $md5 = Digest::MD5->new;
while (<FILE>) {
$md5->add($_);
}
close(FILE);
my $md5_old = $md5->hexdigest;
$md5 = Digest::MD5->new;
$md5->add($file);
my $md5_new = $md5->hexdigest;
unless ($md5_old eq $md5_new) {
print encode $encOut, "****************** Overwriting file $fileName ******************\n";
open  FT,"> $path$fileName";
print FT $file;
close FT;
if ($kmz) {
my $zip = Archive::Zip->new();
$zip->addFile("$path$fileName","doc.kml");
$fileName =~ s/\.kml/\.kmz/;
unless ( $zip->writeToFileNamed("$outDir/$fileName") == AZ_OK ) {
  die 'write error';
}
}
}
} else {
print encode $encOut, "****************** Creating new file $fileName ******************\n";
open  FT,"> $path$fileName";
print FT $file;
close FT;
if ($kmz) {
my $zip = Archive::Zip->new();
$zip->addFile("$path$fileName","doc.kml");
$fileName =~ s/\.kml/\.kmz/;
unless ( $zip->writeToFileNamed("$outDir/$fileName") == AZ_OK ) {
  die 'write error';
}
}
}
}
# =========================================================
  </nowiki>

Version vom 9. September 2011, 18:18 Uhr

Das Perl-Skript overview.pl generiert ein KML-File in dem alle Tracks des Hauptnetzes enthalten sind. Die Tracks werden ohne Punktereduzierung übernommen, sodaß die Datei recht umfangreich wird. Von GoogleEarth kann sie jedoch noch verarbeitet werden. Mit der Overview.kml Datei kann bei neue Strecken gut überprüft werden, ob sie ins Hauptnetz passen und wie die Anschlüsse zu legen sind.

Quellcode des Skripts:

 use strict;
 
 use Encode qw(encode decode);
 
 # Default Settings
 require "ini.pl";
 my ($baseDir, $outDir, $username, $password, $encoding, $encAnsi, $encOut) = getIni();
 
 my $selectedType;
 
 if ($ARGV[0]) {
 
 	$selectedType = $ARGV[0];
 
 } else {
 
 	$selectedType = "H";
 }
 
 # ==================
 # Reading RouteList
 
 my @routeList;
 
 open FIN, "$baseDir/RouteList.txt" or die "$! : $baseDir/RouteList.txt";
 while (<FIN>) { push @routeList, decode $encoding, $_; }
 close (FIN);
 
 my @routeFile               = ();
 my @Fluss_Radfernweg        = ();
 my @Anderer_Radfernweg      = ();
 my @Querverbindung          = ();
 my @Radweit_Strecke         = ();
 my @Regionaler_Radwanderweg = ();
 
 my $routeName;
 my $routeFileName;
 my $routeURL;
 my $category;
 my $counter;
 
 foreach my $line (@routeList) {
 
 	(my $dateTXT, my $dateKML, my $type, $routeName) = split " :: ", $line;
 
 	chomp($routeName);
 
 	if ($type eq $selectedType) {
 
 		$counter ++;
 
 		$routeFileName = encode $encAnsi, $routeName;
 
 		$routeURL = encodeRouteNameURL($routeFileName);
 
 		# ==================
 		# Reading Trackfile
 
 		print encode $encOut, "Reading Trackfile : $routeFileName\n";
 
 		open FIN, "$baseDir/tracks/$routeFileName.txt" or die "$! : $baseDir/tracks/$routeFileName.txt";
 		my $track = <FIN>;
 		close (FIN);
 
 
 		# =================
 		# Reading Textfile
 
 		print encode $encOut, "Reading Textfile  : $routeFileName\n";
 
 		my $content;
 		open FILE, "$baseDir/text/$routeFileName.txt" or die "$baseDir/text/$routeFileName.txt: $!";
 		while (<FILE>) { $content .= decode $encoding, $_; }
 		close FILE;
 
 
 		# =============
 		# Check Layout
 
 		if ($content !~ /
 
 			{{TOC_Radfernweg}}\n
 			.*
 			\n==\ Roadbook\ ==\n
 			.*
 			\n==\ GPS-Tracks\ ==\n
 			.*
 			\[\[Kategorie:\s*(
 				Fluss-Radfernweg|
 				Anderer\ Radfernweg|
 				Querverbindung|
 				Direktverbindung|
 				Regionaler\ Radwanderweg|
 				Routenplaner\ Testroute|
 				Fernroute|
 				Streckenvorschlag|
 				Stadtrundfahrt
 			)\]\]
 
 			/xs) {
 
 			print encode $encOut, "Chapters in $routeName are not correct!\n"; 
 			exit(1);
 		}
 
 		$category = $1;
 
 		if (($category eq "Regionaler Radwanderweg") or 
 			($category eq "Streckenvorschlag") or
 			($category eq "Stadtrundfahrt") or
 			($category eq "Fernroute")
 			) {
 
 			$category = "Anderer Radfernweg";
 		}
 
 		# =============
 		# Get Roadbook
 
 		my $pre_Roadbook;
 		my $Roadbook;
 		my $post_Roadbook;
 
 		if ( $content =~ /(.*?== Roadbook ==.*?)(===.*?)(\n== .*)/s ) {
 
 			$pre_Roadbook  = $1;
 			$Roadbook      = $2;
 			$post_Roadbook = $3;
 
 		} else { die "Wrong Roadbook Format\n"; }
 
 		my @Roadbook = split "\n", $Roadbook;
 
 
 		# ===============
 		# Get Placemarks
 
 		my @content   = split "\n", $content;
 
 		@routeFile = ();
 
 		push @routeFile, "	<name>$routeName</name>\n";
 		push @routeFile, "	<Metadata>\n";
 		push @routeFile, "		<![CDATA[<!--$routeURL-->]]>\n";
 		push @routeFile, "	</Metadata>\n";
 		push @routeFile, "	<open>0</open>\n";
 		push @routeFile, "	<Placemark>\n";
 		push @routeFile, "		<name>$routeName GPS-Track</name>\n";
 		push @routeFile, "		<description>\n";
 		push @routeFile, "			<![CDATA[<a href=\"http://radreise-wiki.de/$routeURL\">Wiki</a>]]> \n";
 		push @routeFile, "		</description>\n";
 		push @routeFile, "		<Style>\n";
 		push @routeFile, "			<LineStyle>\n";
 		push @routeFile, "				<color>ffff00ff</color>\n";
 		push @routeFile, "				<width>2</width>\n";
 		push @routeFile, "			</LineStyle>\n";
 		push @routeFile, "		</Style>\n";
 		push @routeFile, "		<LineString>\n";
 		push @routeFile, "			<tessellate>1</tessellate>\n";
 		push @routeFile, "			<coordinates>\n";
 		push @routeFile, "				$track\n";
 		push @routeFile, "			</coordinates>\n";
 		push @routeFile, "		</LineString>\n";
 		push @routeFile, "	</Placemark>\n";
 		push @routeFile, "	<Folder>\n";
 		push @routeFile, "		<name>Orte</name>\n";
 		push @routeFile, "		<open>0</open>\n";
 
 		my $roadBook   = 0;
 		my $place      = 0;
 		my $touri      = 0;
 		my $geo        = 0;
 		my $lon        = 0;
 		my $lat        = 0;
 		my $alt        = 0;
 		my $road       = 0;
 		my $kilo       = 0;
 
 		my $placeName  = "";
 		my %placeName  = ();
 		my $touriInfo  = "";
 		my $geoData    = "";
 		my $roadInfo   = "";
 		my $kilometer  = "";
 
 		foreach my $line (@content) {
 
 			# Last Placemark is finished, Roadbook is finished
 			if (($roadBook) and ($line =~ /^== .* ==$/)) {
 
 				# Status-Übersicht
 				if ($touriInfo ne "") { $touri = 1; }
 				if ($roadInfo  ne "") { $road  = 1; }
 
 				my $placeNameURL = encodePlaceNameURL($placeName);
 
 				if ($placeName{$placeName} > 1) {
 					$placeNameURL .= "_$placeName{$placeName}";
 				}
 
 				push @routeFile, "		<Placemark>\n";
 				push @routeFile, "			<name>$placeName</name>\n";
 				push @routeFile, "			<visibility>0</visibility>\n";
 				push @routeFile, "			<description>\n";
 				push @routeFile, "				<![CDATA[<a id=\"$touri-$road\" href=\"http://radreise-wiki.de/$routeURL#$placeNameURL\">$routeName</a>]]> \n";
 				push @routeFile, "			</description>\n";
 				push @routeFile, "			<Point>\n";
 				push @routeFile, "				<coordinates>\n";
 				push @routeFile, "					$lon,$lat,$alt\n";
 				push @routeFile, "				</coordinates>\n";
 				push @routeFile, "			</Point>\n";
 				push @routeFile, "		</Placemark>\n";
 
 				$roadBook  = 0;
 				$place     = 0;
 				$touri     = 0;
 				$geo       = 0;
 				$lon       = 0;
 				$lat       = 0;
 				$alt       = 0;
 				$road      = 0;
 				$kilo      = 0;
 
 				$placeName  = "";
 				%placeName  = ();
 				$touriInfo  = "";
 				$geoData    = "";
 				$roadInfo   = "";
 				$kilometer  = "";
 
 			# Start of Roadbook
 			} elsif ($line =~ /^== Roadbook ==$/) {
 
 				$roadBook = 1;
 
 			# A new Place within the Roadbook
 			} elsif ($roadBook and ($line =~ /^=== (.*) ===$/)) {
 
 				if ($place and not $kilo) {
 					print "   No Kilometers: $routeName :: $placeName\n";
 					#exit;
 				}
 
 				# Save previous place
 				if ($place) {
 
 					# Status-Übersicht
 					if ($touriInfo ne "") { $touri = 1; }
 					if ($roadInfo  ne "") { $road  = 1; }
 
 					my $placeNameURL = encodePlaceNameURL($placeName);
 
 					if ($placeName{$placeName} > 1) {
 						$placeNameURL .= "_$placeName{$placeName}";
 					}
 
 					push @routeFile, "		<Placemark>\n";
 					push @routeFile, "			<name>$placeName</name>\n";
 					push @routeFile, "			<visibility>0</visibility>\n";
 					push @routeFile, "			<description>\n";
 					push @routeFile, "				<![CDATA[<a id=\"$touri-$road\" href=\"http://radreise-wiki.de/$routeURL#$placeNameURL\">$routeName</a>]]> \n";
 					push @routeFile, "			</description>\n";
 					push @routeFile, "			<Point>\n";
 					push @routeFile, "				<coordinates>\n";
 					push @routeFile, "					$lon,$lat,$alt\n";
 					push @routeFile, "				</coordinates>\n";
 					push @routeFile, "			</Point>\n";
 					push @routeFile, "		</Placemark>\n";
 				}
 
 				$place     = 1;
 				$touri     = 0;
 				$geo       = 0;
 				$lon       = 0;
 				$lat       = 0;
 				$alt       = 0;
 				$road      = 0;
 				$kilo      = 0;
 
 				$placeName  = $1;
 				if (defined $placeName{$placeName}) {
 					$placeName{$placeName}++;
 				} else {
 					$placeName{$placeName} = 1;
 				}
 
 				$touriInfo  = "";
 				$geoData    = "";
 				$roadInfo   = "";
 				$kilometer  = "";
 
 			# Geodata within the Placemark
 			} elsif ($place and ($line =~ /^{{Geodaten\|(.*)}}$/)) {
 
 				$geo     = 1;
 				$geoData = $1;
 
 				if ($geoData =~ /^([-]?\d+\.\d+)\|([-]?\d+\.\d+)\|([-]?\d+)\|([^\|]+)$/) {
 
 					$lat  = $1;
 					$lon  = $2;
 					$alt  = $3;
 
 				} else {
 					print "Error in Geodata: $geoData\n";
 					exit;
 				}
 
 			# Kilometrierung within Placemark
 			} elsif ($place and ($line =~ /^{{Kilometrierung\|(.*)}}$/)) {
 
 				if (not $geo) {
 					print "No Coordinates: $routeName :: $placeName\n";
 					exit;
 				}
 
 				if ($kilo) {
 					print "   Multiple Kilometers: $routeName :: $placeName\n";
 					#exit;
 				}
 
 				$kilo      = 1;
 				$kilometer = $1;
 
 			# KilometrierungHm within Placemark
 			} elsif ($place and ($line =~ /^{{KilometrierungHm\|(.*)}}$/)) {
 
 				if (not $geo) {
 					print "No Coordinates: $routeName :: $placeName\n";
 					exit;
 				}
 
 				if ($kilo) {
 					print "   Multiple Kilometers: $routeName :: $placeName\n";
 					#exit;
 				}
 
 				$kilo      = 1;
 				$kilometer = $1;
 
 			# Empty Line
 			} elsif ($line =~ /^\s*$/) {
 
 			} elsif ($line =~ /<br style="clear:both" \/>/) {
 
 			} elsif ($line =~ /\[\[Bild/) {
 
 			} elsif ($place and not $geo and not $kilo) {
 
 				$touriInfo .= "$line\n";
 
 			} elsif ($place and $geo and not $kilo) {
 
 				$roadInfo .= "$line\n";
 
 			}
 		}
 
 		&saveRouteFile;
 
 		print "\n";
 
 	} # if ($type eq "H") {
 
 } # foreach my $line (@routeList) {
 
 print "$counter Files read.\n\n";
 
 
 # ==============================
 # Generieren des Overview-Files
 
 print "Saving Overview.kml File\n";
 
 my   @rfwAllFile = ();
 
 push @rfwAllFile, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
 push @rfwAllFile, "<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n";
 push @rfwAllFile, "<Document>\n";
 push @rfwAllFile, "	<name>Radfernwege im Radreise-Wiki</name>\n";
 push @rfwAllFile, "	<open>1</open>\n";
 
 push @rfwAllFile, "	<Folder>\n";
 push @rfwAllFile, "		<name>Fluss-Radfernweg</name>\n";
 push @rfwAllFile, "		<open>0</open>\n";
 push @rfwAllFile, @Fluss_Radfernweg;
 push @rfwAllFile, "	</Folder>\n";
 
 push @rfwAllFile, "	<Folder>\n";
 push @rfwAllFile, "		<name>Anderer Radfernweg</name>\n";
 push @rfwAllFile, "		<open>0</open>\n";
 push @rfwAllFile, @Anderer_Radfernweg;
 push @rfwAllFile, "	</Folder>\n";
 
 push @rfwAllFile, "	<Folder>\n";
 push @rfwAllFile, "		<name>Querverbindung</name>\n";
 push @rfwAllFile, "		<open>0</open>\n";
 push @rfwAllFile, @Querverbindung;
 push @rfwAllFile, "	</Folder>\n";
 
 
 push @rfwAllFile, "	<Folder>\n";
 push @rfwAllFile, "		<name>Direktverbindung</name>\n";
 push @rfwAllFile, "		<open>0</open>\n";
 push @rfwAllFile, @Radweit_Strecke;
 push @rfwAllFile, "	</Folder>\n";
 
 push @rfwAllFile, "</Document>\n";
 push @rfwAllFile, "</kml>\n";
 
 my $content = "";
 foreach my $line (@rfwAllFile) {
 	$content .= $line;
 }
 
 &saveFileIfChangedOrNew ("$baseDir/", "Overview.kml", encode ($encoding, $content), 1);
 
 exit(0);
 
 
 #==========================================================
 #==========================================================
 
 sub saveRouteFile {
 
 	if ($routeName ne "") {
 
 		push @routeFile, "	</Folder>\n";
 
 		my   @routeFileAll = ();
 
 		push @routeFileAll, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
 		push @routeFileAll, "<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n";
 		push @routeFileAll, "<Document>\n";
 
 		push @routeFileAll, @routeFile;
 
 		push @routeFileAll, "</Document>\n";
 		push @routeFileAll, "</kml>\n";
 
 		my $content = "";
 		foreach my $line (@routeFileAll) {
 			$content .= $line;
 		}
 
 		$content =~ s/id="0-0" //gs;
 		$content =~ s/id="0-1" //gs;
 		$content =~ s/id="1-0" //gs;
 		$content =~ s/id="1-1" //gs;
 
 		print encode $encOut, "Saving KML-File   : $routeName\n";
 
 		&saveFileIfChangedOrNew ("$baseDir/kml/", "$routeFileName.kml", encode ($encoding, $content), 1);
 
 		if      ($category eq "Fluss-Radfernweg") {
 
 			push @Fluss_Radfernweg, "	<Folder>\n";
 			push @Fluss_Radfernweg, @routeFile;
 			push @Fluss_Radfernweg, "	</Folder>\n";
 
 		} elsif ($category eq "Anderer Radfernweg") {
 
 			push @Anderer_Radfernweg, "	<Folder>\n";
 			push @Anderer_Radfernweg, @routeFile;
 			push @Anderer_Radfernweg, "	</Folder>\n";
 
 		} elsif ($category eq "Querverbindung") {
 
 			push @Querverbindung, "	<Folder>\n";
 			push @Querverbindung, @routeFile;
 			push @Querverbindung, "	</Folder>\n";
 
 		} elsif ($category eq "Direktverbindung") {
 
 			push @Radweit_Strecke, "	<Folder>\n";
 			push @Radweit_Strecke, @routeFile;
 			push @Radweit_Strecke, "	</Folder>\n";
 
 		} elsif ($category eq "Regionaler Radwanderweg") {
 
 			@Regionaler_Radwanderweg = ();
 
 		} elsif ($category eq "Routenplaner Testroute") {
 
 			# do nothing
 
 		} else {
 			print "Error: No matching Category: $category\n";
 			exit;
 		}
 	}
 }