User:Lübeck/DataReduction

From OpenStreetMap Wiki
Jump to: navigation, 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;