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

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

waydupes with better output and more ways to check

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