source: subversion/applications/utils/gary68/checkdoublenodes.pl @ 30595

Last change on this file since 30595 was 29167, checked in by michi, 7 years ago

Implemented a blacklist in checkdoublenodes.pl. The blacklist contains node IDs which should be ignored completely.

  • Property svn:executable set to *
File size: 6.8 KB
Line 
1#
2#
3#
4#
5# Copyright (C) 2008, Gerhard Schwanz
6# Copyright (C) 2013, Michael Bemmerl
7#
8# 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
9# Free Software Foundation; either version 3 of the License, or (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>
15#
16#
17
18my $maxDist = 0.0001 ; # in kilometers
19
20use strict ;
21use warnings ;
22
23use OSM::osm 5.2 ;
24use File::stat;
25use Time::localtime;
26
27my $program = "checkdouble.pl" ;
28my $usage = $program . " file.osm out.htm out.gpx" ;
29my $version = "1.0 BETA" ;
30
31my $nodeId ; my $nodeId2 ;
32my $nodeUser ; my $nodeLat ; my $nodeLon ; my @nodeTags ;
33my $aRef1 ; my $aRef2 ;
34
35my $time0 = time() ; my $time1 ; my $timeA ;
36
37my $html ;
38my $gpx ;
39my $osmName ;
40my $htmlName ;
41my $gpxName ;
42
43my %lon ; my %lat ;
44my %nodeTagsHash = () ;
45my %nodesHash = () ;
46
47my %neededNodes = () ;
48my @dupes = () ;
49my $nodeCount = 0 ;
50my $numberDupes = 0 ;
51
52my $blacklistFile = "blacklist.txt" ;
53my @blacklist = () ;
54
55###############
56# get parameter
57###############
58
59$osmName = shift||'';
60if (!$osmName)
61{
62        die (print $usage, "\n");
63}
64
65$htmlName = shift||'';
66if (!$htmlName)
67{
68        die (print $usage, "\n");
69}
70
71$gpxName = shift||'';
72if (!$gpxName)
73{
74        die (print $usage, "\n");
75}
76
77print "\n$program $version for file $osmName\n\n" ;
78
79
80
81
82########################
83# load node id blacklist
84########################
85if (-e $blacklistFile) {
86        open (FILE, "<", $blacklistFile) or die ("Failed to load blacklist file!") ;
87        @blacklist = <FILE> ;
88        close (FILE); 
89}
90
91
92######################
93# get node information
94######################
95print "pass1: get node positions...\n" ;
96openOsmFile ($osmName) ;
97
98($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
99if ($nodeId != -1) {
100        #@nodeTags = @$aRef1 ;
101}
102
103while ($nodeId != -1) {
104        # check if node ID is in blacklist
105        if ($nodeId ~~ @blacklist) {
106                print "Node with ID $nodeId ignored due to matching blacklist entry.\n" ;
107        }
108        else {
109                $nodeCount++ ;
110
111                my ($hashValue) = int ($nodeLon * 1000) * 1000000 + int ($nodeLat * 1000) ;
112                push @{$nodesHash{$hashValue}}, $nodeId ;
113
114                $lon{$nodeId} = $nodeLon ;
115                $lat{$nodeId} = $nodeLat ;
116        }
117
118        # next
119        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
120        if ($nodeId != -1) {
121                #@nodeTags = @$aRef1 ;
122        }
123}
124closeOsmFile () ;
125
126my ($total) = scalar (keys %nodesHash) ;
127my $progress = 0 ;
128foreach my $key (keys %nodesHash) {
129
130        #print "$key: @{$nodesHash{$key}}\n" ;
131
132        $progress++ ;
133        if ($progress % 10000 == 0) {
134                my ($done) = int ($progress / $total * 100) ;
135                print "$done percent done...\n" ; 
136        }
137
138        foreach my $n1 (@{$nodesHash{$key}}) {
139                foreach my $n2 (@{$nodesHash{$key}}) {
140                        if ($n1 < $n2) {
141                                if ( ($lon{$n1} == $lon{$n2}) and ($lat{$n1} == $lat{$n2}) ) {
142                                        $numberDupes++ ;
143                                        push @dupes, [$n1, $n2, "exact same position", 0] ;
144                                        $neededNodes{$n1} = 1 ;
145                                        $neededNodes{$n2} = 1 ;
146                                }
147                                else {
148                                        my ($dist) = distance ($lon{$n1}, $lat{$n1}, $lon{$n2}, $lat{$n2}) ;
149                                        if ( $dist < $maxDist) {
150                                                $numberDupes++ ;
151                                                push @dupes, [$n1, $n2, "under threshold distance", int($dist*100000)/100] ;
152                                                $neededNodes{$n1} = 1 ;
153                                                $neededNodes{$n2} = 1 ;
154                                        }
155                                }
156                        }
157                }
158        }
159}
160
161
162######################
163# get node information
164######################
165print "pass2: get node tags...\n" ;
166openOsmFile ($osmName) ;
167
168($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
169if ($nodeId != -1) {
170        @nodeTags = @$aRef1 ;
171}
172
173while ($nodeId != -1) {
174       
175        if (defined $neededNodes{$nodeId}) {
176                @{$nodeTagsHash{$nodeId}} = @nodeTags ;
177        }
178
179        # next
180        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
181        if ($nodeId != -1) {
182                @nodeTags = @$aRef1 ;
183        }
184}
185closeOsmFile () ;
186
187
188
189
190$time1 = time () ;
191
192
193##################
194# PRINT HTML INFOS
195##################
196print "\nwrite HTML tables and GPX file...\n" ;
197
198open ($html, ">", $htmlName) || die ("Can't open html output file") ;
199open ($gpx, ">", $gpxName) || die ("Can't open gpx output file") ;
200
201
202printHTMLiFrameHeader ($html, "Double Node Check by Gary68") ;
203printGPXHeader ($gpx) ;
204
205print $html "<H1>Double Node Check by Gary68</H1>\n" ;
206print $html "<p>Version ", $version, "</p>\n" ;
207print $html "<H2>Statistics</H2>\n" ;
208print $html "<p>", stringFileInfo ($osmName), "<br>\n" ;
209print $html "number nodes total: $nodeCount<br>\n" ;
210print $html "number dupes $numberDupes<br>\n" ;
211
212
213
214print $html "<H2>Data</H2>\n" ;
215print $html "<table border=\"1\">\n";
216print $html "<tr>\n" ;
217print $html "<th>Line</th>\n" ;
218print $html "<th>Problem</th>\n" ;
219print $html "<th>Node 1</th>\n" ;
220print $html "<th>Node 2</th>\n" ;
221print $html "<th>Distance (m)</th>\n" ;
222print $html "<th>JOSM</th>\n" ;
223print $html "<th>OSM</th>\n" ;
224print $html "<th>OSB</th>\n" ;
225print $html "</tr>\n" ;
226
227my $i = 0 ;
228foreach my $d (@dupes) {
229        $i++ ;
230        # HTML
231        print $html "<tr>\n" ;
232        print $html "<td>", $i , "</td>\n" ;
233        print $html "<td>", $d->[2] , "</td>\n" ;
234        print $html "<td>", historyLink("node", $d->[0]) , "<br>\n" ;
235        if ( scalar (@{$nodeTagsHash{$d->[0]}}) > 0 ) { 
236                foreach my $t (@{$nodeTagsHash{$d->[0]}}) { 
237                        print $html $t->[0] . " : " . $t->[1] . "<br>\n" ; 
238                } 
239        }
240        else {
241                print $html "no tags<br>\n" ;
242        }
243        print $html "</td>\n" ;
244        print $html "<td>", historyLink("node", $d->[1]), "<br>\n" ;
245        if (scalar (@{$nodeTagsHash{$d->[1]}}) > 0) { 
246                foreach my $t (@{$nodeTagsHash{$d->[1]}}) { 
247                        print $html "$t->[0] : $t->[1]<br>\n" ; 
248                }
249        }
250        else {
251                print $html "no tags<br>\n" ;
252        }
253        print $html "</td>\n" ;
254        print $html "<td>", $d->[3] , "</td>\n" ;
255        print $html "<td>", josmLinkSelectNodes ($lon{$d->[0]}, $lat{$d->[0]}, 0.001, $d->[0], $d->[1]), "</td>\n" ;
256        print $html "<td>", osmLink ($lon{$d->[0]}, $lat{$d->[0]}, 17) , "<br>\n" ;
257        print $html "<td>", osbLink ($lon{$d->[0]}, $lat{$d->[0]}, 17) , "<br>\n" ;
258        print $html "</tr>\n" ;
259       
260        # GPX
261        my ($text) = "node dupes " . $d->[0] . " " . $d->[1] . " - " . $d->[2] ;
262        printGPXWaypoint ($gpx, $lon{$d->[0]}, $lat{$d->[0]}, $text) ;
263}
264print $html "</table>\n" ;
265print $html "<p>$i lines total</p>\n" ;
266
267
268
269########
270# FINISH
271########
272
273print $html "<p>", stringTimeSpent ($time1-$time0), "</p>\n" ;
274printHTMLFoot ($html) ;
275printGPXFoot ($gpx) ;
276
277close ($html) ;
278close ($gpx) ;
279
280print "$total different hash values.\n" ;
281print "$numberDupes node dupes found.\n" ;
282print "\n$program finished after ", stringTimeSpent ($time1-$time0), "\n\n" ;
283
284
Note: See TracBrowser for help on using the repository browser.