source: subversion/applications/utils/gary68/mwFile.pm @ 27715

Last change on this file since 27715 was 26506, checked in by gary68, 8 years ago

mapweaver: label halo; pbf support; bold and italic fonts

File size: 9.2 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 mwFile ; 
20
21use strict ;
22use warnings ;
23
24use mwConfig ;
25use mwMap ;
26use mwLabel ;
27
28use OSM::osm ;
29
30use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
31
32require Exporter ;
33
34@ISA = qw ( Exporter AutoLoader ) ;
35
36@EXPORT = qw (  readFile
37                getNodePointers
38                getWayPointers
39                getRelationPointers
40                 ) ;
41
42my %lon ;
43my %lat ;
44my %memNodeTags ;
45
46my %memWayNodes ;
47my %memWayTags ;
48
49my %memRelationMembers ;
50my %memRelationTags ;
51
52
53
54sub readFile {
55
56        my ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1, @nodeTags) ;
57        my ($wayId, $wayUser, $aRef2, @wayTags, @wayNodes) ;
58        my ($relationId, $relationUser, @relationTags, @relationMembers) ;
59        my %invalidWays ;
60
61
62        my $osmName ;
63        if (defined cv('in')) { $osmName = cv('in') ; }
64
65
66        if ( grep /\.pbf/, $osmName ) {
67                my $newName = $osmName ;
68                $newName =~ s/\.pbf/\.osm/i ;
69
70                # osmosis
71                print "call osmosis to convert pbf file to osm file.\n" ;
72                `osmosis --read-pbf $osmName --write-xml $newName` ;
73
74                # change config
75                $osmName = $newName ;
76                setConfigValue ("in", $newName) ;
77        }
78
79
80        my $clipbbox = "" ;
81        if (defined cv('clipbbox')) { $clipbbox = cv('clipbbox') ; }
82
83        # -place given? look for place and call osmosis
84
85        my $placeFound = 0 ; my $placeLon ; my $placeLat ;
86        if ( cv('place') ne "") {
87                my ($placeId) = ( cv('place') =~ /([\d]+)/);
88                if (!defined $placeId) { $placeId = -999999999 ; }
89                print "looking for place...\n" ;
90
91                my $placeFileName = "" ;
92                if ( cv('placeFile') ne "" ) { 
93                        $placeFileName = cv('placeFile') ; 
94                }
95                else {
96                        $placeFileName = cv('in') ; 
97                }
98
99                openOsmFile ($placeFileName) ;
100                ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
101                if ($nodeId != -1) {
102                        @nodeTags = @$aRef1 ;
103                }
104                my $place = cv ('place') ;
105                while ( ($nodeId != -1) and ($placeFound == 0) ) {
106                        my $placeNode = 0 ; my $placeName = 0 ;
107                        foreach my $tag ( @nodeTags ) {
108                                if ($tag->[0] eq "place") { $placeNode = 1 ; }
109                                if ( ($tag->[0] eq "name") and (grep /$place/i, $tag->[1]) ){ $placeName = 1 ; }
110                        }
111                        if ( (($placeNode == 1) and ($placeName == 1)) or ($placeId == $nodeId) ) {
112                                $placeFound = 1 ;
113                                $placeLon = $nodeLon ;
114                                $placeLat = $nodeLat ;
115                        }
116                        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
117                        if ($nodeId != -1) {
118                                @nodeTags = @$aRef1 ;
119                        }
120                }
121
122                closeOsmFile() ;
123
124                if ($placeFound == 1) {
125                        print "place $place found at " ;
126                        print "lon: $placeLon " ;
127                        print "lat: $placeLat\n" ;
128                        my $left = $placeLon - cv('lonrad')/(111.11 * cos ( $placeLat / 360 * 3.14 * 2 ) ) ; 
129                        my $right = $placeLon + cv('lonrad')/(111.11 * cos ( $placeLat / 360 * 3.14 * 2 ) ) ; 
130                        my $top = $placeLat + cv('latrad')/111.11 ; 
131                        my $bottom = $placeLat - cv('latrad')/111.11 ;
132
133                        print "call osmosis...\n" ;
134
135                        if ( cv('cie') eq "0" ) {
136                                print "OSMOSIS STRING: --bounding-box completeWays=yes completeRelations=yes bottom=$bottom top=$top left=$left right=$right\n" ;
137                                `osmosis --read-xml $osmName  --bounding-box completeWays=yes completeRelations=yes bottom=$bottom top=$top left=$left right=$right --write-xml ./temp.osm` ;
138                        }
139                        else {
140                                print "OSMOSIS STRING: --bounding-box clipIncompleteEntities=yes bottom=$bottom top=$top left=$left right=$right\n" ;
141                                `osmosis --read-xml $osmName  --bounding-box clipIncompleteEntities=yes  bottom=$bottom top=$top left=$left right=$right --write-xml ./temp.osm` ;
142                        }
143
144                        print "osmosis done.\n" ;
145
146                        $osmName = "./temp.osm" ;
147                        $clipbbox = "$left,$bottom,$right,$top" ;
148                }
149                else {
150                        print "ERROR: place $place not found.\n" ;
151                        die() ;
152                }
153        }
154
155
156
157        # STORE DATA
158        my $nr = 0 ; my $wr = 0 ; my $rr = 0 ;
159        print "reading osm file...\n" ;
160
161        openOsmFile ($osmName) ;
162        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
163        if ($nodeId != -1) {
164                @nodeTags = @$aRef1 ;
165        }
166        while ($nodeId != -1) {
167                $nr++ ;
168                $lon{$nodeId} = $nodeLon ; $lat{$nodeId} = $nodeLat ;   
169                @{$memNodeTags{$nodeId}} = @nodeTags ;
170
171                ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
172                if ($nodeId != -1) {
173                        @nodeTags = @$aRef1 ;
174                }
175        }
176
177        ($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
178        if ($wayId != -1) {
179                @wayNodes = @$aRef1 ;
180                @wayTags = @$aRef2 ;
181        }
182        while ($wayId != -1) {
183                $wr++ ;
184                if (scalar (@wayNodes) > 1) {
185                        @{$memWayTags{$wayId}} = @wayTags ;
186                        @{$memWayNodes{$wayId}} = @wayNodes ;
187                        foreach my $node (@wayNodes) {
188                                if (!defined $lon{$node}) {
189                                        print "  ERROR: way $wayId references node $node, which is not present!\n" ;
190                                }
191                        }
192                }
193                else {
194                        $invalidWays{$wayId} = 1 ;
195                }
196       
197                ($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
198                if ($wayId != -1) {
199                        @wayNodes = @$aRef1 ;
200                        @wayTags = @$aRef2 ;
201                }
202        }
203
204
205        ($relationId, $relationUser, $aRef1, $aRef2) = getRelation () ;
206        if ($relationId != -1) {
207                @relationMembers = @$aRef1 ;
208                @relationTags = @$aRef2 ;
209        }
210
211        while ($relationId != -1) {
212                $rr++ ;
213                @{$memRelationTags{$relationId}} = @relationTags ;
214                @{$memRelationMembers{$relationId}} = @relationMembers ;
215
216                foreach my $member (@relationMembers) {
217                        if ( ($member->[0] eq "node") and (!defined $lon{$member->[1]}) ) {
218                                print "  ERROR: relation $relationId references node $member->[1] which is not present!\n" ;
219                        }
220                        if ( ($member->[0] eq "way") and (!defined $memWayNodes{$member->[1]} ) and (!defined $invalidWays{$member->[1]}) ) {
221                                print "  ERROR: relation $relationId references way $member->[1] which is not present or invalid!\n" ;
222                        }
223                }
224
225                #next
226                ($relationId, $relationUser, $aRef1, $aRef2) = getRelation () ;
227                if ($relationId != -1) {
228                        @relationMembers = @$aRef1 ;
229                        @relationTags = @$aRef2 ;
230                }
231        }
232
233        closeOsmFile () ;
234
235        print "read: $nr nodes, $wr ways and $rr relations.\n\n" ;
236
237        # calc area of pic and init graphics
238        my $lonMin = 999 ; my $lonMax = -999 ; my $latMin = 999 ; my $latMax = -999 ;
239        foreach my $key (keys %lon) {
240                if ($lon{$key} > $lonMax) { $lonMax = $lon{$key} ; }
241                if ($lon{$key} < $lonMin) { $lonMin = $lon{$key} ; }
242                if ($lat{$key} > $latMax) { $latMax = $lat{$key} ; }
243                if ($lat{$key} < $latMin) { $latMin = $lat{$key} ; }
244        }
245
246        # clip picture if desired
247        if ($clipbbox ne "") {
248                my ($bbLeft, $bbBottom, $bbRight, $bbTop) = ($clipbbox =~ /([\d\-\.]+),([\d\-\.]+),([\d\-\.]+),([\d\-\.]+)/ ) ;
249                # print "$bbLeft, $bbBottom, $bbRight, $bbTop\n" ;
250                if (($bbLeft > $lonMax) or ($bbLeft < $lonMin)) { print "WARNING -clipbox left parameter outside data.\n" ; }
251                if (($bbRight > $lonMax) or ($bbRight < $lonMin)) { print "WARNING -clipbox right parameter outside data.\n" ; }
252                if (($bbBottom > $latMax) or ($bbBottom < $latMin)) { print "WARNING -clipbox bottom parameter outside data.\n" ; }
253                if (($bbTop > $latMax) or ($bbTop < $latMin)) { print "WARNING -clipbox top parameter outside data.\n" ; }
254                $lonMin = $bbLeft ;
255                $lonMax = $bbRight ;
256                $latMin = $bbBottom ;
257                $latMax = $bbTop ;
258        }
259        else {
260                if (defined cv('clip')) {
261                        if ( (cv('clip') > 0) and (cv('clip') < 100) ) { 
262                                my $clip = cv('clip') ;
263                                $clip = $clip / 100 ;
264                                $lonMin += ($lonMax-$lonMin) * $clip ;
265                                $lonMax -= ($lonMax-$lonMin) * $clip ;
266                                $latMin += ($latMax-$latMin) * $clip ;
267                                $latMax -= ($latMax-$latMin) * $clip ;
268                        }
269                }
270        }
271
272        # pad picture if desired
273        if (defined cv('pad')) {
274                my $pad = cv('pad') ;
275                if ( ($pad > 0) and ($pad < 100) ) { 
276                        $pad = $pad / 100 ;
277                        $lonMin -= ($lonMax-$lonMin) * $pad ;
278                        $lonMax += ($lonMax-$lonMin) * $pad ;
279                        $latMin -= ($latMax-$latMin) * $pad ;
280                        $latMax += ($latMax-$latMin) * $pad ;
281                }
282        }
283
284        my $size = cv('size') ;
285
286        # calc pic size
287
288        if ( cv('scaleSet') != 0 ) {
289                my $dist = distance ($lonMin, $latMin, $lonMax, $latMin) ;
290                my $width = $dist / cv('scaleSet') * 1000 * 100 / 2.54 ; # inches
291                $size = int ($width * 300) ;
292        }
293
294        if ( cv('maxTargetSize') ne "" ) {
295                my @a = split /,/, cv('maxTargetSize') ;
296                my $targetWidth = $a[0] ;
297                my $targetHeight = $a[1] ;
298                # print "TS: $targetWidth, $targetHeight [cm]\n" ;
299                my $distLon = distance ($lonMin, $latMin, $lonMax, $latMin) ;
300                my $distLat = distance ($lonMin, $latMin, $lonMin, $latMax) ;
301                # print "TS: $distLon, $distLat [km]\n" ;
302                my $scaleLon = ($distLon * 1000 * 100) / $targetWidth ;
303                my $scaleLat = ($distLat * 1000 * 100) / $targetHeight ;
304                my $targetScale = int $scaleLon ;
305                if ( $scaleLat > $targetScale ) { $targetScale = int $scaleLat ; }
306                # print "TS: $targetScale [1:n]\n" ;
307
308                my $width = $distLon / $targetScale * 1000 * 100 / 2.54 ; # inches
309                $size = int ($width * 300) ;
310                print "Map width now $size [px] due to maxTargetSize parameter\n" ;             
311        }
312
313        mwMap::initGraph ($size, $lonMin, $latMin, $lonMax, $latMax) ;
314
315}
316
317sub getNodePointers {
318        return ( \%lon, \%lat, \%memNodeTags) ;
319}
320
321sub getWayPointers {
322        return ( \%memWayNodes, \%memWayTags) ;
323}
324
325sub getRelationPointers {
326
327        return ( \%memRelationMembers, \%memRelationTags) ;
328}
329
330
3311 ;
332
333
Note: See TracBrowser for help on using the repository browser.