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

Last change on this file since 30595 was 26778, checked in by gary68, 8 years ago

gpl added to some files

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