source: subversion/applications/utils/gary68/checkround.pl

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

initial upload of several programs

  • Property svn:executable set to *
File size: 8.1 KB
Line 
1#
2# roundabout check by gary68
3#
4#
5#
6#
7# Copyright (C) 2008, 2009, 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# 1.0
19#
20
21
22
23use strict ;
24use warnings ;
25
26use OSM::osm ;
27use File::stat;
28use Time::localtime;
29
30
31
32my $program = "checkround.pl" ;
33my $version = "1.0" ;
34my $usage = $program . " <direction> file.osm out.htm out.gpx // direction = [L|R]" ;
35
36my $wayId ;
37my $wayId2 ;
38my $wayUser ;
39my @wayNodes ;
40my @wayTags ;
41my $nodeId ;
42my $nodeId2 ;
43my $nodeUser ;
44my $nodeLat ;
45my $nodeLon ;
46my @nodeTags ;
47my $aRef1 ;
48my $aRef2 ;
49my $wayCount = 0 ;
50my $roundaboutCount = 0 ;
51my $onewayCount = 0 ;
52my $onewayWrongCount = 0 ;
53
54my $time0 = time() ; my $time1 ;
55my $i ;
56my $key ;
57my $num ;
58my $tag1 ; my $tag2 ;
59my $direction = "" ;
60
61my $html ;
62my $gpx ;
63my $osmName ;
64my $htmlName ;
65my $gpxName ;
66
67
68my @roundabouts ;
69my @wrong ;
70my @neededNodes ;
71my %neededNodesHash ;
72my %lon ;
73my %lat ;
74my %wayStart ;
75my %wayEnd ;
76my %roundaboutTags ;
77my %roundaboutNodes ;
78
79
80###############
81# get parameter
82###############
83$direction = shift||'';
84if (!$direction)
85{
86        $direction = "L" ;
87}
88
89$osmName = shift||'';
90if (!$osmName)
91{
92        die (print $usage, "\n");
93}
94
95$htmlName = shift||'';
96if (!$htmlName)
97{
98        die (print $usage, "\n");
99}
100
101$gpxName = shift||'';
102if (!$gpxName)
103{
104        die (print $usage, "\n");
105}
106
107print "\n$program $version for file $osmName\n\n" ;
108print "\n\n" ;
109
110
111
112
113
114######################
115# skip all nodes first
116######################
117openOsmFile ($osmName) ;
118print "INFO: pass1: skipping nodes...\n" ;
119skipNodes () ;
120
121
122######################
123# identify roundabouts
124######################
125print "INFO: pass1: find roundabouts...\n" ;
126($wayId, $wayUser, $aRef1, $aRef2) = getWay () ;
127if ($wayId != -1) {
128        @wayNodes = @$aRef1 ;
129        @wayTags = @$aRef2 ;
130}
131while ($wayId != -1) { 
132        $wayCount++ ;
133
134        my $found = 0 ;
135        my $reverse = 0 ;
136        foreach $tag1 (@wayTags) {
137                if ($tag1 eq "junction:roundabout") { $found = 1 ; }
138                if ($tag1 eq "highway:mini_roundabout") { $found = 1 ; }
139                if ($tag1 eq "oneway-1") { $reverse = 1 ; }
140        }
141
142        if ($found and (scalar @wayNodes > 2) ) { 
143                $roundaboutCount++ ;
144                push @roundabouts, $wayId ;
145                $wayStart{$wayId} = $wayNodes[0] ; 
146                $wayEnd{$wayId} = $wayNodes[-1] ; 
147                @{$roundaboutTags{$wayId}} = @wayTags ;
148                if ($reverse) { @wayNodes = reverse @wayNodes ; }
149                @{$roundaboutNodes{$wayId}} = @wayNodes ;
150        }
151
152        # next way
153        ($wayId, $wayUser, $aRef1, $aRef2) = getWay () ;
154        if ($wayId != -1) {
155                @wayNodes = @$aRef1 ;
156                @wayTags = @$aRef2 ;
157        }
158}
159
160closeOsmFile () ;
161
162print "INFO: number total ways: $wayCount\n" ;
163print "INFO: number roundabouts: $roundaboutCount\n" ;
164
165
166
167######################
168# collect needed nodes
169######################
170print "INFO: pass2: collect needed nodes...\n" ;
171foreach $wayId (@roundabouts) {
172        push @neededNodes, @{$roundaboutNodes{$wayId}} ;
173}
174
175
176######################
177# get node information
178######################
179print "INFO: pass2: get node information...\n" ;
180openOsmFile ($osmName) ;
181
182foreach (@neededNodes) { $neededNodesHash{$_} = 1 ; }
183
184($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode () ;
185if ($nodeId != -1) {
186        #@nodeTags = @$aRef1 ;
187}
188
189while ($nodeId != -1) {
190
191        if (exists ($neededNodesHash{$nodeId}) ) { 
192                $lon{$nodeId} = $nodeLon ; $lat{$nodeId} = $nodeLat
193        }
194
195        # next
196        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode () ;
197        if ($nodeId != -1) {
198                #@nodeTags = @$aRef1 ;
199        }
200}
201
202closeOsmFile () ;
203
204$time1 = time () ;
205
206foreach $wayId (@roundabouts) {
207
208                # angle (x1,y1,x2,y2)                                   > angle (N=0,E=90...)
209                my $node0 = @{$roundaboutNodes{$wayId}}[0] ;
210                my $node1 = @{$roundaboutNodes{$wayId}}[1] ; 
211                my $node2 = @{$roundaboutNodes{$wayId}}[2] ; 
212               
213                my $angle1 = angle ($lon{$node0}, $lat{$node0}, $lon{$node1}, $lat{$node1}) ; 
214                my $angle2 = angle ($lon{$node1}, $lat{$node1}, $lon{$node2}, $lat{$node2}) ; 
215                my $angleDelta = $angle2 - $angle1 ;
216                # print "$wayId $angle1 $angle2 $angleDelta\n" ;
217                if ($angleDelta > 180) { $angleDelta = $angleDelta - 360 ; }
218                if ($angleDelta < -180) { $angleDelta = $angleDelta + 360 ; }
219                if (    ( ($direction eq "L") and ($angleDelta > 0) ) or
220                        ( ($direction eq "R") and ($angleDelta < 0)) ) {
221                        $onewayWrongCount ++ ;
222                        push @wrong, $wayId ;
223                }
224}
225print "INFO: number wrong roundabouts: $onewayWrongCount\n" ;
226
227######################
228# PRINT HTML/GPX INFOS
229######################
230print "\nINFO: write HTML tables...\n" ;
231
232open ($html, ">", $htmlName) || die ("Can't open html output file") ;
233open ($gpx, ">", $gpxName) || die ("Can't open gpx output file") ;
234
235printHTMLHeader ($html, "$program by Gary68") ;
236printGPXHeader ($gpx) ;
237
238print $html "<H1>$program by Gary68</H1>\n" ;
239print $html "<p>Version ", $version, "</p>\n" ;
240
241print $html "<H2>Statistics</H2>\n" ;
242print $html "<p>", stringFileInfo ($osmName), "<br>\n" ;
243print $html "number ways total: $wayCount<br>\n" ;
244print $html "number roundabouts: $roundaboutCount</p>\n" ;
245print $html "number wrong roundabouts: $onewayWrongCount</p>\n" ;
246
247
248print $html "<H2>Wrong roundabouts</H2>\n" ;
249print $html "<p>These roundabouts have the wrong direction.</p>" ;
250print $html "<table border=\"1\" width=\"100%\">\n";
251print $html "<tr>\n" ;
252print $html "<th>Line</th>\n" ;
253print $html "<th>WayId</th>\n" ;
254print $html "<th>Tags</th>\n" ;
255print $html "<th>Nodes</th>\n" ;
256print $html "<th>OSM start</th>\n" ;
257print $html "<th>OSB start</th>\n" ;
258print $html "<th>JOSM start</th>\n" ;
259print $html "</tr>\n" ;
260$i = 0 ;
261foreach $wayId (@wrong) {
262        $i++ ;
263
264        print $html "<tr>\n" ;
265        print $html "<td>", $i , "</td>\n" ;
266        print $html "<td>", historyLink ("way", $wayId) , "</td>\n" ;
267
268        print $html "<td>" ;
269        foreach (@{$roundaboutTags{$wayId}}) { print $html $_, " - " ; }
270        print $html "</td>\n" ;
271
272        print $html "<td>" ;
273        foreach (@{$roundaboutNodes{$wayId}}) { print $html $_, " - " ; }
274        print $html "</td>\n" ;
275
276        print $html "<td>", osmLink ($lon{$wayStart{$wayId}}, $lat{$wayStart{$wayId}}, 16) , "</td>\n" ;
277        print $html "<td>", osbLink ($lon{$wayStart{$wayId}}, $lat{$wayStart{$wayId}}, 16) , "</td>\n" ;
278        print $html "<td>", josmLink ($lon{$wayStart{$wayId}}, $lat{$wayStart{$wayId}}, 0.005, $wayId), "</td>\n" ;
279
280        print $html "</tr>\n" ;
281
282        # GPX
283        my $text = $wayId . " - roundabout with wrong direction" ;
284        printGPXWaypoint ($gpx, $lon{$wayStart{$wayId}}, $lat{$wayStart{$wayId}}, $text) ;
285}
286
287print $html "</table>\n" ;
288print $html "<p>$i lines total</p>\n" ;
289
290
291
292########
293# FINISH
294########
295print $html "<p>", stringTimeSpent ($time1-$time0), "</p>\n" ;
296printHTMLFoot ($html) ;
297printGPXFoot ($gpx) ;
298
299close ($html) ;
300close ($gpx) ;
301
302statistics ( ctime(stat($osmName)->mtime),  $program,  "roundabout", $osmName,  $roundaboutCount,  $i) ;
303
304print "\nINFO: finished after ", stringTimeSpent ($time1-$time0), "\n\n" ;
305
306sub statistics {
307        my ($date, $program, $def, $area, $total, $errors) = @_ ;
308        my $statfile ; my ($statfileName) = "statistics.csv" ;
309
310        if (grep /\.bz2/, $area) { $area =~ s/\.bz2// ; }
311        if (grep /\.osm/, $area) { $area =~ s/\.osm// ; }
312        my ($area2) = ($area =~ /.+\/([\w\-]+)$/ ) ;
313
314        my ($def2) = "roundabouts" ;
315
316        my ($success) = open ($statfile, "<", $statfileName) ;
317
318        if ($success) {
319                print "statfile found. writing stats...\n" ;
320                close $statfile ;
321                open $statfile, ">>", $statfileName ;
322                printf $statfile "%02d.%02d.%4d;", localtime->mday(), localtime->mon()+1, localtime->year() + 1900 ;
323                printf $statfile "%02d/%02d/%4d;", localtime->mon()+1, localtime->mday(), localtime->year() + 1900 ;
324                print $statfile $date, ";" ;
325                print $statfile $program, ";" ;
326                print $statfile $def2, ";" ;
327                print $statfile $area2, ";" ;
328                print $statfile $total, ";" ;
329                print $statfile $errors ;
330                print $statfile "\n" ;
331                close $statfile ;
332        }
333        return ;
334}
Note: See TracBrowser for help on using the repository browser.