mapweaver/mwConfig.pm

338 lines
16 KiB
Perl

#
# 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 <http://www.gnu.org/licenses/>
#
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 = "<EMPTY>" unless $def;
printf "%-25s %-50s %-20s\n" , $t->[0] , $t->[2], $def;
} print "\n";
}1;