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

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

new checkdoublenodes

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