source: subversion/applications/utils/gary68/todo.pl @ 20971

Last change on this file since 20971 was 16894, checked in by gary68, 10 years ago

todo.pl first alpha

  • Property svn:executable set to *
File size: 14.6 KB
Line 
1use strict ;
2use warnings ;
3
4use OSM::osm 4.0 ;
5use OSM::osmgraph 2.0 ;
6
7my $minLength = 0.05 ;
8my $maxDistStub = 0.05 ;
9my $colorStub = "brown" ;
10my $colorFixme = "orange" ;
11my $colorName = "black" ;
12my $colorBug = "red" ;
13my $colorRoute = "pink" ;
14my $colorInterpolationWay = "orange" ;
15
16my $programName = "todomap.pl" ;
17my $usage = "todomap.pl file.osm bugs.gpx route.gpx out.png size" ; # svg name is automatic
18my $version = "1.0" ;
19
20my $labelMinLength = 0.1 ; # min length of street so that it will be labeled / needs adjustment according to picture size
21
22my $wayId ;
23my $wayUser ;
24my @wayNodes ;
25my @wayTags ;
26my $nodeId ;
27my $nodeUser ;
28my $nodeLat ;
29my $nodeLon ;
30my @nodeTags ;
31my $aRef1 ;
32my $aRef2 ;
33
34my $osmName ; 
35my $gpxName ; 
36my $routeName ; 
37my $pngName ;
38
39my $gpxFile ;
40my $routeFile ;
41
42my %lon ; my %lat ;
43my %placeName ;
44my %ways ; # per node
45
46my $size ;
47my $lonMin ; my $latMin ; my $lonMax ; my $latMax ;
48
49my $time0 ; my $time1 ;
50
51# get parameter
52
53$osmName = shift||'';
54if (!$osmName)
55{
56        die (print $usage, "\n");
57}
58
59$gpxName = shift||'';
60if (!$gpxName)
61{
62        die (print $usage, "\n");
63}
64
65$routeName = shift||'';
66if (!$routeName)
67{
68        die (print $usage, "\n");
69}
70
71$pngName = shift||'';
72if (!$pngName)
73{
74        die (print $usage, "\n");
75}
76
77$size = shift||'';
78if (!$size)
79{
80        $size = 2048 ; # default size
81}
82
83print "\n$programName $version for file $osmName\n" ;
84
85$time0 = time() ;
86
87# get all node locations and place information
88
89print "get node information...\n" ;
90openOsmFile ($osmName) ;
91
92($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode () ;
93if ($nodeId != -1) {
94        @nodeTags = @$aRef1 ;
95}
96
97while ($nodeId != -1) {
98
99        $lon{$nodeId} = $nodeLon ;     
100        $lat{$nodeId} = $nodeLat ;     
101
102        my $place = 0 ; my $name = 0 ; my $tag ; my $nameStr ;
103        foreach $tag (@nodeTags) {
104                my $tmp = $tag ;
105                if ((grep /name:/ , $tag) and ( ($tmp =~ s/://g ) == 1 ) and 
106                        ( ! (grep /place_name:/ , $tag)) ) { 
107                        $nameStr = $tag ; $nameStr =~ s/name:// ;
108                        $name = 1 ; 
109                }
110                if (grep /place:/, $tag)  { $place = 1 ; }
111        }
112        if (($place) and ($name)) {
113                $placeName{$nodeId} = $nameStr ;
114                #print $nodeId, " ", $nameStr, "\n" ;
115        }
116
117        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode () ;
118        if ($nodeId != -1) {
119                @nodeTags = @$aRef1 ;
120        }
121}
122
123# calc area of pic
124
125$lonMin = 999 ; $lonMax = -999 ; $latMin = 999 ; $latMax = -999 ;
126my $key ;
127foreach $key (keys %lon) {
128        if ($lon{$key} > $lonMax) { $lonMax = $lon{$key} ; }
129        if ($lon{$key} < $lonMin) { $lonMin = $lon{$key} ; }
130        if ($lat{$key} > $latMax) { $latMax = $lat{$key} ; }
131        if ($lat{$key} < $latMin) { $latMin = $lat{$key} ; }
132}
133
134#$lonMax += ($lonMax - $lonMin) * 20/100 ;
135
136initGraph ($size, $lonMin, $latMin, $lonMax, $latMax) ;
137
138enableSVG () ;
139
140# draw areas first
141
142print "draw areas...\n" ;
143
144($wayId, $wayUser, $aRef1, $aRef2) = getWay () ;
145if ($wayId != -1) {
146        @wayNodes = @$aRef1 ;
147        @wayTags = @$aRef2 ;
148}
149while ($wayId != -1) {
150        foreach $key (@wayTags) {
151                if ($key eq "waterway:riverbank") {
152                        drawArea ("lightblue", nodes2Coordinates(@wayNodes)) ;
153                }
154                if ($key eq "natural:water") {
155                        drawArea ("lightblue", nodes2Coordinates(@wayNodes)) ;
156                }
157                if ( ($key eq "landuse:forest") or ($key eq "natural:wood") ) {
158                        drawArea ("lightbrown", nodes2Coordinates(@wayNodes)) ;
159                }
160                if ( ($key eq "landuse:farm") or ($key eq "landuse:village_green") ) {
161                        drawArea ("lightgreen", nodes2Coordinates(@wayNodes)) ;
162                }
163                if ($key eq "landuse:residential") {
164                        drawArea ("lightgray", nodes2Coordinates(@wayNodes)) ;
165                }
166        }       
167       
168        ($wayId, $wayUser, $aRef1, $aRef2) = getWay () ;
169        if ($wayId != -1) {
170                @wayNodes = @$aRef1 ;
171                @wayTags = @$aRef2 ;
172        }
173}
174
175closeOsmFile () ;
176
177# draw ways
178
179print "draw ways...\n" ;
180
181openOsmFile ($osmName) ;
182skipNodes () ;
183
184($wayId, $wayUser, $aRef1, $aRef2) = getWay () ;
185if ($wayId != -1) {
186        @wayNodes = @$aRef1 ;
187        @wayTags = @$aRef2 ;
188}
189while ($wayId != -1) {
190        my $name = "" ; my $ref = "" ;
191        my $length = 0 ;
192        foreach $key (@wayTags) {
193                if (grep /^name:/, $key) { $name = $key ; $name =~ s/name:// ; }
194                if (grep /^ref:/, $key) { $ref = $key ; $ref =~ s/ref:// ; }
195        }
196
197        if (scalar @wayNodes > 1) {
198
199
200                my $i ;
201                for ($i = 0; $i<$#wayNodes; $i++) {
202                        $length += distance ($lon{$wayNodes[$i]}, $lat{$wayNodes[$i]}, $lon{$wayNodes[$i+1]}, $lat{$wayNodes[$i+1]}) ;
203                }
204
205
206                foreach $key (@wayTags) {
207                        if (grep /^highway:/, $key) { 
208                                foreach my $n (@wayNodes) {
209                                        if (defined $ways{$n}) {
210                                                $ways{$n}++ ;
211                                        }
212                                        else {
213                                                $ways{$n} = 1 ;
214                                        }
215                                }
216                        }
217                        if ( ($key eq "highway:residential") or ($key eq "highway:pedestrian") ) {
218                                drawWay ("gray", 1, nodes2Coordinates(@wayNodes)) ;
219                                if ( ($name ne "") and ($length > $labelMinLength) ) { labelWay ("black", 0, "", $name, -2, nodes2Coordinates(@wayNodes)) ; }
220                        }
221                        if ( ($key eq "highway:service") or ($key eq "highway:unclassified") ) {
222                                drawWay ("gray", 1, nodes2Coordinates(@wayNodes)) ;
223                        }
224                        if ( ($key eq "waterway:river") or ($key eq "waterway:stream") ) {
225                                drawWay ("lightblue", 1, nodes2Coordinates(@wayNodes)) ;
226                        }
227                        if ($key eq "highway:motorway") {
228                                drawWay ("blue", 3, nodes2Coordinates(@wayNodes)) ;
229                                if ( ($ref ne "") and ($length > $labelMinLength) ) { labelWay ("blue", 4, "", $ref, -8, nodes2Coordinates(@wayNodes)) ; }
230                        }
231                        if ($key eq "highway:motorway_link") {
232                                drawWay ("blue", 2, nodes2Coordinates(@wayNodes)) ;
233                        }
234                        if ($key eq "highway:trunk") {
235                                drawWay ("blue", 3, nodes2Coordinates(@wayNodes)) ;
236                                if ( ($ref ne "") and ($length > $labelMinLength) ) { labelWay ("blue", 4, "", $ref, -8, nodes2Coordinates(@wayNodes)) ; }
237                        }
238                        if ($key eq "highway:trunk_link") {
239                                drawWay ("blue", 2, nodes2Coordinates(@wayNodes)) ;
240                        }
241                        if ( ($key eq "highway:primary") or ($key eq "highway:primary_link") ) {
242                                drawWay ("red", 2, nodes2Coordinates(@wayNodes)) ;
243                        }
244                        if ( ($key eq "highway:primary") ) {
245                                if ( ($ref ne "") and ($length > $labelMinLength) ) { labelWay ("red", 2, "", $ref, -3, nodes2Coordinates(@wayNodes)) ;  }
246                        }
247                        if ($key eq "highway:secondary") {
248                                drawWay ("red", 2, nodes2Coordinates(@wayNodes)) ;
249                                if ( ($ref ne "") and ($length > $labelMinLength) ) { labelWay ("red", 2, "", $ref, -3, nodes2Coordinates(@wayNodes)) ;  }
250                        }
251                        if ($key eq "highway:tertiary") {
252                                drawWay ("gray", 2, nodes2Coordinates(@wayNodes)) ;
253                                if ( ($ref ne "") and ($length > $labelMinLength) ) { labelWay ("gray", 2, "", $ref, -3, nodes2Coordinates(@wayNodes)) ; }
254                        }
255                        if ( ($key eq "highway:track") or ($key eq "highway:footway") or ($key eq "highway:steps") or ($key eq "highway:cycleway") ) {
256                                drawWay ("lightgray", 1, nodes2Coordinates(@wayNodes)) ;
257                        }
258
259                        # DRAW HOUSE NUMBER WAYS
260                        if (grep /addr:interpolation/, $key) {
261                                drawWay ($colorInterpolationWay, 2, nodes2Coordinates(@wayNodes)) ;
262                        }
263       
264                }
265        }       
266       
267        ($wayId, $wayUser, $aRef1, $aRef2) = getWay () ;
268        if ($wayId != -1) {
269                @wayNodes = @$aRef1 ;
270                @wayTags = @$aRef2 ;
271        }
272}
273
274closeOsmFile () ;
275
276
277# DRAW PLACE NAMES
278
279print "draw places...\n" ;
280
281foreach $key (keys %placeName) {
282        # drawNodeDot ($lon{$key}, $lat{$key}, "black", 4) ;
283        drawTextPos ($lon{$key}, $lat{$key}, 0, 0, $placeName{$key}, "black", 2) ;
284}
285
286
287
288
289
290
291
292
293
294
295openOsmFile ($osmName) ;
296($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
297if ($nodeId != -1) {
298        @nodeTags = @$aRef1 ;
299}
300
301while ($nodeId != -1) {
302
303        my $building = 0 ;
304        my $number = 0 ;
305        my $fixme = 0 ;
306        foreach my $tag (@nodeTags) {
307                if ($tag->[0] eq "building") { $building = 1 ; }
308                if ($tag->[0] eq "addr:housenumber") { $number = $tag->[1] ; }
309                if ( grep /fixme/i, $tag->[0]) { $fixme = 1 ; }
310                if ( grep /fixme/i, $tag->[1]) { $fixme = 1 ; }
311                if ( grep /todo/i, $tag->[0]) { $fixme = 1 ; }
312                if ( grep /todo/i, $tag->[1]) { $fixme = 1 ; }
313        }
314
315        # DRAW BUILDINGS FROM NODES
316        if ($building) { drawNodeDot ($nodeLon, $nodeLat, "darkgray", 3) ; }
317        if ($building and $number) { drawTextPos ($nodeLon, $nodeLat, 0, 0, $number, "black", 2) ; }
318
319        if ($fixme) { 
320                #print "fixme node found\n" ;
321                drawNodeDot ($nodeLon, $nodeLat, $colorFixme, 5) ; 
322                drawTextPos ($nodeLon, $nodeLat, 0, 0, "FIXME", $colorFixme, 2) ; 
323        }
324
325        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
326        if ($nodeId != -1) {
327                @nodeTags = @$aRef1 ;
328        }
329}
330
331
332($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
333if ($wayId != -1) {
334        @wayNodes = @$aRef1 ;
335        @wayTags = @$aRef2 ;
336}
337
338while ($wayId != -1) {
339        my $name = "" ; my $ref = "" ; my $tracktype = "" ;
340        my $residential = 0 ; my $linking = 0 ; my $track = 0 ; my $building = 0 ; my $number = 0 ; my $highway = 0 ;
341        my $fixme = 0 ;
342
343        if (scalar @wayNodes > 1) {
344                foreach my $tag (@wayTags) {
345                        if ($tag->[0] eq "highway") { $highway = 1 ; }
346                        if ( ($tag->[0] eq "highway") and ($tag->[1] eq "residential") ) { $residential = 1 ; }
347                        if ( ($tag->[0] eq "highway") and ($tag->[1] eq "primary") ) { $linking = 1 ; }
348                        if ( ($tag->[0] eq "highway") and ($tag->[1] eq "secondary") ) { $linking = 1 ; }
349                        if ( ($tag->[0] eq "highway") and ($tag->[1] eq "tertiary") ) { $linking = 1 ; }
350                        if ( ($tag->[0] eq "highway") and ($tag->[1] eq "track") ) { $track = 1 ; }
351                        if ($tag->[0] eq "tracktype") { $tracktype = $tag->[1] ; }
352                        if ($tag->[0] eq "name") { $name = $tag->[1] ; }
353                        if ($tag->[0] eq "ref") { $ref = $tag->[1] ; }
354                        if ( grep /fixme/, $tag->[0]) { $fixme = 1 ; }
355                        if ( grep /fixme/, $tag->[1]) { $fixme = 1 ; }
356                        if ( grep /todo/, $tag->[0]) { $fixme = 1 ; }
357                        if ( grep /todo/, $tag->[1]) { $fixme = 1 ; }
358                        if ($tag->[0] eq "building") { $building = 1 ; }
359                        if ($tag->[0] eq "addr:housenumber") { $number = $tag->[1] ; }
360                }
361       
362        }
363
364        if ($building) { drawWay ("gray", 1, nodes2Coordinates(@wayNodes)) ; }
365        if ($building and ($number != 0) ) { drawTextPos ($lon{$wayNodes[0]}, $lat{$wayNodes[0]}, 0, 0, $number, "black", 1) ; }
366
367        if ($fixme) { 
368                drawWay ($colorFixme, 3, nodes2Coordinates(@wayNodes)) ; 
369#               print "fixme way found\n" ;
370        }
371
372        if ( ( ($residential) and ($name eq "") ) or
373                ( ($linking) and ($ref eq "") ) or
374                ( ($track) and ($tracktype eq "") ) ) { 
375                        drawWay ($colorName, 3, nodes2Coordinates(@wayNodes)) ; 
376                        my $index = int ($#wayNodes / 2) ;
377                        my $code = substr ($wayId, -4) ;
378                        drawTextPos ($lon{$wayNodes[$index]}, $lat{$wayNodes[$index]}, 0, 0, $code, $colorName, 2) ; 
379        }
380
381
382#       if ( ($linking) and ($ref eq "") ) { drawWay ($colorName, 3, nodes2Coordinates(@wayNodes)) ; }
383#       if ( ($track) and ($tracktype eq "") ) { drawWay ($colorName, 3, nodes2Coordinates(@wayNodes)) ; }
384               
385
386
387        # STUBS, 3 DOTS
388
389        if ($highway) {
390                my $stub = 0 ;
391                if (scalar @wayNodes > 3) {
392                        my ($dist1) = distance ($lon{$wayNodes[0]}, $lat{$wayNodes[0]}, $lon{$wayNodes[1]}, $lat{$wayNodes[1]}) + 
393                                        distance ($lon{$wayNodes[1]}, $lat{$wayNodes[1]}, $lon{$wayNodes[2]}, $lat{$wayNodes[2]}) ;
394                        if ( ($dist1 < $maxDistStub) and ($ways{$wayNodes[0]} == 1) ) { $stub = 1 ; }
395                        $dist1 = distance ($lon{$wayNodes[-1]}, $lat{$wayNodes[-1]}, $lon{$wayNodes[-2]}, $lat{$wayNodes[-2]}) + 
396                                        distance ($lon{$wayNodes[-2]}, $lat{$wayNodes[-2]}, $lon{$wayNodes[-3]}, $lat{$wayNodes[-3]}) ;
397                        if ( ($dist1 < $maxDistStub) and ($ways{$wayNodes[-1]} == 1) ) { $stub = 1 ; }
398
399                }
400                my $length = 0 ;
401                my $i ;
402                for ($i = 0; $i<$#wayNodes; $i++) {
403                        $length += distance ($lon{$wayNodes[$i]}, $lat{$wayNodes[$i]}, $lon{$wayNodes[$i+1]}, $lat{$wayNodes[$i+1]}) ;
404                }
405                if  ( ($length < $minLength)  and ( ($ways{$wayNodes[0]} == 1)  or ($ways{$wayNodes[-1]} == 1) ) ) { $stub = 1 ; }
406
407                if ($stub == 1) {
408                        drawWay ($colorStub, 3, nodes2Coordinates(@wayNodes)) ;
409#                       drawNodeDot ($lon{$wayNodes[0]}, $lat{$wayNodes[0]}, $colorStub, 3) ;
410#                       drawNodeDot ($lon{$wayNodes[-1]}, $lat{$wayNodes[-1]}, $colorStub, 3) ;
411                }
412        }       
413       
414        ($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
415        if ($wayId != -1) {
416                @wayNodes = @$aRef1 ;
417                @wayTags = @$aRef2 ;
418        }
419}
420
421closeOsmFile () ;
422
423
424
425
426# PROCESS GPX FILE
427
428my $success ;
429$success = open ($gpxFile, "<", $gpxName) ;
430my $line ;
431if ($success) {
432        print "\nprocessing file: $gpxName\n" ;
433        while ($line = <$gpxFile>) {
434                if (grep /<wpt/, $line) {
435                        # if inside box draw bug!
436                        my ($lon) = ($line =~ /^\.*\<wpt lon=[\'\"]([-\d,\.]+)[\'\"]/) ;
437                        my ($lat) = ($line =~ /^.*\lat=[\'\"]([-\d,\.]+)[\'\"]/) ;
438                        my ($desc) = ($line =~ /<desc>(.+)<\/desc>/) ;
439        #               print $lon, "\n" ;
440        #               print $lat, "\n" ;
441        #               print $desc, "\n" ;
442                        if ( (defined $lon) and (defined $lat) and (defined $desc) ) {
443                                if ( ($lon > $lonMin) and ($lon < $lonMax) and ($lat > $latMin) and ($lat < $latMax) ) {
444                                        $desc =~ s/<!\[CDATA\[// ;
445                                        $desc =~ s/\]\]>// ;
446                                        drawNodeDot ($lon, $lat, $colorBug, 5) ;
447                                        drawTextPos ($lon, $lat, 0, 0, $desc, "black", 2) 
448                                }
449                        }
450                }
451        }
452        close ($gpxFile) ;
453}
454else {
455        print "\nNOT processing file: $gpxName\n" ;
456}
457
458# PROCESS ROUTE FILE
459
460
461$success = open ($routeFile, "<", $routeName) ;
462my $first = 1 ;
463my $lastLon ;
464my $lastLat ;
465if ($success) {
466        print "\nprocessing file: $routeName\n" ;
467        while ($line = <$routeFile>) {
468                if (grep /<rtept/, $line) {
469        #               print $line, "\n" ;
470                        # if inside box draw bug!
471                        my ($lon) = ($line =~ /^.*\lon=[\'\"]([-\d,\.]+)[\'\"]/) ;
472                        my ($lat) = ($line =~ /^.*\lat=[\'\"]([-\d,\.]+)[\'\"]/) ;
473        #               print $lon, "\n" ;
474        #               print $lat, "\n" ;
475        #               print $desc, "\n" ;
476                        if ( (defined $lon) and (defined $lat) ) {
477                                if ( ($lon > $lonMin) and ($lon < $lonMax) and ($lat > $latMin) and ($lat < $latMax) ) {
478                                        if ($first) {
479                                                $first = 0 ;
480                                                $lastLon = $lon ;
481                                                $lastLat = $lat ;
482                                        }
483                                        else {
484                                                drawWay ($colorRoute, 2, $lastLon, $lastLat, $lon, $lat) ; 
485        #                                       print "$lastLon, $lastLat, $lon, $lat\n" ;
486                                                $lastLon = $lon ;
487                                                $lastLat = $lat ;
488                                        }
489                                }
490                        }
491                }
492        }
493        close ($routeFile) ;
494}
495else {
496        print "\nNOT processing file: $routeName\n" ;
497}
498
499
500# DRAW OTHER INFORMATION
501
502print "draw other information...\n" ;
503
504drawLegend (3, "Route", $colorRoute, "Stub", $colorStub, "Fixme etc.", $colorFixme, "No name, ref, type", $colorName, "Bug", $colorBug) ;
505drawRuler ("darkgray") ;
506drawHead ("gary68's todo map", "black", 2) ;
507drawFoot ("data by www.openstreetmap.org", "gray", 2) ;
508
509
510
511
512
513
514
515
516writeGraph ($pngName) ;
517
518my $svgName = $pngName ; $svgName =~ s/.png/.svg/ ;
519writeSVG ($svgName) ;
520
521$time1 = time() ;
522print "\n$programName finished after ", stringTimeSpent ($time1-$time0), "\n\n" ;
523
524
525sub nodes2Coordinates {
526#
527# transform list of nodeIds to list of lons/lats
528#
529        my @nodes = @_ ;
530        my $i ;
531        my @result = () ;
532
533        #print "in @nodes\n" ;
534
535        for ($i=0; $i<=$#nodes; $i++) {
536                push @result, $lon{$nodes[$i]} ;
537                push @result, $lat{$nodes[$i]} ;
538        }
539        return @result ;
540}
541
Note: See TracBrowser for help on using the repository browser.