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

Revision 26427, 9.5 KB checked in by gary68, 3 years ago (diff)

new mapweaver version - area labels added

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.21 ;
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
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                                }
145
146                                if ( ( cv('nolabel') eq "1") and ($name eq "") ) { $name = "NO LABEL" ; }
147
148                                if ($name ne "") { 
149                                        addWayLabel ($wayId, $name, $ruleRef) ; 
150                                }
151                                if ( ( cv('dir') eq "1") and ( $$ruleRef{'direxclude'} eq "no") ) {
152                                        if ( cv('grid') > 0) {
153                                                foreach my $node ( @nodes ) {
154                                                        foreach my $name (@names) {
155                                                                my $sq = gridSquare($$lonRef{$node}, $$latRef{$node}, cv('grid') ) ;
156                                                                if (defined $sq) {
157                                                                        addToDirectory($name, $sq) ;
158                                                                }
159                                                        }
160                                                }
161                                        }
162                                        else {
163                                                foreach my $name (@names) {
164                                                        addToDirectory ($name, undef) ;
165                                                }
166                                        }
167                                }
168                        }  # label
169
170                }
171
172                # AREAS
173
174                $ruleRef = getAreaRule (\@tags) ;
175                if (defined $ruleRef) {
176                        my $color = $$ruleRef{'color'} ;
177                        my $icon = $$ruleRef{'icon'} ;
178                        my $base = $$ruleRef{'base'} ;
179                        my $svgString = $$ruleRef{'svgstring'} ;
180                        my @nodes = @{ $$nodesRef{ $wayId } } ;
181                        my $size = areaSize (\@nodes) ;
182                        my @ways = [@nodes] ;
183
184                        if ( ($svgString eq "") and ($icon eq "none") ) {
185                                $svgString = "fill=\"$color\" " ;
186                        }
187
188                        if ($size > cv('minareasize') ) {
189                                if ($base eq "yes") {
190                                        drawArea ($svgString, $icon, \@ways, 1, "base") ;
191                                }
192                                else {
193                                        drawArea ($svgString, $icon, \@ways, 1, "area") ;
194                                }
195                                $areasDrawn++ ;
196
197
198                                # DRAW label
199                                if ( $$ruleRef{'label'} ne "none" )  {
200                                        $areaLabels++ ;
201                                        if ($size > cv('minarealabelsize') ) {
202                                                # text
203                                                my ($name, $ref1) = createLabel (\@tags, $$ruleRef{'label'},0, 0) ;
204                                       
205                                                # pos
206                                                my ($lon, $lat) = areaCenter ( $$nodesRef{$wayId} ) ;
207
208                                                # draw
209                                                my $labelSize = $$ruleRef{'labelsize'} ;
210                                                my $color = $$ruleRef{'labelcolor'} ;
211                                                my $svgText = "font-size=\"$labelSize\" fill=\"$color\"" ;
212
213                                                mwLabel::placeLabelAndIcon ($lon, $lat, 0, 0, $name, $svgText, "none", 0, 0, "arealabels") ;
214                                        }
215                                        else {
216                                                $areaLabelsOmitted++ ;
217                                        }
218                                }
219
220
221                        }
222                        else {
223                                $areasOmitted++ ;
224                        }
225
226                } # Area
227        }
228
229        print "$areasDrawn areas drawn, $areasOmitted omitted because they are too small\n" ;
230        print "$areaLabels area labels total, $areaLabelsOmitted omitted because belonging areas were too small\n" ;
231
232        my $cw = scalar @coastWays ;
233        if ( cv('verbose')) { print "$cw coast line ways found.\n" ; }
234 
235        preprocessWayLabels() ;
236        createWayLabels() ;
237
238        if ($cw > 0) {
239                processCoastLines (\@coastWays) ;
240        }
241}
242
243# ----------------------------------------------------------------------------
244
245sub createWayParameters {
246        my ($ruleRef, $layer, $bridge, $tunnel) = @_ ;
247
248        my $svg1 = "" ; my $layer1 = 0 ;
249        my $svg2 = "" ; my $layer2 = 0 ;
250
251        my %dashDefinition = () ;
252        @{$dashDefinition {1} } = ("round", "20,20") ;
253        @{$dashDefinition {2} } = ("round", "44,20") ;
254        @{$dashDefinition {3} } = ("round", "28,20") ;
255        @{$dashDefinition {4} } = ("round", "12,20") ;
256
257        @{$dashDefinition {10} } = ("round", "8,8") ;
258        @{$dashDefinition {11} } = ("round", "16,16") ;
259        @{$dashDefinition {12} } = ("round", "24,24") ;
260        @{$dashDefinition {13} } = ("round", "32,32") ;
261        @{$dashDefinition {14} } = ("round", "40,40") ;
262
263        @{$dashDefinition {20} } = ("round", "0,8,0,16") ;
264        @{$dashDefinition {21} } = ("round", "0,16,0,32") ;
265        @{$dashDefinition {22} } = ("round", "0,24,0,48") ;
266        @{$dashDefinition {23} } = ("round", "0,32,0,48") ;
267
268        @{$dashDefinition {30} } = ("butt", "4,4") ;
269        @{$dashDefinition {31} } = ("butt", "8,8") ;
270        @{$dashDefinition {32} } = ("butt", "12,12") ;
271        @{$dashDefinition {33} } = ("butt", "4,12") ;
272        @{$dashDefinition {34} } = ("butt", "4,20") ;
273        @{$dashDefinition {35} } = ("butt", "8,20") ;
274
275        if ( cv ('autobridge') eq "0" ) {
276                $layer = 0 ;
277        }
278
279        if ( ( $$ruleRef{'svgstringtop'} ne "" ) or ( $$ruleRef{'svgstringbottom'} ne "" ) ) {
280
281                $svg1 = $$ruleRef{'svgstringtop'} ;
282                $svg2 = $$ruleRef{'svgstringbottom'} ;
283
284                # TODO layer
285                $layer1 = $layer ;
286                $layer2 = $layer ;
287
288        }
289        else {
290
291                my $size = $$ruleRef{'size'} ;
292                my $color = $$ruleRef{'color'} ;
293
294                my $lc = "round" ;
295                my $lj = "round" ;
296
297                my $dash = "" ;
298                if ( $$ruleRef{'dash'} ne "" ) {
299                        if ( ! grep /,/, $$ruleRef{'dash'}) {
300                                my @ds = @{$dashDefinition{ $$ruleRef{'dash'} } } ;
301                                $lc = $ds[0] ;
302                                my $style = $ds[1] ;
303                                $dash = "stroke-dasharray=\"$style\" " ;
304                        }
305                        else {
306                                $lc = $$ruleRef{'dashcap'} ;
307                                my $style = $$ruleRef{'dash'} ;
308                                $dash = "stroke-dasharray=\"$style\"" ;
309                        }
310                }
311
312                # top (actual way)
313                $svg1 = "stroke=\"$color\" stroke-width=\"$size\" stroke-linecap=\"$lc\" fill=\"none\" stroke-linejoin=\"$lj\" " . $dash ;
314                $layer1 = $layer + $size / 100 ;
315
316                my $bs = $$ruleRef{'bordersize'} ;
317                $lc = "round" ;
318                $dash = "" ;
319
320                if ( cv ('autobridge') eq "1" ) {
321                        # TODO bridge/tunnel
322                        if ( $bridge == 1) {
323                                $lc = "butt" ;
324                                $bs += 3 ; # TODO config value
325                        }
326                        elsif ( $tunnel == 1) {
327                                $lc = "butt" ;
328                                $dash = "stroke-dasharray=\"10,10\" " ;
329                                $bs += 3 ; 
330                        }
331                }
332
333                # bottom (border)
334                if ( $bs > 0 ) {
335                        $size = 2 * $bs + $$ruleRef{'size'} ;
336                        $color = $$ruleRef{'bordercolor'} ;
337                        $svg2 = "stroke=\"$color\" stroke-width=\"$size\" stroke-linecap=\"$lc\" fill=\"none\" stroke-linejoin=\"$lj\" " . $dash ;
338                        $layer2 = $layer - 0.3 + $size / 100 ;
339                }
340                else {
341                        $svg2 = "" ;
342                        $layer2 = 0 ;
343                }
344
345        }
346
347        return ($svg1, $layer1, $svg2, $layer2) ;
348}
349
350# ---------------------------------------------------------------------------------
351
352sub createDirectory {
353        my $directoryName ;
354        my $dirFile ;
355        $directoryName = cv ('out') ;
356        $directoryName =~ s/\.svg/\_streets.txt/ ;
357        setConfigValue("directoryname", $directoryName) ;
358        print "creating dir file $directoryName ...\n" ;
359        open ($dirFile, ">", $directoryName) or die ("can't open dir file $directoryName\n") ;
360
361        my $ref = getDirectory() ;
362        my %directory = %$ref ;
363
364        if ( cv('grid') eq "0") {
365                foreach my $street (sort keys %directory) {
366                        $street = latexStringSanitize ( $street ) ;
367                        print $dirFile "$street\n" ;
368                }
369        }
370        else {
371                foreach my $street (sort keys %directory) {
372                        $street = latexStringSanitize ( $street ) ;
373                        print $dirFile "$street\t" ;
374                        foreach my $square (sort keys %{$directory{$street}}) {
375                                print $dirFile "$square " ;
376                        }
377                        print $dirFile "\n" ;
378                }
379        }
380        close ($dirFile) ;
381}
382
3831 ;
384
385
Note: See TracBrowser for help on using the repository browser.