source: subversion/applications/utils/gary68/checkroundDB.pl @ 26507

Last change on this file since 26507 was 24865, checked in by gary68, 9 years ago

new DB programs

  • Property svn:executable set to *
File size: 6.4 KB
Line 
1#
2# roundaboutDB 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 OSM::osmDB ;
28use File::stat;
29use Time::localtime;
30
31
32
33my $program = "checkroundDB.pl" ;
34my $version = "1.0" ;
35my $usage = $program . " <direction> database out.htm out.gpx // direction = [L|R]" ;
36
37my $wayId ;
38my $wayId2 ;
39my $wayUser ;
40my @wayNodes ;
41my @wayTags ;
42my $nodeId ;
43my $nodeId2 ;
44my $nodeUser ;
45my $nodeLat ;
46my $nodeLon ;
47my @nodeTags ;
48my $aRef1 ;
49my $aRef2 ;
50my $wayCount = 0 ;
51my $roundaboutCount = 0 ;
52my $onewayCount = 0 ;
53my $onewayWrongCount = 0 ;
54
55my $time0 = time() ; my $time1 ;
56my $i ;
57my $key ;
58my $num ;
59my $tag1 ; my $tag2 ;
60my $direction = "" ;
61
62my $html ;
63my $gpx ;
64my $dbName ;
65my $htmlName ;
66my $gpxName ;
67
68
69my @roundabouts ;
70my @wrong ;
71my @neededNodes ;
72my %neededNodesHash ;
73my %lon ;
74my %lat ;
75my %wayStart ;
76my %wayEnd ;
77my %roundaboutTags ;
78my %roundaboutNodes ;
79
80
81###############
82# get parameter
83###############
84$direction = shift||'';
85if (!$direction)
86{
87        $direction = "L" ;
88}
89
90$dbName = shift||'';
91if (!$dbName)
92{
93        die (print $usage, "\n");
94}
95
96$htmlName = shift||'';
97if (!$htmlName)
98{
99        die (print $usage, "\n");
100}
101
102$gpxName = shift||'';
103if (!$gpxName)
104{
105        die (print $usage, "\n");
106}
107
108print "\n$program $version for DB $dbName\n\n" ;
109print "\n\n" ;
110
111
112
113
114dbConnect ($dbName) ;
115
116
117my @checks = (["junction","roundabout"],["highway","mini_roundabout"]) ;
118
119foreach my $c (@checks) {
120
121        loopInitWays($c->[0], $c->[1]) ;
122        $wayId = loopGetNextWay() ;
123        while (defined $wayId) {
124
125                my ($ref0, $ref1, $ref2) = getDBWay ($wayId) ;
126                my %wayProperties = %$ref0 ;
127                my @wayNodes = @$ref1 ;
128                my @wayTags = @$ref2 ;
129
130                my $reverse = 0 ;
131                foreach my $tag (@wayTags) {
132                        if ( ($tag->[0] eq "oneway") and ($tag->[1] eq "-1") ) { $reverse = 1 ; }
133                }
134
135                if (scalar @wayNodes > 2) { 
136                        $roundaboutCount++ ;
137
138                        if ($reverse) { @wayNodes = reverse @wayNodes ; }
139                        my $wayStart = $wayNodes[0] ; 
140                        my $wayEnd = $wayNodes[-1] ; 
141
142                        my %lonLocal = () ;
143                        my %latLocal = () ;
144
145                        foreach my $n (@wayNodes) {
146                                my ($ref0, $ref1) = getDBNode ($n) ;
147                                my %properties = %$ref0 ;
148                                $lonLocal{$n} = $properties{"lon"} ;
149                                $latLocal{$n} = $properties{"lat"} ;
150                        }
151
152
153                        # angle (x1,y1,x2,y2)                                   > angle (N=0,E=90...)
154                        my $node0 = $wayNodes[0] ;
155                        my $node1 = $wayNodes[1] ;
156                        my $node2 = $wayNodes[2] ;
157               
158                        my $angle1 = angle ($lonLocal{$node0}, $latLocal{$node0}, $lonLocal{$node1}, $latLocal{$node1}) ; 
159                        my $angle2 = angle ($lonLocal{$node1}, $latLocal{$node1}, $lonLocal{$node2}, $latLocal{$node2}) ; 
160                        my $angleDelta = $angle2 - $angle1 ;
161                        # print "$wayId $angle1 $angle2 $angleDelta\n" ;
162                        if ($angleDelta > 180) { $angleDelta = $angleDelta - 360 ; }
163                        if ($angleDelta < -180) { $angleDelta = $angleDelta + 360 ; }
164                        if (    ( ($direction eq "L") and ($angleDelta > 0) ) or
165                                ( ($direction eq "R") and ($angleDelta < 0)) ) {
166                                $onewayWrongCount ++ ;
167                                push @wrong, $wayId ;
168
169                                @{$roundaboutTags{$wayId}} = @wayTags ;
170                                @{$roundaboutNodes{$wayId}} = @wayNodes ;
171                                $lon{$node0} = $lonLocal{$node0} ;
172                                $lat{$node0} = $latLocal{$node0} ;
173                                $wayStart{$wayId} = $node0 ;
174                        }
175                } # if valid way
176
177                $wayId = loopGetNextWay() ;
178        } # while
179
180} #foreach
181
182
183dbDisconnect () ;
184
185
186
187print "INFO: number roundabouts: $roundaboutCount\n" ;
188print "INFO: number wrong roundabouts: $onewayWrongCount\n" ;
189
190######################
191# PRINT HTML/GPX INFOS
192######################
193print "\nINFO: write HTML tables...\n" ;
194
195open ($html, ">", $htmlName) || die ("Can't open html output file") ;
196open ($gpx, ">", $gpxName) || die ("Can't open gpx output file") ;
197
198printHTMLHeader ($html, "$program by Gary68") ;
199printGPXHeader ($gpx) ;
200
201print $html "<H1>$program by Gary68</H1>\n" ;
202print $html "<p>Version ", $version, "</p>\n" ;
203
204print $html "<H2>Statistics</H2>\n" ;
205print $html "number roundabouts: $roundaboutCount</p>\n" ;
206print $html "number wrong roundabouts: $onewayWrongCount</p>\n" ;
207
208
209print $html "<H2>Wrong roundabouts</H2>\n" ;
210print $html "<p>These roundabouts have the wrong direction.</p>" ;
211print $html "<table border=\"1\" width=\"100%\">\n";
212print $html "<tr>\n" ;
213print $html "<th>Line</th>\n" ;
214print $html "<th>WayId</th>\n" ;
215print $html "<th>Tags</th>\n" ;
216print $html "<th>Nodes</th>\n" ;
217print $html "<th>OSM start</th>\n" ;
218print $html "<th>OSB start</th>\n" ;
219print $html "<th>JOSM start</th>\n" ;
220print $html "</tr>\n" ;
221$i = 0 ;
222foreach $wayId (@wrong) {
223        $i++ ;
224
225        print $html "<tr>\n" ;
226        print $html "<td>", $i , "</td>\n" ;
227        print $html "<td>", historyLink ("way", $wayId) , "</td>\n" ;
228
229        print $html "<td>" ;
230        foreach (@{$roundaboutTags{$wayId}}) { print $html $_, " - " ; }
231        print $html "</td>\n" ;
232
233        print $html "<td>" ;
234        foreach (@{$roundaboutNodes{$wayId}}) { print $html $_, " - " ; }
235        print $html "</td>\n" ;
236
237        print $html "<td>", osmLink ($lon{$wayStart{$wayId}}, $lat{$wayStart{$wayId}}, 16) , "</td>\n" ;
238        print $html "<td>", osbLink ($lon{$wayStart{$wayId}}, $lat{$wayStart{$wayId}}, 16) , "</td>\n" ;
239        print $html "<td>", josmLink ($lon{$wayStart{$wayId}}, $lat{$wayStart{$wayId}}, 0.005, $wayId), "</td>\n" ;
240
241        print $html "</tr>\n" ;
242
243        # GPX
244        my $text = $wayId . " - roundabout with wrong direction" ;
245        printGPXWaypoint ($gpx, $lon{$wayStart{$wayId}}, $lat{$wayStart{$wayId}}, $text) ;
246}
247
248print $html "</table>\n" ;
249print $html "<p>$i lines total</p>\n" ;
250
251
252
253########
254# FINISH
255########
256print $html "<p>", stringTimeSpent ($time1-$time0), "</p>\n" ;
257printHTMLFoot ($html) ;
258printGPXFoot ($gpx) ;
259
260close ($html) ;
261close ($gpx) ;
262
263$time1 = time () ;
264
265print "\nINFO: finished after ", stringTimeSpent ($time1-$time0), "\n\n" ;
266
Note: See TracBrowser for help on using the repository browser.