#!/usr/bin/perl use strict; use warnings; use Getopt::Long qw(:config permute); use Data::Dumper; use Benchmark; sub show_help; sub preprocess_filelist; sub open_outputhandle; sub process_file; sub run; my $amenity = "point_unkn"; my $write_osm = 0; my %files = (); my $filename = "onebigfile"; my $poicount = 0; GetOptions ('a|amenity=s' => \$amenity, 'x|write-osm!' => \$write_osm, 'h|?|help!' => \&show_help, 'O|output-file=s' => \$filename, '<>' => \&preprocess_filelist); # when no file is given... show_help() if (keys %files == 0); # determine filename determine_filename(); # open the pipe for the output... my $pipe = open_outputhandle(); # ...feed the pipe... run(); # ...and close it properly close $pipe; ############################################################################### ############################################################################### ############################################################################### sub show_help { print "parses one (or multiple) .asc-file(s) (mainly used by poiwarner) and\n"; print "merges the result into one navit binary mapfile. requires maptool (when -x is not set)\n"; print "usage: $0 [OPTION] OUT in1.asc [in2.asc [...]]\n"; print " creates one big file called onebigfile\n"; print "usage: $0 [OPTION] IN.asc\n"; print " creates a file called IN.asc.bin / .osm\n\n"; print " -h, --help shows this help\n"; print " -x, --write-osm write in osm's xml format instead of navit's\n"; print " -a, --amenity=NAME sets the amenity to NAME. default is point_unk\n"; print " you can use -a several times for different types of pois\n"; print " e.g.: $0 -a tec_common speedcamdb1 speedcamdb2 -a poi_biergarten boozestation1 boozestation2\n"; print " -O, --output-file=OUT write the output to OUT. default for multiple files ist onebigfile\n"; exit 0; } sub preprocess_filelist { my ($filename) = @_; push (@{$files{$amenity}}, @_); } sub open_outputhandle() { # open the pipe to maptool... if (!$write_osm) { open $pipe, "| maptool $filename" or die $!; } else { # or a filehandle open $pipe, ">$filename" or die $!; } return $pipe; } sub process_file { my ($file) = @_; my $filehandle; print "$0 processing $file...\n"; open ($filehandle, "<$file") or next $!; # for every line in the file... while (<$filehandle>) { # ...check if it's a valid record... m/([0-9\.\-]*), ([0-9\.\-]*), "\[([0-9]*).*/ or next; my ($lon, $lat, $id) = ($1, $2, $3); # ...and write it into the handle then print $pipe " \n"; print $pipe " \n"; print $pipe " \n"; print $pipe " \n"; $poicount++; } } sub determine_filename { my $filecount = 0; foreach my $amenity (keys %files) { $filecount += $#{$files{$amenity}} + 1; } # when it's only one file and no output file has been given... if ($filecount == 1 && $filename eq "") { my $onefile = $files{(keys %files)[0]}[0]; # ...generate a new one from the given filename $filename = "$onefile.bin"; $filename = "$onefile.xml" if ($write_osm); } print "$0 writing output to $filename\n"; } sub run { # write osm header print $pipe '' . "\n"; print $pipe '' . "\n"; # set the amenity and my @amenities = keys %files; while (my $amenity = shift @amenities) { foreach my $file (@{$files{$amenity}}) { process_file($file); } } # close the osm file print $pipe ''; # and show up some stats print "$0 processed $poicount poi's\n"; }