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

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

waydupes new version incl. tags in output

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