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;