source: subversion/applications/utils/gary68/onewaycheck.pl @ 19195

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

1.1 of oneway check. now with gpx support, lower need of memory.

  • Property svn:executable set to *
File size: 9.6 KB
Line 
1#
2# onewaycheck by gary68
3#
4#
5# Copyright (C) 2009, 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
17use strict ;
18use warnings ;
19
20use OSM::osm ;
21use File::stat;
22use Time::localtime;
23
24my $programName = "onewaycheck" ; 
25my $usage = "onewaycheck.pl file.osm out.htm" ;
26my $version = "1.1" ;
27
28my $wayId ;
29my $wayUser ;
30my @wayNodes ;
31my @wayTags ;
32my $nodeId ;
33my $nodeUser ;
34my $nodeLat ;
35my $nodeLon ;
36my @nodeTags ;
37my $aRef1 ;
38my $aRef2 ;
39my $wayCount = 0 ;
40
41my $oneway ;
42my $reverse ;
43my $problems = 0 ;
44my $numCritical = 0 ;
45
46my %to = () ;
47my %from = () ;
48my %wayNodeNumber = () ;
49my %nodeWays = () ;
50my %neededWayNodes = () ;
51
52my %criticalNodes = () ;
53my %nodesLon ;
54my %nodesLat ;
55
56my $time0 = time() ;
57my $time1 ;
58my $i ;
59my $key ;
60my $num ;
61my $oneways = 0 ;
62
63my $APIcount = 0 ;
64my $APIerrors = 0 ;
65my $APIrejections = 0 ;
66
67my $html ;
68my $gpx ;
69my $osmName ;
70my $htmlName ;
71
72
73###############
74# get parameter
75###############
76$osmName = shift||'';
77if (!$osmName)
78{
79        die (print $usage, "\n");
80}
81
82$htmlName = shift||'';
83if (!$htmlName)
84{
85        die (print $usage, "\n");
86}
87
88my $gpxName = $htmlName ;
89$gpxName =~ s/htm/gpx/ ;
90
91
92print "\n$programName $version for file $osmName\n" ;
93
94#####################
95# open and init files
96#####################
97
98openOsmFile ($osmName) ;
99
100
101######################
102# skip all nodes first
103######################
104print $programName, " ", $osmName, " pass0: skipping nodes...\n" ;
105skipNodes () ;
106
107
108#######################################
109#
110#######################################
111print $programName, " ", $osmName, " pass0: processing ways...\n" ;
112($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
113if ($wayId != -1) {
114        @wayNodes = @$aRef1 ;
115        @wayTags = @$aRef2 ;
116}
117
118while ($wayId != -1) {
119        if (scalar (@wayNodes) >= 2) {
120                $oneway = 0 ; my $highway = 0 ;
121                foreach (@wayTags) {
122                        if ($_->[0] eq "highway") { $highway = 1 ; } 
123                        if ($_->[0] eq "oneway") { $oneway = 1 ; }
124                }
125                if (($highway == 1) and ($oneway == 1) ) { 
126                        $oneways++ ;
127                        foreach my $node (@wayNodes) {
128                                $neededWayNodes{$node} = 1 ;
129                        }
130                }
131        }
132        else {
133                #print "invalid way (one node only): ", $wayId, "\n" ;
134        }
135
136        ($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
137        if ($wayId != -1) {
138                @wayNodes = @$aRef1 ;
139                @wayTags = @$aRef2 ;
140        }
141}
142
143closeOsmFile () ;
144
145print "$oneways oneways found.\n" ;
146
147openOsmFile ($osmName) ;
148
149
150######################
151# skip all nodes first
152######################
153print $programName, " ", $osmName, " pass1: skipping nodes...\n" ;
154skipNodes () ;
155
156
157#######################################
158#
159#######################################
160print $programName, " ", $osmName, " pass1: processing ways...\n" ;
161$oneway = 0 ;
162$reverse = 0 ;
163($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
164if ($wayId != -1) {
165        @wayNodes = @$aRef1 ;
166        @wayTags = @$aRef2 ;
167}
168
169while ($wayId != -1) {
170        $wayCount++ ;
171
172        if (scalar (@wayNodes) >= 2) {
173                $oneway = 0 ; $reverse = 0 ; my $highway = 0 ;
174                foreach (@wayTags) {
175                        if ($_->[0] eq "highway") { $highway = 1 ; } 
176                        if ($_->[0] eq "amenity" and $_->[1] eq "parking" ) { $highway = 1 ; } 
177                        if ($_->[0] eq "oneway" and $_->[1] eq "true") { $oneway = 1 ; }
178                        if ($_->[0] eq "oneway" and $_->[1] eq "false") { $oneway = 0 ; }
179                        if ($_->[0] eq "oneway" and $_->[1] eq "yes") { $oneway = 1 ; }
180                        if ($_->[0] eq "oneway" and $_->[1] eq "no") { $oneway = 0 ; }
181                        if ($_->[0] eq "oneway" and $_->[1] eq "1") { $oneway = 1 ; }
182                        if ($_->[0] eq "oneway" and $_->[1] eq "-1") { $oneway = 1 ; $reverse = 1 ; }
183                }
184                if ($highway) {
185                        if ( ($oneway) and ($reverse)) { @wayNodes = reverse @wayNodes ; } 
186       
187                        for (my $i = 0; $i <= $#wayNodes; $i++) {
188                                if (defined $neededWayNodes{$wayNodes[$i]}) {
189                                        $to{$wayNodes[$i]} ++ ;
190                                        $from{$wayNodes[$i]} ++ ;
191                                        push @{$nodeWays{$wayNodes[$i]}}, $wayId ;
192                                        $wayNodeNumber{$wayId} = scalar (@wayNodes) ;
193                                        if ( ($i == 0) and ($oneway) ) {
194                                                $to{$wayNodes[$i]} -- ;
195                                        }
196                                        if ( ($i == $#wayNodes) and ($oneway) ) {
197                                                $from{$wayNodes[$i]} -- ;
198                                        }
199                                }
200                        }               
201                }
202        }
203        else {
204                #print "invalid way (one node only): ", $wayId, "\n" ;
205        }
206
207        ($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
208        if ($wayId != -1) {
209                @wayNodes = @$aRef1 ;
210                @wayTags = @$aRef2 ;
211        }
212}
213
214closeOsmFile () ;
215
216#####################
217# find critical nodes
218#####################
219print $programName, " ", $osmName, " pass1: find critical nodes...\n" ;
220%criticalNodes = () ;
221
222foreach my $key (keys %to) {
223        my $allWaysOK = 1 ;
224        if (($to{$key} > 0) and ($from{$key} == 0)) {
225                foreach my $wayId (@{$nodeWays{$key}}) {
226                        my $APIok = 1 ;
227                        # print "request API data for way $wayId...\n" ;
228                        $APIcount++ ;
229                        sleep (1) ; # don't stress API
230                        my ($id, $u, @nds, @tags, $ndsRef, $tagRef) ;
231                        ($id, $u, $ndsRef, $tagRef) = APIgetWay ($wayId) ;
232                        # print "API request finished.\n" ;
233                        @nds = @$ndsRef ; @tags = @$tagRef ;
234                        if ($id == 0) { $APIerrors++ ; }
235                        if ( ( $wayNodeNumber{$wayId} != scalar @nds) and ($wayId == $id) ) { 
236                                $APIok = 0 ;
237                                $APIrejections++ ;
238                                # print "WARNING: $key ignored because way node count of osm file not equal to API node count\n" ;
239                        }
240                        if ($APIok == 0) { $allWaysOK = 0 ; }
241                }
242
243                if ($allWaysOK == 1) { 
244                        $criticalNodes{$key} = 1 ;
245                }
246        }
247}
248
249
250######################
251# get node information
252######################
253print $programName, " ", $osmName, " pass2: get node information...\n" ;
254openOsmFile ($osmName) ;
255
256($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
257if ($nodeId != -1) {
258        #@nodeTags = @$aRef1 ;
259}
260
261while ($nodeId != -1) {
262        #print "test nodeID $nodeId\n" ;
263        if (defined $criticalNodes{$nodeId}) {
264                $nodesLon{$nodeId} = $nodeLon ;
265                $nodesLat{$nodeId} = $nodeLat ;
266                #print "node info read $nodeLon $nodeLat\n" ;
267        }
268
269        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
270        if ($nodeId != -1) {
271                #@nodeTags = @$aRef1 ;
272        }
273}
274
275closeOsmFile () ;
276print $programName, " ", $osmName, " pass2: nodes read...\n" ;
277
278
279
280
281$time1 = time () ;
282
283
284#######################
285# print info to console
286#######################
287
288print "\n", $programName, " ", $osmName, " number ways: $wayCount\n" ;
289$numCritical = scalar (keys %criticalNodes) ;
290print $programName, " ", $osmName, " critical nodes: ", $numCritical, "\n\n" ;
291print $programName, " ", $osmName, " write HTML tables...\n" ;
292
293
294
295
296##############################
297# PRINT HTML / GPX INFOS NODES
298##############################
299open ($gpx, ">", $gpxName) || die ("Can't open gpx output file") ;
300printGPXHeader ($gpx) ;
301
302
303open ($html, ">", $htmlName) || die ("Can't open html output file") ;
304printHTMLHeader ($html, "OnewayCheck by Gary68") ;
305print $html "<H1>OnewayCheck by Gary68</H1>\n" ;
306print $html "<p>Version ", $version, "</p>\n" ;
307print $html "<H2>Statistics</H2>\n" ;
308print $html "<p>", stringFileInfo ($osmName), "</p>\n" ;
309print $html "<p>number ways: $wayCount<br>\n" ;
310$numCritical = scalar (keys %criticalNodes) ;
311print $html "critical nodes: ", $numCritical, "</p>\n" ;
312print $html "<p>$APIcount API calls</p>" ;
313print $html "<p>$APIerrors API errors</p>" ;
314print $html "<p>$APIrejections API rejections</p>" ;
315
316print $html "<H2>Critical Nodes</H2>\n" ;
317print $html "<table border=\"1\">\n";
318print $html "<tr>\n" ;
319print $html "<th>Line</th>\n" ;
320print $html "<th>NodeId</th>\n" ;
321# print $html "<th>Ways</th>\n" ;
322print $html "<th>OSM</th>\n" ;
323print $html "<th>OSB</th>\n" ;
324print $html "<th>JOSM</th>\n" ;
325print $html "<th>Mapnik</th>\n" ;
326print $html "<th>Osmarender</th>\n" ;
327print $html "</tr>\n" ;
328$i = 0 ;
329#print @criticalNodes, "\n" ;
330foreach $nodeId (keys %criticalNodes) {
331        $i++ ;
332        print $html "<tr>\n" ;
333        print $html "<td>", $i , "</td>\n" ;
334        print $html "<td>", historyLink ("node", $nodeId) , "</td>\n" ;
335
336#       print $html "<td>" ;
337#       foreach (@{$endNodeWays{$nodeId}}) {
338#               print $html historyLink ("way", $_), " " ;
339#       }
340#       print $html "</td>\n" ;
341
342        print $html "<td>", osmLink ($nodesLon{$nodeId}, $nodesLat{$nodeId}, 16) , "</td>\n" ;
343        print $html "<td>", osbLink ($nodesLon{$nodeId}, $nodesLat{$nodeId}, 16) , "</td>\n" ;
344        print $html "<td>", josmLinkSelectNode ($nodesLon{$nodeId}, $nodesLat{$nodeId}, 0.01, $nodeId), "</td>\n" ;
345        print $html "<td>", picLinkMapnik ($nodesLon{$nodeId}, $nodesLat{$nodeId}, 16), "</td>\n" ;
346        print $html "<td>", picLinkOsmarender ($nodesLon{$nodeId}, $nodesLat{$nodeId}, 16), "</td>\n" ;
347        print $html "</tr>\n" ;
348
349        # GPX
350        my $text = "OnewayCheck - " . $nodeId . " problem with oneway road" ;
351        printGPXWaypoint ($gpx, $nodesLon{$nodeId}, $nodesLat{$nodeId}, $text) ;
352
353}
354print $html "</table>\n" ;
355print $html "<p>$i lines total</p>\n" ;
356
357
358
359
360print $html "<p>", stringTimeSpent ($time1-$time0), "</p>\n" ;
361
362
363########
364# FINISH
365########
366
367printHTMLFoot ($html) ;
368close ($html) ;
369
370printGPXFoot ($gpx) ;
371close ($gpx) ;
372
373print "\n$APIcount API calls\n" ;
374print "$APIerrors API errors\n" ;
375print "$APIrejections API rejections\n" ;
376
377print $programName, " ", $osmName, " FINISHED after ", stringTimeSpent ($time1-$time0), "\n\n" ;
378
Note: See TracBrowser for help on using the repository browser.