source: subversion/applications/utils/gary68/motorwaycheck.pl @ 24893

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

initial upload of several programs

  • Property svn:executable set to *
File size: 9.3 KB
Line 
1#
2# motorwaycheck by gary68
3#
4#
5# Copyright (C) 2008, Gerhard Schwanz
6#
7# 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
8# Free Software Foundation; either version 3 of the License, or (at your option) any later version.
9#
10# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>
14#
15#
16# Version 1.1 / 1.2
17# - stat
18#
19
20use strict ;
21use warnings ;
22
23use OSM::osm ;
24use File::stat;
25use Time::localtime;
26
27my $programName = "motorwaycheck" ; 
28my $usage = "motorwaycheck.pl file.osm out.htm" ;
29my $version = "1.2" ;
30
31my $wayId ;
32my $wayUser ;
33my @wayNodes ;
34my @wayTags ;
35my $nodeId ;
36my $nodeUser ;
37my $nodeLat ;
38my $nodeLon ;
39my @nodeTags ;
40my $aRef1 ;
41my $aRef2 ;
42my $wayCount = 0 ;
43
44my $motorway ;
45my $onewayTag ;
46my $onewayTagWrong ;
47my $reverse ;
48my $problems = 0 ;
49my $motorways = 0 ;
50my $numCritical = 0 ;
51
52my @onewayProblems ;
53my %endNodeWays ;
54my @criticalNodes = () ;
55my %nodesLon ;
56my %nodesLat ;
57
58my $time0 = time() ;
59my $time1 ;
60my $i ;
61my $key ;
62my $num ;
63
64my $html ;
65my $osmName ;
66my $htmlName ;
67
68
69###############
70# get parameter
71###############
72$osmName = shift||'';
73if (!$osmName)
74{
75        die (print $usage, "\n");
76}
77
78$htmlName = shift||'';
79if (!$htmlName)
80{
81        die (print $usage, "\n");
82}
83
84print "\n$programName $version for file $osmName\n" ;
85
86#####################
87# open and init files
88#####################
89
90openOsmFile ($osmName) ;
91
92open ($html, ">", $htmlName) || die ("Can't open html output file") ;
93printHTMLHeader ($html, "MotorwayCheck by Gary68") ;
94print $html "<H1>MotorwayCheck by Gary68</H1>\n" ;
95print $html "<p>Version ", $version, "</p>\n" ;
96print $html "<H2>Statistics</H2>\n" ;
97print $html "<p>", stringFileInfo ($osmName), "</p>\n" ;
98
99
100######################
101# skip all nodes first
102######################
103print $programName, " ", $osmName, " pass1: skipping nodes...\n" ;
104skipNodes () ;
105
106
107#######################################
108# check for missing/invalid oneway tags
109#######################################
110print $programName, " ", $osmName, " pass1: processing ways...\n" ;
111$motorway = 0 ;
112$onewayTag = 0 ;
113$onewayTagWrong = 0 ;
114$reverse = 0 ;
115($wayId, $wayUser, $aRef1, $aRef2) = getWay () ;
116if ($wayId != -1) {
117        @wayNodes = @$aRef1 ;
118        @wayTags = @$aRef2 ;
119}
120
121while ($wayId != -1) {
122        $wayCount++ ;
123
124        if (scalar (@wayNodes) >= 2) {
125
126                foreach (@wayTags) {
127                        if ($_ eq "highway:motorway") { $motorway = 1 ; }
128                        if ($_ eq "oneway:true") { $onewayTag = 1 ; }
129                        if ($_ eq "oneway:false") { $onewayTag = 1 ; }
130                        if ($_ eq "oneway:yes") { $onewayTag = 1 ; }
131                        if ($_ eq "oneway:no") { $onewayTag = 1 ; }
132                        if ($_ eq "oneway:1") { $onewayTag = 1 ; }
133                        if ($_ eq "oneway:-1") { $onewayTag = 1 ; $reverse = 1 ; }
134                        if ( (grep /oneway/, $_) and ($onewayTag == 0) ) { $onewayTagWrong = 1 ; }
135                }
136                if ($motorway == 1) { $motorways++ ;} 
137
138                if (($motorway == 1) and ($onewayTagWrong == 1)) {
139                        $problems++ ;
140                        push @onewayProblems, $wayId ;
141                        #print $wayId, "\n" ;
142                }
143
144                if ($motorway == 1) {
145                        my $start = $wayNodes[0] ;
146                        my $end = $wayNodes[-1] ;
147                        if ($reverse == 1) { $end = $start ; }
148                        push @{$endNodeWays{$end}}, $wayId ;
149                }
150        }
151        else {
152                #print "invalid way (one node only): ", $wayId, "\n" ;
153        }
154
155        $motorway = 0 ;
156        $onewayTag = 0 ;
157        $onewayTagWrong = 0 ;
158        $reverse = 0 ;
159        ($wayId, $wayUser, $aRef1, $aRef2) = getWay () ;
160        if ($wayId != -1) {
161                @wayNodes = @$aRef1 ;
162                @wayTags = @$aRef2 ;
163        }
164}
165
166closeOsmFile () ;
167
168#####################
169# find critical nodes
170#####################
171print $programName, " ", $osmName, " pass1: find critical nodes...\n" ;
172@criticalNodes = () ;
173foreach $key (keys %endNodeWays) {
174        my ($num) = scalar (@{$endNodeWays{$key}}) ;
175        #print $key, " ", $num, " " ;
176        if ($num > 1) {
177                push @criticalNodes, $key ;
178                #print "node pushed" ;
179        }
180        #print "\n" ;
181}
182
183#foreach (@criticalNodes) {
184#       print "critical $_\n" ;
185#}
186
187
188######################
189# get node information
190######################
191print $programName, " ", $osmName, " pass2: get node information...\n" ;
192openOsmFile ($osmName) ;
193
194($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode () ;
195if ($nodeId != -1) {
196        #@nodeTags = @$aRef1 ;
197}
198
199while ($nodeId != -1) {
200        #print "test nodeID $nodeId\n" ;
201        foreach (@criticalNodes) {
202                if ($_ == $nodeId) {
203                        $nodesLon{$nodeId} = $nodeLon ;
204                        $nodesLat{$nodeId} = $nodeLat ;
205                        #print "node info read $nodeLon $nodeLat\n" ;
206                }
207        }
208
209        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode () ;
210        if ($nodeId != -1) {
211                #@nodeTags = @$aRef1 ;
212        }
213}
214
215closeOsmFile () ;
216print $programName, " ", $osmName, " pass2: nodes read...\n" ;
217
218
219
220
221$time1 = time () ;
222
223
224#######################
225# print info to console
226#######################
227
228print "\n", $programName, " ", $osmName, " number ways: $wayCount\n" ;
229print $programName, " ", $osmName, " number motorways: $motorways\n" ;
230print $programName, " ", $osmName, " oneway tag invalid problems: $problems\n" ;
231$numCritical = scalar (@criticalNodes) ;
232print $programName, " ", $osmName, " critical nodes: ", $numCritical, "\n\n" ;
233
234print $programName, " ", $osmName, " write HTML tables...\n" ;
235
236
237print $html "<p>number ways: $wayCount<br>\n" ;
238print $html "number motorways: $motorways<br>\n" ;
239print $html "oneway tag invalid: $problems<br>" ;
240$numCritical = scalar (@criticalNodes) ;
241print $html "critical nodes: ", $numCritical, "</p>\n" ;
242
243
244#######################
245# PRINT HTML INFOS TAGS
246#######################
247print $html "<H2>Oneway tag invalid according to Map Features</H2>\n" ;
248print $html "<table border=\"1\">\n";
249print $html "<tr>\n" ;
250print $html "<th>Line</th>\n" ;
251print $html "<th>WayId</th>\n" ;
252#print $html "<th>OSM</th>\n" ;
253#print $html "<th>OSB</th>\n" ;
254#print $html "<th>JOSM</th>\n" ;
255print $html "</tr>\n" ;
256$i = 0 ;
257foreach $wayId (@onewayProblems) {
258        $i++ ;
259        print $html "<tr>\n" ;
260        print $html "<td>", $i , "</td>\n" ;
261        print $html "<td>", historyLink ("way", $wayId) , "</td>\n" ;
262        print $html "</tr>\n" ;
263}
264print $html "</table>\n" ;
265print $html "<p>$i lines total</p>\n" ;
266
267
268########################
269# PRINT HTML INFOS NODES
270########################
271print $html "<H2>Critical Nodes</H2>\n" ;
272print $html "<p>At these nodes more than one motorway has an end node. Maybe wrong oneway tags, direction wrong or highway doubly mapped!</p>" ;
273print $html "<table border=\"1\">\n";
274print $html "<tr>\n" ;
275print $html "<th>Line</th>\n" ;
276print $html "<th>NodeId</th>\n" ;
277print $html "<th>Ways</th>\n" ;
278print $html "<th>OSM</th>\n" ;
279print $html "<th>OSB</th>\n" ;
280print $html "<th>JOSM</th>\n" ;
281print $html "<th>Mapnik</th>\n" ;
282print $html "<th>Osmarender</th>\n" ;
283print $html "</tr>\n" ;
284$i = 0 ;
285#print @criticalNodes, "\n" ;
286foreach $nodeId (@criticalNodes) {
287        $i++ ;
288        print $html "<tr>\n" ;
289        print $html "<td>", $i , "</td>\n" ;
290        print $html "<td>", historyLink ("node", $nodeId) , "</td>\n" ;
291
292        print $html "<td>" ;
293        foreach (@{$endNodeWays{$nodeId}}) {
294                print $html historyLink ("way", $_), " " ;
295        }
296        print $html "</td>\n" ;
297
298        print $html "<td>", osmLink ($nodesLon{$nodeId}, $nodesLat{$nodeId}, 16) , "</td>\n" ;
299        print $html "<td>", osbLink ($nodesLon{$nodeId}, $nodesLat{$nodeId}, 16) , "</td>\n" ;
300        print $html "<td>", josmLink ($nodesLon{$nodeId}, $nodesLat{$nodeId}, 0.01, ${$endNodeWays{$nodeId}}[0]), "</td>\n" ;
301        print $html "<td>", picLinkMapnik ($nodesLon{$nodeId}, $nodesLat{$nodeId}, 16), "</td>\n" ;
302        print $html "<td>", picLinkOsmarender ($nodesLon{$nodeId}, $nodesLat{$nodeId}, 16), "</td>\n" ;
303        print $html "</tr>\n" ;
304}
305print $html "</table>\n" ;
306print $html "<p>$i lines total</p>\n" ;
307
308
309
310
311print $html "<p>", stringTimeSpent ($time1-$time0), "</p>\n" ;
312
313
314########
315# FINISH
316########
317
318printHTMLFoot ($html) ;
319close ($html) ;
320
321statistics ( ctime(stat($osmName)->mtime),  $programName,  "motorway", $osmName,  $motorways,  $i) ;
322
323print $programName, " ", $osmName, " FINISHED after ", stringTimeSpent ($time1-$time0), "\n\n" ;
324
325sub statistics {
326        my ($date, $program, $def, $area, $total, $errors) = @_ ;
327        my $statfile ; my ($statfileName) = "statistics.csv" ;
328
329        if (grep /\.bz2/, $area) { $area =~ s/\.bz2// ; }
330        if (grep /\.osm/, $area) { $area =~ s/\.osm// ; }
331        my ($area2) = ($area =~ /.+\/([\w\-]+)$/ ) ;
332
333        if (grep /\.xml/, $def) { $def =~ s/\.xml// ; }
334        my ($def2) = ($def =~ /([\w\d\_]+)$/ ) ;
335
336        my ($success) = open ($statfile, "<", $statfileName) ;
337
338        if ($success) {
339                print "statfile found. writing stats...\n" ;
340                close $statfile ;
341                open $statfile, ">>", $statfileName ;
342                printf $statfile "%02d.%02d.%4d;", localtime->mday(), localtime->mon()+1, localtime->year() + 1900 ;
343                printf $statfile "%02d/%02d/%4d;", localtime->mon()+1, localtime->mday(), localtime->year() + 1900 ;
344                print $statfile $date, ";" ;
345                print $statfile $program, ";" ;
346                print $statfile $def2, ";" ;
347                print $statfile $area2, ";" ;
348                print $statfile $total, ";" ;
349                print $statfile $errors ;
350                print $statfile "\n" ;
351                close $statfile ;
352        }
353        return ;
354}
Note: See TracBrowser for help on using the repository browser.