# # PERL mapweaver module by gary68 # # Copyright(C)2011, Gerhard Schwanz # # This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 3 of the License, or(at your option)any later version. # # This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along with this program; if not, see # package mwConfig; use strict; use warnings; use Getopt::Long; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; @ISA = qw(Exporter AutoLoader); @EXPORT = qw(cv initConfig readConfigFile setConfigValue printConfig printConfigDescriptions getProgramOptions ); my @initial =(["verbose",0, "print some more information(CLO)", "misc"], ["debug",0, "print debug information(CLO)", "misc"], ["projection", "merc","Used projection", "map"], ["ellipsoid", "WGS84","Used ellipsoid", "map"], ["ruleDefaultNodeSize", "20", "default size of dot for nodes", "nodes"], ["ruleDefaultNodeColor", "black", "default color of dot for nodes", "nodes"], ["ruleDefaultNodeShape", "circle", "default shape of node", "nodes"], ["ruleDefaultNodeLabel", "name", "default key for label", "nodes"], ["ruleDefaultNodelabelSize", 30, "default size of label text", "nodes"], ["ruleDefaultNodeLabelFont", "", "DON'T USE", "nodes"], ["ruleDefaultNodeLabelFontFamily", "sans-serif", "default font family for label", "nodes"], ["ruleDefaultNodeIconSize", 40, "default size of icon", "nodes"], ["ruleDefaultNodeFromScale", 0, "default fromScale of node", "nodes"], ["ruleDefaultNodeToScale", 1000000, "default toScale of node", "nodes"], ["ruleDefaultWayLabel","name","default label of way", "ways"], ["ruleDefaultWayLabelColor","black","default label color of way", "ways"], ["ruleDefaultWayLabelSize",30,"default label size of way", "ways"], ["ruleDefaultWayLabelFont","","DON'T USE", "ways"], ["ruleDefaultWayLabelFontFamily","sans-serif","default label font of way", "ways"], ["ruleDefaultWayLabelOffset",15,"default label Tspan offset of way", "ways"], ["ruleDefaultWayColor","gray","default color of way", "ways"], ["ruleDefaultWaySize",20,"default size of way", "ways"], ["ruleDefaultWayBorderColor","black","default color of border of way", "ways"], ["ruleDefaultWayBorderSize",2,"default size of border of way", "ways"], ["ruleDefaultWayDash","","default dash style of way", "ways"], ["ruleDefaultWayDashCap","butt","default cap for dashes of way", "ways"], ["ruleDefaultWayFromScale",0,"default fromScale of way", "ways"], ["ruleDefaultWayToScale",1000000,"default toScale of way", "ways"], ["ruleDefaultAreaColor","lightgray","default area color", "areas"], ["ruleDefaultAreaLabelFont","","DON'T USE", "areas"], ["ruleDefaultAreaLabelFontFamily","sans-serif","default font family for area labels", "areas"], ["ruleDefaultAreaMinSize",0,"minimum size of area to be drawn", "areas"], ["ruledefaultAreaFromScale",0,"default fromScale of way", "areas"], ["ruledefaultAreaToScale",1000000,"default toScale of way", "areas"], ["ruledefaultRouteColor","black","default color of route", "routes"], ["ruledefaultRouteSize",5,"default size of route", "routes"], ["ruledefaultRouteDash","","default dash of route", "routes"], ["ruledefaultRouteLinecap","round","default linecap of route", "routes"], ["ruledefaultRouteOpacity",100,"default opacity of route", "routes"], ["ruledefaultRouteLabel","ref","default label of route", "routes"], ["ruledefaultRouteLabelSize",25,"default label size of route", "routes"], ["ruledefaultRouteNodeSize",10,"default node size of route nodes", "routes"], ["ruledefaultRouteFromScale",0,"default fromScale of route", "routes"], ["ruledefaultRouteToScale",50000,"default toScale of route", "routes"], ["elementFont","","DON'T USE", "map"], ["elementFontFamily","sans-serif","default font family for map elements like title, scale, grid etc.", "map"], ["in","map.osm","osm in file(CLO)", "job"], ["srtm","","srtm in file(CLO)", "job"], ["overpass",0,"use overpass servers to get data(CLO)", "job"], ["near","","search only near this name(when using overpass)(CLO)", "job"], ["overpassdistance",50000,"overpass distance for near search(CLO)", "job"], ["overpassserver","http://www.overpass-api.de/api/","overpass server address(CLO)", "job"], ["gpx","","gpx file to overlay(CLO)", "map"], ["gpxColor","black","color for gpx objects(CLO)", "map"], ["gpxSize",10,"base size of gpx objects(CLO)", "map"], ["ini","mwconfig.ini","file with configuration values(CLO)", "misc"], ["out","mapweaver.svg","svg output name(CLO)", "job"], ["style","mwStandardRules.txt","file with render rules(CLO)", "job"], ["svgname","mapweaver.svg","output file name for svg graphics(CLO)", "job"], ["size",2200,"size in pixels x axis, 300dpi(CLO)", "map"], ["maxTargetSize","","sizes w,h in cm [21,29.7](CLO)", "map"], ["legend",0,"appearance and position of legend(CLO)", "map"], ["bgcolor","white","background color of map(CLO)", "map"], ["grid",0,"number of grid cells, 0 = no grid(CLO)", "map"], ["gridcolor","black","color of grid lines(CLO)", "map"], ["coords",0,"draw coordinate system(CLO)", "map"], ["coordsexp",-2,"size of grid cells, exp 10(CLO)", "map"], ["coordscolor","black","color of coordinates grid lines(CLO)", "map"], ["clip",0,"(CLO)", "job"], ["clipbbox","","(CLO)", "job"], ["pad",0,"(CLO)", "job"], ["ppc",6.5,"points per character(CLO)", "misc", "map"], ["pdf",0,"convert output to pdf(CLO)", "job"], ["png",0,"convert output to png(CLO)", "job"], ["pngdpi",115,"png resolution(CLO)", "job"], ["dir",0,"add directory(CLO)", "additional information"], ["dirprg","mwDir.pl","program to create directory(CLO)", "additional information"], ["direxcludedefault", "no", "object default property for directory entries", "additional information"], ["poi",0,"add POI directory(CLO)", "additional information"], ["dirpdf",0,"create directory pdf(CLO)", "additional information"], ["dircolnum",2,"number of text columns for directory pdf(CLO)", "additional information"], ["dirtitle","Directory","title for directory(CLO)", "additional information"], ["tagstat",0,"print tag statistics(CLO)", "misc"], ["declutter",1,"(CLO)", "map"], ["allowIconMove",0,"(CLO)", "map"], ["forceNodes",0,"(CLO)", "map"], ["lineDist",10,"distance between text lines in pixels", "map"], ["maxCharPerLine",20,"maximum characters per line in node label", "map"], ["help",0,"prints help texts(CLO)", "misc"], ["oneways",0,"add oneway arrows(CLO)", "map"], ["onewayColor","white","color of oneway arrows(CLO)", "map"], ["onewaySize",20,"size of oneway arrows(CLO)", "map"], ["onewayAutoSize",0,"auto size oneway arrows accordind way size; factor 0..100; 0=NOT AUTO; else percent of way size(CLO)", "map"], ["autobridge",1,"automatically draw bridges and tunnels(CLO)", "map"], ["noLabel",0,"", "map"], ["place","","search for place name in osm file and create map(CLO)", "job"], ["placefile","","name of file containing only place information(CLO)", "job"], ["lonrad",2,"radius lon in km for place map(CLO)", "job"], ["latrad",2,"radius lat in km for place map(CLO)", "job"], ["ruler",0,"draw ruler; positions 1..4(CLO)", "map"], ["rulercolor","black","color of ruler(CLO)", "map"], ["rulerbackground","none","background of ruler, none=transparent(CLO)", "map"], ["scale",0,"draw scale; positions 1..4(CLO)", "map"], ["scalecolor","black","color of scale(CLO)", "map"], ["scalebackground","none","color of scale background; none=transparent(CLO)", "map"], ["scaleset",0,"set scale of map(i.e. 10000)(CLO)", "map"], ["rulescaleset",0,"set assumed scale for rules(CLO)", "map"], ["routelabelcolor","black","", "routes"], ["routelabelsize",20,"", "routes"], ["routelabelfontfamily","sans-serif","font-family for route labels", "routes"], ["routelabelfont","","DON'T USE", "routes"], ["routelabeloffset",20,"", "routes"], ["routeicondist",70,"", "routes"], ["routeiconscale",1,"", "routes"], ["routeicondir","./routeicons","", "routes"], ["poifile","","name of external POI file(CLO)", "job"], ["relid",0,"relation ID for hikingbook(CLO)", "misc"], ["rectangles","","draw rectangles for hikingbook(CLO)", "misc"], ["pagenumbers","","add page numbers to map(CLO)", "misc"], ["ra",0,"relation analyzer mode(CLO)", "misc"], ["multionly",0,"draw only multipolygons(CLO)", "misc"], ["test",0,"test feature(CLO)", "misc"], ["foot","mapweaver by gary68 - data by www.openstreetmap.org","text for footer(CLO)", "map"], ["footcolor","black","color for footer(CLO)", "map"], ["footbackground","none","background color for footer(CLO)", "map"], ["footsize",40,"font size for footer(CLO)", "map"], ["head","","text for header(CLO)", "map"], ["headcolor","black","color for header(CLO)", "map"], ["headbackground","none","background color for header(CLO)", "map"], ["headsize",40,"font size for header(CLO)", "map"], ["wns",0,"substitute unfitting way names by numbers; 0..4 1..4=positions in map; 5=file(CLO)", "map"], ["wnssize",20,"size of labels in wns legend", "map"], ["wnscolor","black","color of labels in wns legend", "map"], ["wnsbgcolor","white","color of background of wns legend", "map"], ["wnsunique",0,"wns will label each way only once(CLO)", "map"], ["minAreaSize",400,"min size of area to be drawn on map", "map"], ["minAreaLabelSize",10000,"min size of area to be labeled on map", "map"], ["oceanColor","lightblue","color of ocean(CLO)", "map"], ["cIE",0,"osmosis clipIncompleteEntities instead of completeObjects(CLP)", "map"] ); my %cv =(); my %explanation =(); # -------------------------------------------------------------------------------- sub initConfig{ # set initial values according to program internal values from array @initial foreach my $kv(@initial){ $cv{lc($kv->[0])}= $kv->[1]; $explanation{lc($kv->[0])}= $kv->[2]; }} sub setConfigValue{ # allows any module to change a certain k/v pair my($k, $v)= @_; $k = lc($k); $cv{$k}= $v; if($cv{"verbose"}> 1){print "config key $k. value changed to $v\n";}} sub cv{ # access a value by key my $k = shift; $k = lc($k); if(! defined $cv{$k}){print "WARNING: requested config key $k not defined!\n";} return($cv{$k}); } sub printConfig{ # print actual config to stdout print "\nActual configuration\n"; my %cats =(); foreach my $e(@initial){ $cats{$e->[3]}= 1; } foreach my $cat(sort keys %cats){ my @entries =(); foreach my $e(@initial){ if($e->[3] eq $cat){ push @entries, $e->[0]; } } print "\nCATEGORY $cat\n"; print "--------\n"; foreach my $e(sort{$a cmp $b}@entries){ printf "%-30s %-30s\n", $e, cv($e); }} print "\n"; } sub readConfigFile{ # read ini file; initial k/v pairs might be changed my $fileName = shift; my $lc = 0; print "reading config file $fileName\n"; open(my $file, "<", $fileName)or die("ERROR: could not open ini file $fileName\n"); my $line = ""; while($line = <$file>){ $lc++; unless(grep(/^#/, $line)){ my($k, $v)=($line =~ /(.+?)=(.*)/); if((! defined $k)or(! defined $v)){ print "WARNING: could not parse config line: $line"; } else{ $k = lc($k); $cv{$k}= $v; } }} close $file; print "$lc lines read.\n\n"; }sub getProgramOptions{my $optResult = GetOptions("in=s" => \$cv{'in'}, # the in file, mandatory "overpass" => \$cv{'overpass'}, "near:s" => \$cv{'near'}, "overpassdistance:i" => \$cv{'overpassdistance'}, "overpassserver:s" => \$cv{'overpassserver'}, "gpx:s" => \$cv{'gpx'}, "gpxcolor:s" => \$cv{'gpxcolor'}, "gpxsize:i" => \$cv{'gpxsize'}, "ini:s" => \$cv{'ini'}, "style=s" => \$cv{'style'}, # the style file, mandatory "out:s" => \$cv{'out'}, # outfile name or default "srtm:s" => \$cv{'srtm'}, # srtm file name "size:i" => \$cv{'size'}, # specifies pic size longitude in pixels "maxtargetsize:s" => \$cv{'maxtargetsize'}, # specifies pic size in cm "legend:i" => \$cv{'legend'}, # legend? "bgcolor:s" => \$cv{'bgcolor'}, # background color "oceancolor:s" => \$cv{'oceancolor'}, # ocean color "grid:i" => \$cv{'grid'}, # specifies grid, number of parts "gridcolor:s" => \$cv{'gridcolor'}, # color used for grid and labels "coords" => \$cv{'coords'}, # "coordsexp:i" => \$cv{'coordsexp'}, # "coordscolor:s" => \$cv{'coordscolor'}, # "clip:i" => \$cv{'clip'}, # specifies how many percent data to clip on each side "clipbbox:s" => \$cv{'clipbbox'}, # bbox data for clipping map out of data "pad:i" => \$cv{'pad'}, # specifies how many percent data to pad on each side "ppc:f" => \$cv{'ppc'}, # pixels needed per label char in font size 10 "pdf" => \$cv{'pdf'}, # specifies if pdf will be created "png" => \$cv{'png'}, # specifies if png will be created "pngdpi:i" => \$cv{'pngdpi'}, # specifies png resolution "dir" => \$cv{'dir'}, # specifies if directory of streets will be created "dirprg:s" => \$cv{'dirprg'}, # "poi" => \$cv{'poi'}, # specifies if directory of pois will be created "dirpdf" => \$cv{'dirpdf'}, "dircolnum:i" => \$cv{'dircolnum'}, "dirtitle:s" => \$cv{'dirtitle'}, "tagstat" => \$cv{'tagstat'}, # lists k/v used in osm file "declutter" => \$cv{'declutter'}, "allowiconmove" => \$cv{'allowiconmove'}, "help" => \$cv{'help'}, # "wns:i" => \$cv{'wns'}, # "wnsunique" => \$cv{'wnsunique'}, # "oneways" => \$cv{'oneways'}, "onewaycolor:s" => \$cv{'onewaycolor'}, "onewaysize:i" => \$cv{'onewaysize'}, "onewayautosize:i" => \$cv{'onewayautosize'}, "autobridge:i" => \$cv{'autobridge'}, "nolabel" => \$cv{'nolabel'}, "ignorelabels" => \$cv{'ignorelabels'}, "place:s" => \$cv{'place'}, # place to draw "placefile:s" => \$cv{'placefile'}, # file to look for places "lonrad:f" => \$cv{'lonrad'}, "latrad:f" => \$cv{'latrad'}, "ruler:i" => \$cv{'ruler'}, "rulercolor:s" => \$cv{'rulercolor'}, "rulerbackground:s" => \$cv{'rulerbackground'}, "scale:i" => \$cv{'scale'}, "scalecolor:s" => \$cv{'scalecolor'}, "scalebackground:s" => \$cv{'scalebackground'}, "scaleset:i" => \$cv{'scaleset'}, "rulescaleset:i" => \$cv{'rulescaleset'}, "routelabelcolor:s" => \$cv{'routelabelcolor'}, "routelabelsize:i" => \$cv{'routelabelsize'}, "routelabelfont:s" => \$cv{'routelabelfont'}, "routelabeloffset:i" => \$cv{'routelabeloffset'}, "routeicondist:i" => \$cv{'routeicondist'}, "routeiconscale:f" => \$cv{'routeiconscale'}, "icondir:s" => \$cv{'icondir'}, "foot:s" => \$cv{'foot'}, "footcolor:s" => \$cv{'footcolor'}, "footbackground:s" => \$cv{'footbackground'}, "footsize:i" => \$cv{'footsize'}, "head:s" => \$cv{'head'}, "headcolor:s" => \$cv{'headcolor'}, "headbackground:s" => \$cv{'headbackground'}, "headsize:i" => \$cv{'headsize'}, "poifile:s" => \$cv{'poifile'}, "relid:i" => \$cv{'relid'}, "rectangles:s" => \$cv{'rectangles'}, "pagenumbers:s" => \$cv{'pagenumbers'}, "multionly" => \$cv{'multionly'}, # draw only areas from multipolygons "ra:s" => \$cv{'ra'}, # "debug" => \$cv{'debug'}, # turns debug messages on "cie" => \$cv{'cie'}, # turns debug messages on "verbose" => \$cv{'verbose'}, # turns twitter on "test" => \$cv{'test'}); # test } sub printConfigDescriptions{ my @texts = @initial; @texts = sort{$a->[0] cmp $b->[0]}@texts; print "\nconfig value descriptions\n\n"; printf "%-25s %-50s %-20s\n" , "key" , "description", "default"; foreach my $t(@texts){ my $def = $t->[1]; $def = "" unless $def; printf "%-25s %-50s %-20s\n" , $t->[0] , $t->[2], $def; } print "\n"; }1;