source: subversion/applications/utils/gary68/waydupes.pl @ 16983

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

way dupes - check only ways with more than one node...

  • Property svn:executable set to *
File size: 5.4 KB
Line 
1#
2#
3# version 1.1
4# - added tags in output
5# version 1.2
6# - check only ways with more than one node...
7#
8#
9
10
11use strict ;
12use warnings ;
13
14use OSM::osm 4.0 ;
15
16my $programName = "waydupes.pl" ;
17my $usage = "waydupes.pl file.osm out.htm out.gpx" ; 
18my $version = "1.2" ;
19
20my $wayId ;
21my $wayUser ;
22my @wayNodes ;
23my @wayTags ;
24my $nodeId ;
25my $nodeUser ;
26my $nodeLat ;
27my $nodeLon ;
28my @nodeTags ;
29my $aRef1 ;
30my $aRef2 ;
31
32my %wayNodesHash ;
33my %wayTagsHash ;
34my %numberNodesHash ;
35my %neededNodes = () ;
36my @problems = () ;
37
38my $highwayCount = 0 ;
39my $dupes = 0 ;
40
41my $osmName ; 
42my $gpxName ; 
43my $htmName ; 
44
45my %lon ; my %lat ;
46
47
48my $time0 ; 
49
50# get parameter
51
52$osmName = shift||'';
53if (!$osmName)
54{
55        die (print $usage, "\n");
56}
57
58$htmName = shift||'';
59if (!$htmName)
60{
61        die (print $usage, "\n");
62}
63
64$gpxName = shift||'';
65if (!$gpxName)
66{
67        die (print $usage, "\n");
68}
69
70
71print "\n$programName $version for file $osmName\n" ;
72
73$time0 = time() ;
74
75openOsmFile ($osmName) ;
76print "skipping nodes...\n" ;
77skipNodes() ;
78
79print "parsing ways...\n" ;
80
81($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
82if ($wayId != -1) {
83        @wayNodes = @$aRef1 ;
84        @wayTags = @$aRef2 ;
85}
86while ($wayId != -1) {
87       
88        my $highway = 0 ;
89        foreach my $tag (@wayTags) {
90                # if ($tag->[0] eq "highway") { $highway = 1 ; $highwayCount++ ; }
91                if ( ($tag->[0] eq "highway") and ($tag->[1] eq "residential") ){ $highway = 1 ; $highwayCount++ ; }
92        }
93
94        if ($highway == 1) {
95                push @{$numberNodesHash{scalar(@wayNodes)}}, $wayId ;
96                @{$wayTagsHash{$wayId}} = @wayTags ;
97                @{$wayNodesHash{$wayId}} = @wayNodes ;
98        }
99       
100        ($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
101        if ($wayId != -1) {
102                @wayNodes = @$aRef1 ;
103                @wayTags = @$aRef2 ;
104        }
105}
106
107closeOsmFile() ;
108
109print "done.\n" ;
110print "$highwayCount highways found.\n" ;
111
112print "comparing ways...\n" ;
113
114
115my $comparisons = 0 ;
116foreach my $number (keys %numberNodesHash) {
117        if ($number > 1) {
118                # print "checking ways with length $number nodes.\n" ;
119                foreach my $way1 (@{$numberNodesHash{$number}}) {
120                        foreach my $way2 (@{$numberNodesHash{$number}}) {
121                                if ($way1 < $way2) {
122                                        $comparisons++ ;
123                                        if (($comparisons % 10000000) == 0 ) { print "$comparisons comparisons done...\n" ; }
124                                        my %count = () ;
125                                        my $different = 0 ;
126                                        foreach my $item (@{$wayNodesHash{$way1}}, @{$wayNodesHash{$way2}}) { $count{$item}++ ; }
127                                        foreach my $item (keys %count) {
128                                                if ($count{$item} != 2) { $different = 1 ; }
129                                        }
130                                        if ($different == 0) {
131                                                # print "$way1 and $way2 are dupes\n" ;
132                                                $dupes++ ;
133                                                $neededNodes{$wayNodesHash{$way1}[0]} = 1 ;
134                                                push @problems, [$way1, $way2] ;
135                                        }
136                                }
137                        }
138                }
139        }
140}
141
142
143
144
145print "$dupes dupes found.\n\n" ;
146
147
148
149print "read node data...\n" ;
150openOsmFile ($osmName) ;
151($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
152if ($nodeId != -1) {
153        #@nodeTags = @$aRef1 ;
154}
155
156while ($nodeId != -1) {
157
158        if (defined ($neededNodes{$nodeId}) ) { $lon{$nodeId} = $nodeLon ; $lat{$nodeId} = $nodeLat ; }
159
160        # next
161        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
162        if ($nodeId != -1) {
163                #@nodeTags = @$aRef1 ;
164        }
165}
166
167closeOsmFile() ;
168print "done.\n" ;
169
170
171
172
173
174
175my $html ; my $gpx ;
176open ($html, ">", $htmName) || die ("Can't open html output file") ;
177open ($gpx, ">", $gpxName) || die ("Can't open gpx output file") ;
178
179
180printHTMLHeader ($html, "Dupe Way Check by Gary68") ;
181printGPXHeader ($gpx) ;
182
183print $html "<H1>Dupe Way Check by Gary68</H1>\n" ;
184print $html "<p>Version ", $version, "</p>\n" ;
185print $html "<H2>Statistics</H2>\n" ;
186print $html "<p>", stringFileInfo ($osmName), "<br>\n" ;
187print $html "number ways total: $highwayCount<br>\n" ;
188print $html "number dupes: $dupes<br>\n" ;
189print $html "</p>\n" ;
190
191
192print $html "<H2>Data</H2>\n" ;
193print $html "<table border=\"1\">\n";
194print $html "<tr>\n" ;
195print $html "<th>Line</th>\n" ;
196print $html "<th>Way1 Id</th>\n" ;
197print $html "<th>Way2 Id</th>\n" ;
198print $html "<th>OSM</th>\n" ;
199print $html "<th>OSB</th>\n" ;
200print $html "<th>JOSM</th>\n" ;
201print $html "</tr>\n" ;
202
203my $line = 0 ;
204foreach my $problem (@problems) {
205        $line++ ;
206        my ($lo) = $lon{$wayNodesHash{$problem->[0]}[0]} ;
207        my ($la) = $lat{$wayNodesHash{$problem->[0]}[0]} ;
208        #print "ways are dupes: $problem->[0] $problem->[1], $lo, $la\n" ;
209       
210        print $html "<tr>\n" ;
211        print $html "<td>", $line , "</td>\n" ;
212        print $html "<td>", historyLink ("way", $problem->[0]), "\n"  ;
213        foreach my $tag (@{$wayTagsHash{$problem->[0]}}) { print $html "<br>\n", $tag->[0], ":", $tag->[1] ; }
214        print $html "</td>\n" ;
215
216        print $html "<td>", historyLink ("way", $problem->[1]) ;
217        foreach my $tag (@{$wayTagsHash{$problem->[1]}}) { print $html "<br>\n", $tag->[0], ":", $tag->[1] ; }
218        print $html "</td>\n" ;
219
220        print $html "<td>", osmLink ($lo, $la, 16) , "<br>\n" ;
221        print $html "<td>", osbLink ($lo, $la, 16) , "<br>\n" ;
222        print $html "<td>", josmLinkSelectWays ($lo, $la, 0.01, $problem->[0], $problem->[1]), "</td>\n" ;
223        print $html "</tr>\n" ;
224       
225        my ($text) = "Waydupes - " . $problem->[0] . " and " . $problem->[1] ;
226        printGPXWaypoint ($gpx, $lo, $la, $text) ;
227}
228
229print $html "</table>\n" ;
230print $html "<p>", stringTimeSpent (time()-$time0), "</p>\n" ;
231
232printHTMLFoot ($html) ;
233printGPXFoot ($gpx) ;
234
235close ($html) ;
236close ($gpx) ;
237
238
239print "\n$programName finished after ", stringTimeSpent (time()-$time0), "\n\n" ;
240
Note: See TracBrowser for help on using the repository browser.