User:Lübeck/DataReduction
Jump to navigation
Jump to search
Sollen in einer OpenLayers-Karte Objekte nur dargestellt werden und die Tags von untergeordneter Bedeutung sind, dann kann mit nachfolgendem PERL-Skript das Datenvolumen reduziert werden.
Eine Musterkarte bei der dieses Skript im Vorwege zum Einsatz kommt.
#!/usr/bin/perl
use strict;
use warnings;
print "\n\nAusduennen von OSM-Dateien\n";
print "==========================\n\n";
# Namen von Tags die entfernt werden sollen
my @del_tags=qw(tag);
# Namen von Optionen, die entfernt werden sollen
my @del_opts=qw(version timestamp uid user changeset);
# Von der Kommandozeileneingabe Lesen
# @ARGV enthält alle an das Script übergebene Parameter
my $file_in=shift(@ARGV) || "test.xml"; #die("NO InputFile!\n");
my $file_out=shift(@ARGV);
print "Input: ".$file_in."\n";
print "Input: ".$file_in."\n";
#
# das war mir zu viel Tipperei ;-)
my $data=eval{local($/,@ARGV)=(undef,$file_in); <>};
die("no DATA!\n") unless($data);
# Singetags entfernen
# <name ... />
$data=~s#<$_(\s+[^>]+)?\s*/>[\x0A\d0D]*##gs for(map{ quotemeta }@del_tags);
# blocktags entfernen
# <name>...</name>
$data=~s#<$_(\s+[^>]+)?\s*>.+?</$_\s*>[\x0A\d0D]*##gs for(map{ quotemeta }@del_tags);
my $del=join('|', map{ quotemeta }@del_opts );
$data=~s#\s+(?:$del)\s*=\s*".+?"# #gs;
# alternativ kann man das auch so schreiben:
$data=~s#$_=".+?"# #gs for(map{ quotemeta }@del_opts);
# das ist aber viel langsamer
# SDOUT umleiten wenn eine zweite Datei angeben ist
# das ist schnell und schmutzig :-)
if($file_out)
{
close(STDOUT);
open(STDOUT,'>',$file_out);
}
print $data;