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

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

new mapweaver version; dir.pl updated

File size: 8.1 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        my $clipbbox = "" ;
66        if (defined cv('clipbbox')) { $clipbbox = cv('clipbbox') ; }
67
68        # -place given? look for place and call osmosis
69
70        my $placeFound = 0 ; my $placeLon ; my $placeLat ;
71        if ( cv('place') ne "") {
72                my ($placeId) = ( cv('place') =~ /([\d]+)/);
73                if (!defined $placeId) { $placeId = -999999999 ; }
74                print "looking for place...\n" ;
75
76                my $placeFileName = "" ;
77                if ( cv('placeFile') ne "" ) { 
78                        $placeFileName = cv('placeFile') ; 
79                }
80                else {
81                        $placeFileName = cv('in') ; 
82                }
83
84                openOsmFile ($placeFileName) ;
85                ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
86                if ($nodeId != -1) {
87                        @nodeTags = @$aRef1 ;
88                }
89                my $place = cv ('place') ;
90                while ( ($nodeId != -1) and ($placeFound == 0) ) {
91                        my $placeNode = 0 ; my $placeName = 0 ;
92                        foreach my $tag ( @nodeTags ) {
93                                if ($tag->[0] eq "place") { $placeNode = 1 ; }
94                                if ( ($tag->[0] eq "name") and (grep /$place/i, $tag->[1]) ){ $placeName = 1 ; }
95                        }
96                        if ( (($placeNode == 1) and ($placeName == 1)) or ($placeId == $nodeId) ) {
97                                $placeFound = 1 ;
98                                $placeLon = $nodeLon ;
99                                $placeLat = $nodeLat ;
100                        }
101                        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
102                        if ($nodeId != -1) {
103                                @nodeTags = @$aRef1 ;
104                        }
105                }
106
107                closeOsmFile() ;
108
109                if ($placeFound == 1) {
110                        print "place $place found at " ;
111                        print "lon: $placeLon " ;
112                        print "lat: $placeLat\n" ;
113                        my $left = $placeLon - cv('lonrad')/(111.11 * cos ( $placeLat / 360 * 3.14 * 2 ) ) ; 
114                        my $right = $placeLon + cv('lonrad')/(111.11 * cos ( $placeLat / 360 * 3.14 * 2 ) ) ; 
115                        my $top = $placeLat + cv('latrad')/111.11 ; 
116                        my $bottom = $placeLat - cv('latrad')/111.11 ;
117
118                        print "call osmosis...\n" ;
119
120                        if ( cv('cie') eq "0" ) {
121                                print "OSMOSIS STRING: --bounding-box completeWays=yes completeRelations=yes bottom=$bottom top=$top left=$left right=$right\n" ;
122                                `osmosis --read-xml $osmName  --bounding-box completeWays=yes completeRelations=yes bottom=$bottom top=$top left=$left right=$right --write-xml ./temp.osm` ;
123                        }
124                        else {
125                                print "OSMOSIS STRING: --bounding-box clipIncompleteEntities=yes bottom=$bottom top=$top left=$left right=$right\n" ;
126                                `osmosis --read-xml $osmName  --bounding-box clipIncompleteEntities=yes  bottom=$bottom top=$top left=$left right=$right --write-xml ./temp.osm` ;
127                        }
128
129                        print "osmosis done.\n" ;
130
131                        $osmName = "./temp.osm" ;
132                        $clipbbox = "$left,$bottom,$right,$top" ;
133                }
134                else {
135                        print "ERROR: place $place not found.\n" ;
136                        die() ;
137                }
138        }
139
140
141
142        # STORE DATA
143        my $nr = 0 ; my $wr = 0 ; my $rr = 0 ;
144        print "reading osm file...\n" ;
145
146        openOsmFile ($osmName) ;
147        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
148        if ($nodeId != -1) {
149                @nodeTags = @$aRef1 ;
150        }
151        while ($nodeId != -1) {
152                $nr++ ;
153                $lon{$nodeId} = $nodeLon ; $lat{$nodeId} = $nodeLat ;   
154                @{$memNodeTags{$nodeId}} = @nodeTags ;
155
156                ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
157                if ($nodeId != -1) {
158                        @nodeTags = @$aRef1 ;
159                }
160        }
161
162        ($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
163        if ($wayId != -1) {
164                @wayNodes = @$aRef1 ;
165                @wayTags = @$aRef2 ;
166        }
167        while ($wayId != -1) {
168                $wr++ ;
169                if (scalar (@wayNodes) > 1) {
170                        @{$memWayTags{$wayId}} = @wayTags ;
171                        @{$memWayNodes{$wayId}} = @wayNodes ;
172                        foreach my $node (@wayNodes) {
173                                if (!defined $lon{$node}) {
174                                        print "  ERROR: way $wayId references node $node, which is not present!\n" ;
175                                }
176                        }
177                }
178                else {
179                        $invalidWays{$wayId} = 1 ;
180                }
181       
182                ($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
183                if ($wayId != -1) {
184                        @wayNodes = @$aRef1 ;
185                        @wayTags = @$aRef2 ;
186                }
187        }
188
189
190        ($relationId, $relationUser, $aRef1, $aRef2) = getRelation () ;
191        if ($relationId != -1) {
192                @relationMembers = @$aRef1 ;
193                @relationTags = @$aRef2 ;
194        }
195
196        while ($relationId != -1) {
197                $rr++ ;
198                @{$memRelationTags{$relationId}} = @relationTags ;
199                @{$memRelationMembers{$relationId}} = @relationMembers ;
200
201                foreach my $member (@relationMembers) {
202                        if ( ($member->[0] eq "node") and (!defined $lon{$member->[1]}) ) {
203                                print "  ERROR: relation $relationId references node $member->[1] which is not present!\n" ;
204                        }
205                        if ( ($member->[0] eq "way") and (!defined $memWayNodes{$member->[1]} ) and (!defined $invalidWays{$member->[1]}) ) {
206                                print "  ERROR: relation $relationId references way $member->[1] which is not present or invalid!\n" ;
207                        }
208                }
209
210                #next
211                ($relationId, $relationUser, $aRef1, $aRef2) = getRelation () ;
212                if ($relationId != -1) {
213                        @relationMembers = @$aRef1 ;
214                        @relationTags = @$aRef2 ;
215                }
216        }
217
218        closeOsmFile () ;
219
220        print "read: $nr nodes, $wr ways and $rr relations.\n\n" ;
221
222        # calc area of pic and init graphics
223        my $lonMin = 999 ; my $lonMax = -999 ; my $latMin = 999 ; my $latMax = -999 ;
224        foreach my $key (keys %lon) {
225                if ($lon{$key} > $lonMax) { $lonMax = $lon{$key} ; }
226                if ($lon{$key} < $lonMin) { $lonMin = $lon{$key} ; }
227                if ($lat{$key} > $latMax) { $latMax = $lat{$key} ; }
228                if ($lat{$key} < $latMin) { $latMin = $lat{$key} ; }
229        }
230
231        # clip picture if desired
232        if ($clipbbox ne "") {
233                my ($bbLeft, $bbBottom, $bbRight, $bbTop) = ($clipbbox =~ /([\d\-\.]+),([\d\-\.]+),([\d\-\.]+),([\d\-\.]+)/ ) ;
234                # print "$bbLeft, $bbBottom, $bbRight, $bbTop\n" ;
235                if (($bbLeft > $lonMax) or ($bbLeft < $lonMin)) { print "WARNING -clipbox left parameter outside data.\n" ; }
236                if (($bbRight > $lonMax) or ($bbRight < $lonMin)) { print "WARNING -clipbox right parameter outside data.\n" ; }
237                if (($bbBottom > $latMax) or ($bbBottom < $latMin)) { print "WARNING -clipbox bottom parameter outside data.\n" ; }
238                if (($bbTop > $latMax) or ($bbTop < $latMin)) { print "WARNING -clipbox top parameter outside data.\n" ; }
239                $lonMin = $bbLeft ;
240                $lonMax = $bbRight ;
241                $latMin = $bbBottom ;
242                $latMax = $bbTop ;
243        }
244        else {
245                if (defined cv('clip')) {
246                        if ( (cv('clip') > 0) and (cv('clip') < 100) ) { 
247                                my $clip = cv('clip') ;
248                                $clip = $clip / 100 ;
249                                $lonMin += ($lonMax-$lonMin) * $clip ;
250                                $lonMax -= ($lonMax-$lonMin) * $clip ;
251                                $latMin += ($latMax-$latMin) * $clip ;
252                                $latMax -= ($latMax-$latMin) * $clip ;
253                        }
254                }
255        }
256
257        # pad picture if desired
258        if (defined cv('pad')) {
259                my $pad = cv('pad') ;
260                if ( ($pad > 0) and ($pad < 100) ) { 
261                        $pad = $pad / 100 ;
262                        $lonMin -= ($lonMax-$lonMin) * $pad ;
263                        $lonMax += ($lonMax-$lonMin) * $pad ;
264                        $latMin -= ($latMax-$latMin) * $pad ;
265                        $latMax += ($latMax-$latMin) * $pad ;
266                }
267        }
268
269        # calc pic size if scale is set
270        my $size = cv('size') ;
271        if ( cv('scaleSet') != 0 ) {
272                my $dist = distance ($lonMin, $latMin, $lonMax, $latMin) ;
273                my $width = $dist / cv('scaleSet') * 1000 * 100 / 2.54 ; # inches
274                $size = int ($width * 300) ;
275        }
276
277        mwMap::initGraph ($size, $lonMin, $latMin, $lonMax, $latMax) ;
278
279}
280
281sub getNodePointers {
282        return ( \%lon, \%lat, \%memNodeTags) ;
283}
284
285sub getWayPointers {
286        return ( \%memWayNodes, \%memWayTags) ;
287}
288
289sub getRelationPointers {
290
291        return ( \%memRelationMembers, \%memRelationTags) ;
292}
293
294
2951 ;
296
297
Note: See TracBrowser for help on using the repository browser.