source: subversion/applications/utils/gary68/mwWays.pm @ 26424

Last change on this file since 26424 was 26404, checked in by gary68, 8 years ago

new mapweaver version. directory exclusions

File size: 8.6 KB
Line 
1#
2# PERL mapweaver module by gary68
3#
4#
5#
6#
7# Copyright (C) 2011, Gerhard Schwanz
8#
9# 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
10# Free Software Foundation; either version 3 of the License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>
16#
17
18
19package mwWays ; 
20
21use strict ;
22use warnings ;
23
24use mwConfig ;
25use mwFile ;
26use mwRules ;
27use mwMap ;
28use mwMisc ;
29use mwWayLabel ;
30use mwCoastLines ;
31
32use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
33
34require Exporter ;
35
36@ISA = qw ( Exporter AutoLoader ) ;
37
38@EXPORT = qw (  processWays
39                getCoastWays
40                createDirectory
41                 ) ;
42
43my $areasOmitted = 0 ;
44my $areasDrawn = 0 ;
45
46my @coastWays = () ;
47
48sub processWays {
49
50        print "drawing ways/areas...\n" ;
51
52        my $nodesRef; my $tagRef ;
53        ($nodesRef, $tagRef) = getWayPointers () ;
54        my ($lonRef, $latRef, $nodeTagRef) = getNodePointers() ;
55
56        foreach my $wayId (keys %$nodesRef) {
57                my @tags = @{ $$tagRef{$wayId} } ;
58                my $tagsString = "" ;
59
60                # coast
61                my $v = getValue ("natural", \@tags) ;
62                if ( (defined $v) and ($v eq "coastline") ) {
63                        push @coastWays, $wayId ;
64                } 
65
66                # WAYS
67
68                my $ruleRef = getWayRule (\@tags) ;
69                if (defined $ruleRef) {
70                        my @nodes = @{ $$nodesRef{ $wayId } } ;
71
72                        my $layer = getValue ("layer", $$tagRef{$wayId}) ;
73                        if ( ! defined $layer ) { $layer = 0 ; }
74
75                        # TODO check for numeric!!!
76
77                        my $direction = 0 ;
78                        my $ow = getValue("oneway", $$tagRef{$wayId}) ;
79                        if (defined $ow) {
80                                if (($ow eq "yes") or ($ow eq "true") or ($ow eq "1")) { $direction = 1 ; }
81                                if ($ow eq "-1") { $direction = -1 ; }
82                        }
83
84                        my $bridge = getValue("bridge", $$tagRef{$wayId}) ;
85                        if (defined $bridge) {
86                                if (($bridge eq "yes") or ($bridge eq "true")) { $bridge = 1 ; } else { $bridge = 0 ; }
87                        }
88                        else { $bridge = 0 ; }
89
90                        my $tunnel = getValue("tunnel", $$tagRef{$wayId}) ;
91                        if (defined $tunnel) {
92                                if (($tunnel eq "yes") or ($tunnel eq "true")) { $tunnel = 1 ; } else { $tunnel = 0 ; }
93                        }
94                        else { $tunnel = 0 ; }
95
96                        my ($svg1, $layer1, $svg2, $layer2) = createWayParameters ($ruleRef, $layer, $bridge, $tunnel) ;
97
98                        drawWay ( \@nodes, 1, $svg1, undef, $layer1 ) ;
99                        if ($svg2 ne "") {
100                                drawWay ( \@nodes, 1, $svg2, undef, $layer2 ) ;
101                        }
102
103                        my $size = $$ruleRef{'size'} ;
104                        if ( ( cv('oneways') eq "1" ) and ($direction != 0) ) {
105                                addOnewayArrows (\@nodes, $direction, $size, $layer) ;
106                        }
107
108
109                        # LABEL WAY
110
111                        if ($$ruleRef{'label'} ne "none") {
112
113                                my $name = "" ; my $ref1 ; my @names ;
114
115                                if (grep /shield/i, $$ruleRef{'label'} ) {
116                                        ($name, $ref1) = createLabel (\@tags, "ref",0, 0) ;
117                                        my $ref = $name ;
118
119                                        if (grep /;/, $ref) {
120                                                my @a = split /;/, $ref ;
121                                                $ref = $a[0] ; 
122                                        }
123
124                                        if ($ref ne "") {
125                                                @names = ($ref) ;
126                                                $name = $$ruleRef{'label'} . ":$ref" ;
127                                                # print "DRAW WAY: name set to $name\n" ;
128                                        }
129                                        else {
130                                                @names = () ;
131                                                $name = "" ;
132                                        }
133
134                                        # print "WAY: name for shield >$name<\n" ;
135                                }
136                                else {
137                                        ($name, $ref1) = createLabel (\@tags, $$ruleRef{'label'}, 0, 0) ;
138                                        @names = @$ref1 ;
139                                }
140
141                                if ( ( cv('nolabel') eq "1") and ($name eq "") ) { $name = "NO LABEL" ; }
142
143                                if ($name ne "") { 
144                                        addWayLabel ($wayId, $name, $ruleRef) ; 
145                                }
146                                if ( ( cv('dir') eq "1") and ( $$ruleRef{'direxclude'} eq "no") ) {
147                                        if ( cv('grid') > 0) {
148                                                foreach my $node ( @nodes ) {
149                                                        foreach my $name (@names) {
150                                                                my $sq = gridSquare($$lonRef{$node}, $$latRef{$node}, cv('grid') ) ;
151                                                                if (defined $sq) {
152                                                                        addToDirectory($name, $sq) ;
153                                                                }
154                                                        }
155                                                }
156                                        }
157                                        else {
158                                                foreach my $name (@names) {
159                                                        addToDirectory ($name, undef) ;
160                                                }
161                                        }
162                                }
163                        }  # label
164
165                }
166
167                # AREAS
168
169                $ruleRef = getAreaRule (\@tags) ;
170                if (defined $ruleRef) {
171                        my $color = $$ruleRef{'color'} ;
172                        my $icon = $$ruleRef{'icon'} ;
173                        my $base = $$ruleRef{'base'} ;
174                        my $svgString = $$ruleRef{'svgstring'} ;
175                        my @nodes = @{ $$nodesRef{ $wayId } } ;
176                        my $size = areaSize (\@nodes) ;
177                        my @ways = [@nodes] ;
178
179                        if ( ($svgString eq "") and ($icon eq "none") ) {
180                                $svgString = "fill=\"$color\" " ;
181                        }
182
183                        if ($size > cv('minareasize') ) {
184                                if ($base eq "yes") {
185                                        drawArea ($svgString, $icon, \@ways, 1, "base") ;
186                                }
187                                else {
188                                        drawArea ($svgString, $icon, \@ways, 1, "area") ;
189                                }
190                                $areasDrawn++ ;
191                        }
192                        else {
193                                $areasOmitted++ ;
194                        }
195
196                } # Area
197        }
198
199        print "$areasDrawn areas drawn, $areasOmitted omitted because they are too small\n" ;
200
201        my $cw = scalar @coastWays ;
202        if ( cv('verbose')) { print "$cw coast line ways found.\n" ; }
203 
204        preprocessWayLabels() ;
205        createWayLabels() ;
206
207        if ($cw > 0) {
208                processCoastLines (\@coastWays) ;
209        }
210}
211
212# ----------------------------------------------------------------------------
213
214sub createWayParameters {
215        my ($ruleRef, $layer, $bridge, $tunnel) = @_ ;
216
217        my $svg1 = "" ; my $layer1 = 0 ;
218        my $svg2 = "" ; my $layer2 = 0 ;
219
220        my %dashDefinition = () ;
221        @{$dashDefinition {1} } = ("round", "20,20") ;
222        @{$dashDefinition {2} } = ("round", "44,20") ;
223        @{$dashDefinition {3} } = ("round", "28,20") ;
224        @{$dashDefinition {4} } = ("round", "12,20") ;
225
226        @{$dashDefinition {10} } = ("round", "8,8") ;
227        @{$dashDefinition {11} } = ("round", "16,16") ;
228        @{$dashDefinition {12} } = ("round", "24,24") ;
229        @{$dashDefinition {13} } = ("round", "32,32") ;
230        @{$dashDefinition {14} } = ("round", "40,40") ;
231
232        @{$dashDefinition {20} } = ("round", "0,8,0,16") ;
233        @{$dashDefinition {21} } = ("round", "0,16,0,32") ;
234        @{$dashDefinition {22} } = ("round", "0,24,0,48") ;
235        @{$dashDefinition {23} } = ("round", "0,32,0,48") ;
236
237        @{$dashDefinition {30} } = ("butt", "4,4") ;
238        @{$dashDefinition {31} } = ("butt", "8,8") ;
239        @{$dashDefinition {32} } = ("butt", "12,12") ;
240        @{$dashDefinition {33} } = ("butt", "4,12") ;
241        @{$dashDefinition {34} } = ("butt", "4,20") ;
242        @{$dashDefinition {35} } = ("butt", "8,20") ;
243
244        if ( cv ('autobridge') eq "0" ) {
245                $layer = 0 ;
246        }
247
248        if ( ( $$ruleRef{'svgstringtop'} ne "" ) or ( $$ruleRef{'svgstringbottom'} ne "" ) ) {
249
250                $svg1 = $$ruleRef{'svgstringtop'} ;
251                $svg2 = $$ruleRef{'svgstringbottom'} ;
252
253                # TODO layer
254                $layer1 = $layer ;
255                $layer2 = $layer ;
256
257        }
258        else {
259
260                my $size = $$ruleRef{'size'} ;
261                my $color = $$ruleRef{'color'} ;
262
263                my $lc = "round" ;
264                my $lj = "round" ;
265
266                my $dash = "" ;
267                if ( $$ruleRef{'dash'} ne "" ) {
268                        if ( ! grep /,/, $$ruleRef{'dash'}) {
269                                my @ds = @{$dashDefinition{ $$ruleRef{'dash'} } } ;
270                                $lc = $ds[0] ;
271                                my $style = $ds[1] ;
272                                $dash = "stroke-dasharray=\"$style\" " ;
273                        }
274                        else {
275                                $lc = $$ruleRef{'dashcap'} ;
276                                my $style = $$ruleRef{'dash'} ;
277                                $dash = "stroke-dasharray=\"$style\"" ;
278                        }
279                }
280
281                # top (actual way)
282                $svg1 = "stroke=\"$color\" stroke-width=\"$size\" stroke-linecap=\"$lc\" fill=\"none\" stroke-linejoin=\"$lj\" " . $dash ;
283                $layer1 = $layer + $size / 100 ;
284
285                my $bs = $$ruleRef{'bordersize'} ;
286                $lc = "round" ;
287                $dash = "" ;
288
289                if ( cv ('autobridge') eq "1" ) {
290                        # TODO bridge/tunnel
291                        if ( $bridge == 1) {
292                                $lc = "butt" ;
293                                $bs += 3 ; # TODO config value
294                        }
295                        elsif ( $tunnel == 1) {
296                                $lc = "butt" ;
297                                $dash = "stroke-dasharray=\"10,10\" " ;
298                                $bs += 3 ; 
299                        }
300                }
301
302                # bottom (border)
303                if ( $bs > 0 ) {
304                        $size = 2 * $bs + $$ruleRef{'size'} ;
305                        $color = $$ruleRef{'bordercolor'} ;
306                        $svg2 = "stroke=\"$color\" stroke-width=\"$size\" stroke-linecap=\"$lc\" fill=\"none\" stroke-linejoin=\"$lj\" " . $dash ;
307                        $layer2 = $layer - 0.3 + $size / 100 ;
308                }
309                else {
310                        $svg2 = "" ;
311                        $layer2 = 0 ;
312                }
313
314        }
315
316        return ($svg1, $layer1, $svg2, $layer2) ;
317}
318
319# ---------------------------------------------------------------------------------
320
321sub createDirectory {
322        my $directoryName ;
323        my $dirFile ;
324        $directoryName = cv ('out') ;
325        $directoryName =~ s/\.svg/\_streets.txt/ ;
326        setConfigValue("directoryname", $directoryName) ;
327        print "creating dir file $directoryName ...\n" ;
328        open ($dirFile, ">", $directoryName) or die ("can't open dir file $directoryName\n") ;
329
330        my $ref = getDirectory() ;
331        my %directory = %$ref ;
332
333        if ( cv('grid') eq "0") {
334                foreach my $street (sort keys %directory) {
335                        print $dirFile "$street\n" ;
336                }
337        }
338        else {
339                foreach my $street (sort keys %directory) {
340                        print $dirFile "$street\t" ;
341                        foreach my $square (sort keys %{$directory{$street}}) {
342                                print $dirFile "$square " ;
343                        }
344                        print $dirFile "\n" ;
345                }
346        }
347        close ($dirFile) ;
348}
349
3501 ;
351
352
Note: See TracBrowser for help on using the repository browser.