source: subversion/applications/utils/gary68/checkdouble.pl @ 34621

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

checkdouble and checkcross added

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