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

Last change on this file was 29705, checked in by lucasvr, 6 years ago

New command, -ignorelabels, to indicate that labels are not to be rendered at all.

File size: 10.3 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 OSM::osm 8.3 ;
25
26use mwConfig ;
27use mwFile ;
28use mwRules ;
29use mwMap ;
30use mwMisc ;
31use mwWayLabel ;
32use mwCoastLines ;
33
34use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
35
36require Exporter ;
37
38@ISA = qw ( Exporter AutoLoader ) ;
39
40@EXPORT = qw (  processWays
41                getCoastWays
42                createDirectory
43                 ) ;
44
45my $areasOmitted = 0 ;
46my $areasDrawn = 0 ;
47
48my $areaLabels = 0 ;
49my $areaLabelsOmitted = 0 ;
50
51my @coastWays = () ;
52
53sub processWays {
54
55        print "drawing ways/areas...\n" ;
56
57        my $nodesRef; my $tagRef ;
58        ($nodesRef, $tagRef) = getWayPointers () ;
59        my ($lonRef, $latRef, $nodeTagRef) = getNodePointers() ;
60
61        foreach my $wayId (keys %$nodesRef) {
62                my @tags = @{ $$tagRef{$wayId} } ;
63                my $tagsString = "" ;
64
65                # coast
66                my $v = getValue ("natural", \@tags) ;
67                if ( (defined $v) and ($v eq "coastline") ) {
68                        push @coastWays, $wayId ;
69                } 
70
71                # WAYS
72
73                my $ruleRef = getWayRule (\@tags) ;
74                if (defined $ruleRef) {
75                        my @nodes = @{ $$nodesRef{ $wayId } } ;
76
77                        my $layer = getValue ("layer", $$tagRef{$wayId}) ;
78                        if ( ! defined $layer ) { $layer = 0 ; }
79
80                        # TODO check for numeric!!!
81
82                        my $direction = 0 ;
83                        my $ow = getValue("oneway", $$tagRef{$wayId}) ;
84                        if (defined $ow) {
85                                if (($ow eq "yes") or ($ow eq "true") or ($ow eq "1")) { $direction = 1 ; }
86                                if ($ow eq "-1") { $direction = -1 ; }
87                        }
88
89                        my $bridge = getValue("bridge", $$tagRef{$wayId}) ;
90                        if (defined $bridge) {
91                                if (($bridge eq "yes") or ($bridge eq "true")) { $bridge = 1 ; } else { $bridge = 0 ; }
92                        }
93                        else { $bridge = 0 ; }
94
95                        my $tunnel = getValue("tunnel", $$tagRef{$wayId}) ;
96                        if (defined $tunnel) {
97                                if (($tunnel eq "yes") or ($tunnel eq "true")) { $tunnel = 1 ; } else { $tunnel = 0 ; }
98                        }
99                        else { $tunnel = 0 ; }
100
101                        my ($svg1, $layer1, $svg2, $layer2) = createWayParameters ($ruleRef, $layer, $bridge, $tunnel) ;
102
103                        drawWay ( \@nodes, 1, $svg1, undef, $layer1 ) ;
104                        if ($svg2 ne "") {
105                                drawWay ( \@nodes, 1, $svg2, undef, $layer2 ) ;
106                        }
107
108                        my $size = $$ruleRef{'size'} ;
109                        if ( ( cv('oneways') eq "1" ) and ($direction != 0) ) {
110                                addOnewayArrows (\@nodes, $direction, $size, $layer) ;
111                        }
112
113
114                        # LABEL WAY
115            if ( cv('ignorelabels') eq "0" ) {
116                        if ($$ruleRef{'label'} ne "none") {
117
118                                my $name = "" ; my $ref1 ; my @names ;
119
120                                if (grep /shield/i, $$ruleRef{'label'} ) {
121                                        ($name, $ref1) = createLabel (\@tags, "ref",0, 0) ;
122                                        my $ref = $name ;
123
124                                            if (grep /;/, $ref) {
125                                                    my @a = split /;/, $ref ;
126                                                $ref = $a[0] ; 
127                                        }
128
129                                        if ($ref ne "") {
130                                                @names = ($ref) ;
131                                                $name = $$ruleRef{'label'} . ":$ref" ;
132                                                # print "DRAW WAY: name set to $name\n" ;
133                                        }
134                                        else {
135                                                @names = () ;
136                                                $name = "" ;
137                                        }
138
139                                            # print "WAY: name for shield >$name<\n" ;
140                                }
141                                else {
142                                        ($name, $ref1) = createLabel (\@tags, $$ruleRef{'label'}, 0, 0) ;
143                                        @names = @$ref1 ;
144                                        $name = labelTransform ($name, $$ruleRef{'labeltransform'}) ;
145                                }
146
147                                if ( ( cv('nolabel') eq "1") and ($name eq "") ) { $name = "NO LABEL" ; }
148
149                                if ($name ne "") { 
150                                        addWayLabel ($wayId, $name, $ruleRef) ; 
151                                }
152                                if ( ( cv('dir') eq "1") and ( $$ruleRef{'direxclude'} eq "no") ) {
153                                        if ( cv('grid') > 0) {
154                                                foreach my $node ( @nodes ) {
155                                                        foreach my $name (@names) {
156                                                                my $sq = gridSquare($$lonRef{$node}, $$latRef{$node}, cv('grid') ) ;
157                                                                    if (defined $sq) {
158                                                                    addToDirectory($name, $sq) ;
159                                                                }
160                                                        }
161                                                }
162                                        }
163                                            else {
164                                                    foreach my $name (@names) {
165                                                            addToDirectory ($name, undef) ;
166                                                }
167                                        }
168                                }
169                            }  # label
170            } # ignorelabels
171                }
172
173                # AREAS
174
175                $ruleRef = getAreaRule (\@tags) ;
176                my @nodes = @{ $$nodesRef{ $wayId } } ;
177                if ( (defined $ruleRef) and ($nodes[0] == $nodes[-1]) ) {
178                        my $color = $$ruleRef{'color'} ;
179                        my $icon = $$ruleRef{'icon'} ;
180                        my $base = $$ruleRef{'base'} ;
181                        my $svgString = $$ruleRef{'svgstring'} ;
182                        my $size = areaSize (\@nodes) ;
183                        my @ways = [@nodes] ;
184
185                        if ( ($svgString eq "") and ($icon eq "none") ) {
186                                $svgString = "fill=\"$color\" " ;
187                        }
188
189                        if ($size > cv('minareasize') ) {
190                                if ($base eq "yes") {
191                                        drawArea ($svgString, $icon, \@ways, 1, "base") ;
192                                }
193                                else {
194                                        drawArea ($svgString, $icon, \@ways, 1, "area") ;
195                                }
196                                $areasDrawn++ ;
197
198
199                                # DRAW label
200                                if ( $$ruleRef{'label'} ne "none" )  {
201                                        $areaLabels++ ;
202                                        if ($size > cv('minarealabelsize') ) {
203                                                # text
204                                                my ($name, $ref1) = createLabel (\@tags, $$ruleRef{'label'},0, 0) ;
205                                                $name = labelTransform ($name, $$ruleRef{'labeltransform'}) ;
206                                       
207                                                # pos
208                                                my ($lon, $lat) = areaCenter ( $$nodesRef{$wayId} ) ;
209
210                                                # draw
211                                                my $labelFont = $$ruleRef{'labelfont'} ;
212                                                my $labelFontFamily = $$ruleRef{'labelfontfamily'} ;
213                                                my $labelSize = $$ruleRef{'labelsize'} ;
214                                                my $color = $$ruleRef{'labelcolor'} ;
215                                                my $labelBold = $$ruleRef{'labelbold'} ;
216                                                my $labelItalic = $$ruleRef{'labelitalic'} ;
217                                                my $labelHalo = $$ruleRef{'labelhalo'} ;
218                                                my $labelHaloColor = $$ruleRef{'labelhalocolor'} ;
219
220                                                my $svgText = createTextSVG ( $labelFontFamily, $labelFont, $labelBold, $labelItalic, $labelSize, $color, $labelHalo, $labelHaloColor) ; 
221
222                                                mwLabel::placeLabelAndIcon ($lon, $lat, 0, 0, $name, $svgText, "none", 0, 0, "arealabels") ;
223                                        }
224                                        else {
225                                                $areaLabelsOmitted++ ;
226                                        }
227                                }
228
229
230                        }
231                        else {
232                                $areasOmitted++ ;
233                        }
234
235                } # Area
236        }
237
238        print "$areasDrawn areas drawn, $areasOmitted omitted because they are too small\n" ;
239        print "$areaLabels area labels total, $areaLabelsOmitted omitted because belonging areas were too small\n" ;
240
241        my $cw = scalar @coastWays ;
242        if ( cv('verbose')) { print "$cw coast line ways found.\n" ; }
243 
244        preprocessWayLabels() ;
245        createWayLabels() ;
246
247        if ($cw > 0) {
248                processCoastLines (\@coastWays) ;
249        }
250}
251
252# ----------------------------------------------------------------------------
253
254sub createWayParameters {
255        my ($ruleRef, $layer, $bridge, $tunnel) = @_ ;
256
257        my $svg1 = "" ; my $layer1 = 0 ;
258        my $svg2 = "" ; my $layer2 = 0 ;
259
260        my %dashDefinition = () ;
261        @{$dashDefinition {1} } = ("round", "20,20") ;
262        @{$dashDefinition {2} } = ("round", "44,20") ;
263        @{$dashDefinition {3} } = ("round", "28,20") ;
264        @{$dashDefinition {4} } = ("round", "12,20") ;
265
266        @{$dashDefinition {10} } = ("round", "8,8") ;
267        @{$dashDefinition {11} } = ("round", "16,16") ;
268        @{$dashDefinition {12} } = ("round", "24,24") ;
269        @{$dashDefinition {13} } = ("round", "32,32") ;
270        @{$dashDefinition {14} } = ("round", "40,40") ;
271
272        @{$dashDefinition {20} } = ("round", "0,8,0,16") ;
273        @{$dashDefinition {21} } = ("round", "0,16,0,32") ;
274        @{$dashDefinition {22} } = ("round", "0,24,0,48") ;
275        @{$dashDefinition {23} } = ("round", "0,32,0,48") ;
276
277        @{$dashDefinition {30} } = ("butt", "4,4") ;
278        @{$dashDefinition {31} } = ("butt", "8,8") ;
279        @{$dashDefinition {32} } = ("butt", "12,12") ;
280        @{$dashDefinition {33} } = ("butt", "4,12") ;
281        @{$dashDefinition {34} } = ("butt", "4,20") ;
282        @{$dashDefinition {35} } = ("butt", "8,20") ;
283
284        if ( cv ('autobridge') eq "0" ) {
285                $layer = 0 ;
286        }
287
288        if ( ( $$ruleRef{'svgstringtop'} ne "" ) or ( $$ruleRef{'svgstringbottom'} ne "" ) ) {
289
290                $svg1 = $$ruleRef{'svgstringtop'} ;
291                $svg2 = $$ruleRef{'svgstringbottom'} ;
292
293                # TODO layer
294                $layer1 = $layer ;
295                $layer2 = $layer ;
296
297        }
298        else {
299
300                my $size = $$ruleRef{'size'} ;
301                my $color = $$ruleRef{'color'} ;
302
303                my $lc = "round" ;
304                my $lj = "round" ;
305
306                my $dash = "" ;
307                if ( $$ruleRef{'dash'} ne "" ) {
308                        if ( ! grep /,/, $$ruleRef{'dash'}) {
309                                my @ds = @{$dashDefinition{ $$ruleRef{'dash'} } } ;
310                                $lc = $ds[0] ;
311                                my $style = $ds[1] ;
312                                $dash = "stroke-dasharray=\"$style\" " ;
313                        }
314                        else {
315                                $lc = $$ruleRef{'dashcap'} ;
316                                my $style = $$ruleRef{'dash'} ;
317                                $dash = "stroke-dasharray=\"$style\"" ;
318                        }
319                }
320
321                # top (actual way)
322                $svg1 = "stroke=\"$color\" stroke-width=\"$size\" stroke-linecap=\"$lc\" fill=\"none\" stroke-linejoin=\"$lj\" " . $dash ;
323                $layer1 = $layer + $size / 100 ;
324
325                my $bs = $$ruleRef{'bordersize'} ;
326                $lc = "round" ;
327                $dash = "" ;
328
329                if ( cv ('autobridge') eq "1" ) {
330                        # TODO bridge/tunnel
331                        if ( $bridge == 1) {
332                                $lc = "butt" ;
333                                $bs += 3 ; # TODO config value
334                        }
335                        elsif ( $tunnel == 1) {
336                                $lc = "butt" ;
337                                $dash = "stroke-dasharray=\"10,10\" " ;
338                                $bs += 3 ; 
339                        }
340                }
341
342                # bottom (border)
343                if ( $bs > 0 ) {
344                        $size = 2 * $bs + $$ruleRef{'size'} ;
345                        $color = $$ruleRef{'bordercolor'} ;
346                        $svg2 = "stroke=\"$color\" stroke-width=\"$size\" stroke-linecap=\"$lc\" fill=\"none\" stroke-linejoin=\"$lj\" " . $dash ;
347                        $layer2 = $layer - 0.3 + $size / 100 ;
348                }
349                else {
350                        $svg2 = "" ;
351                        $layer2 = 0 ;
352                }
353
354        }
355
356        return ($svg1, $layer1, $svg2, $layer2) ;
357}
358
359# ---------------------------------------------------------------------------------
360
361sub createDirectory {
362        my $directoryName ;
363        my $dirFile ;
364        $directoryName = cv ('out') ;
365        $directoryName =~ s/\.svg/\_streets.txt/ ;
366        setConfigValue("directoryname", $directoryName) ;
367        print "creating dir file $directoryName ...\n" ;
368        open ($dirFile, ">", $directoryName) or die ("can't open dir file $directoryName\n") ;
369
370        my $ref = getDirectory() ;
371        my %directory = %$ref ;
372
373        if ( cv('grid') eq "0") {
374                foreach my $street (sort keys %directory) {
375                        $street = replaceHTMLCode ( $street ) ;
376                        print $dirFile "$street\n" ;
377                }
378        }
379        else {
380                foreach my $street (sort keys %directory) {
381                        my $streetSanitized = replaceHTMLCode ( $street ) ;
382                        print $dirFile "$streetSanitized\t" ;
383                        foreach my $square (sort keys %{$directory{$street}}) {
384                                print $dirFile "$square " ;
385                        }
386                        print $dirFile "\n" ;
387                }
388        }
389        close ($dirFile) ;
390}
391
3921 ;
393
394
Note: See TracBrowser for help on using the repository browser.