source: subversion/applications/utils/gary68/osmrender.pl @ 30595

Last change on this file since 30595 was 16562, checked in by gary68, 10 years ago

initial upload of several programs

  • Property svn:executable set to *
File size: 7.1 KB
Line 
1use strict ;
2use warnings ;
3
4use OSM::osm ;
5use OSM::osmgraph 2.0 ;
6
7my $programName = "osmrender.pl" ;
8my $usage = "osmrender.pl file.osm out.png size" ; # svg name is automatic
9my $version = "2.0" ;
10
11my $labelMinLength = 0.1 ; # min length of street so that it will be labled / needs adjustment according to picture size
12
13my $wayId ;
14my $wayUser ;
15my @wayNodes ;
16my @wayTags ;
17my $nodeId ;
18my $nodeUser ;
19my $nodeLat ;
20my $nodeLon ;
21my @nodeTags ;
22my $aRef1 ;
23my $aRef2 ;
24
25my $osmName ; 
26my $pngName ;
27
28my %lon ; my %lat ;
29my %placeName ;
30
31my $size ;
32my $lonMin ; my $latMin ; my $lonMax ; my $latMax ;
33
34my $time0 ; my $time1 ;
35
36# get parameter
37
38$osmName = shift||'';
39if (!$osmName)
40{
41        die (print $usage, "\n");
42}
43
44$pngName = shift||'';
45if (!$pngName)
46{
47        die (print $usage, "\n");
48}
49
50$size = shift||'';
51if (!$size)
52{
53        $size = 1024 ; # default size
54}
55
56print "\n$programName $version for file $osmName\n" ;
57
58$time0 = time() ;
59
60# get all node locations and place information
61
62print "get node information...\n" ;
63openOsmFile ($osmName) ;
64
65($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode () ;
66if ($nodeId != -1) {
67        @nodeTags = @$aRef1 ;
68}
69
70while ($nodeId != -1) {
71
72        $lon{$nodeId} = $nodeLon ;     
73        $lat{$nodeId} = $nodeLat ;     
74
75        my $place = 0 ; my $name = 0 ; my $tag ; my $nameStr ;
76        foreach $tag (@nodeTags) {
77                my $tmp = $tag ;
78                if ((grep /name:/ , $tag) and ( ($tmp =~ s/://g ) == 1 ) and 
79                        ( ! (grep /place_name:/ , $tag)) ) { 
80                        $nameStr = $tag ; $nameStr =~ s/name:// ;
81                        $name = 1 ; 
82                }
83                if (grep /place:/, $tag)  { $place = 1 ; }
84        }
85        if (($place) and ($name)) {
86                $placeName{$nodeId} = $nameStr ;
87                #print $nodeId, " ", $nameStr, "\n" ;
88        }
89
90        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode () ;
91        if ($nodeId != -1) {
92                @nodeTags = @$aRef1 ;
93        }
94}
95
96# calc area of pic
97
98$lonMin = 999 ; $lonMax = -999 ; $latMin = 999 ; $latMax = -999 ;
99my $key ;
100foreach $key (keys %lon) {
101        if ($lon{$key} > $lonMax) { $lonMax = $lon{$key} ; }
102        if ($lon{$key} < $lonMin) { $lonMin = $lon{$key} ; }
103        if ($lat{$key} > $latMax) { $latMax = $lat{$key} ; }
104        if ($lat{$key} < $latMin) { $latMin = $lat{$key} ; }
105}
106
107initGraph ($size, $lonMin, $latMin, $lonMax, $latMax) ;
108
109enableSVG () ;
110
111# draw areas first
112
113print "draw areas...\n" ;
114
115($wayId, $wayUser, $aRef1, $aRef2) = getWay () ;
116if ($wayId != -1) {
117        @wayNodes = @$aRef1 ;
118        @wayTags = @$aRef2 ;
119}
120while ($wayId != -1) {
121        foreach $key (@wayTags) {
122                if ($key eq "waterway:riverbank") {
123                        drawArea ("lightblue", nodes2Coordinates(@wayNodes)) ;
124                }
125                if ($key eq "natural:water") {
126                        drawArea ("lightblue", nodes2Coordinates(@wayNodes)) ;
127                }
128                if ( ($key eq "landuse:forest") or ($key eq "natural:wood") ) {
129                        drawArea ("lightbrown", nodes2Coordinates(@wayNodes)) ;
130                }
131                if ( ($key eq "landuse:farm") or ($key eq "landuse:village_green") ) {
132                        drawArea ("lightgreen", nodes2Coordinates(@wayNodes)) ;
133                }
134                if ($key eq "landuse:residential") {
135                        drawArea ("lightgray", nodes2Coordinates(@wayNodes)) ;
136                }
137        }       
138       
139        ($wayId, $wayUser, $aRef1, $aRef2) = getWay () ;
140        if ($wayId != -1) {
141                @wayNodes = @$aRef1 ;
142                @wayTags = @$aRef2 ;
143        }
144}
145
146closeOsmFile () ;
147
148# draw ways
149
150print "draw ways...\n" ;
151
152openOsmFile ($osmName) ;
153skipNodes () ;
154
155($wayId, $wayUser, $aRef1, $aRef2) = getWay () ;
156if ($wayId != -1) {
157        @wayNodes = @$aRef1 ;
158        @wayTags = @$aRef2 ;
159}
160while ($wayId != -1) {
161        my $name = "" ; my $ref = "" ;
162        my $length = 0 ;
163        foreach $key (@wayTags) {
164                if (grep /^name:/, $key) { $name = $key ; $name =~ s/name:// ; }
165                if (grep /^ref:/, $key) { $ref = $key ; $ref =~ s/ref:// ; }
166        }
167
168        if (scalar @wayNodes > 1) {
169
170
171                my $i ;
172                for ($i = 0; $i<$#wayNodes; $i++) {
173                        $length += distance ($lon{$wayNodes[$i]}, $lat{$wayNodes[$i]}, $lon{$wayNodes[$i+1]}, $lat{$wayNodes[$i+1]}) ;
174                }
175
176
177                foreach $key (@wayTags) {
178                        if ($key eq "highway:residential") {
179                                drawWay ("gray", 1, nodes2Coordinates(@wayNodes)) ;
180                                if ( ($name ne "") and ($length > $labelMinLength) ) { labelWay ("black", 0, "", $name, -2, nodes2Coordinates(@wayNodes)) ; }
181                        }
182                        if ( ($key eq "highway:service") or ($key eq "highway:unclassified") ) {
183                                drawWay ("gray", 1, nodes2Coordinates(@wayNodes)) ;
184                        }
185                        if ( ($key eq "waterway:river") or ($key eq "waterway:stream") ) {
186                                drawWay ("lightblue", 1, nodes2Coordinates(@wayNodes)) ;
187                        }
188                        if ($key eq "highway:motorway") {
189                                drawWay ("blue", 3, nodes2Coordinates(@wayNodes)) ;
190                                if ( ($ref ne "") and ($length > $labelMinLength) ) { labelWay ("blue", 4, "", $ref, -8, nodes2Coordinates(@wayNodes)) ; }
191                        }
192                        if ($key eq "highway:motorway_link") {
193                                drawWay ("blue", 2, nodes2Coordinates(@wayNodes)) ;
194                        }
195                        if ($key eq "highway:trunk") {
196                                drawWay ("blue", 3, nodes2Coordinates(@wayNodes)) ;
197                                if ( ($ref ne "") and ($length > $labelMinLength) ) { labelWay ("blue", 4, "", $ref, -8, nodes2Coordinates(@wayNodes)) ; }
198                        }
199                        if ($key eq "highway:trunk_link") {
200                                drawWay ("blue", 2, nodes2Coordinates(@wayNodes)) ;
201                        }
202                        if ( ($key eq "highway:primary") or ($key eq "highway:primary_link") ) {
203                                drawWay ("red", 2, nodes2Coordinates(@wayNodes)) ;
204                        }
205                        if ( ($key eq "highway:primary") ) {
206                                if ( ($ref ne "") and ($length > $labelMinLength) ) { labelWay ("red", 2, "", $ref, -3, nodes2Coordinates(@wayNodes)) ;  }
207                        }
208                        if ($key eq "highway:secondary") {
209                                drawWay ("red", 2, nodes2Coordinates(@wayNodes)) ;
210                                if ( ($ref ne "") and ($length > $labelMinLength) ) { labelWay ("red", 2, "", $ref, -3, nodes2Coordinates(@wayNodes)) ;  }
211                        }
212                        if ($key eq "highway:tertiary") {
213                                drawWay ("gray", 2, nodes2Coordinates(@wayNodes)) ;
214                                if ( ($ref ne "") and ($length > $labelMinLength) ) { labelWay ("gray", 2, "", $ref, -3, nodes2Coordinates(@wayNodes)) ; }
215                        }
216        #               if ($key eq "highway:track") {
217        #                       drawWay ("lightgray", 1, nodes2Coordinates(@wayNodes)) ;
218        #               }
219                }
220        }       
221       
222        ($wayId, $wayUser, $aRef1, $aRef2) = getWay () ;
223        if ($wayId != -1) {
224                @wayNodes = @$aRef1 ;
225                @wayTags = @$aRef2 ;
226        }
227}
228
229closeOsmFile () ;
230
231# draw place names
232
233print "draw places...\n" ;
234
235foreach $key (keys %placeName) {
236        # drawNodeDot ($lon{$key}, $lat{$key}, "black", 4) ;
237        drawTextPos ($lon{$key}, $lat{$key}, 0, 0, $placeName{$key}, "black", 2) ;
238}
239
240# draw other information
241
242print "draw other information...\n" ;
243
244drawLegend (2, "Farm", "lightgreen", "Forest", "lightbrown", "Residential", "lightgray", "Water", "lightblue", "Primary", "red", "Motorway", "blue", "Legend", "black") ;
245drawRuler ("darkgray") ;
246drawHead ("gary68's osmrender", "black", 2) ;
247drawFoot ("data by www.openstreetmap.org", "gray", 2) ;
248
249
250writeGraph ($pngName) ;
251
252my $svgName = $pngName ; $svgName =~ s/.png/.svg/ ;
253writeSVG ($svgName) ;
254
255$time1 = time() ;
256print "\n$programName finished after ", stringTimeSpent ($time1-$time0), "\n\n" ;
257
258
259sub nodes2Coordinates {
260#
261# transform list of nodeIds to list of lons/lats
262#
263        my @nodes = @_ ;
264        my $i ;
265        my @result = () ;
266
267        #print "in @nodes\n" ;
268
269        for ($i=0; $i<=$#nodes; $i++) {
270                push @result, $lon{$nodes[$i]} ;
271                push @result, $lat{$nodes[$i]} ;
272        }
273        return @result ;
274}
275
Note: See TracBrowser for help on using the repository browser.