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

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

first version way dupes

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