source: subversion/applications/utils/gary68/checkoverlay.pl @ 26424

Last change on this file since 26424 was 21184, checked in by gary68, 9 years ago

checkoverlay.pl new

  • Property svn:executable set to *
File size: 6.3 KB
Line 
1#
2#
3# checkoverlay.pl by gary68
4#
5#
6#
7# Copyright (C) 2010, Gerhard Schwanz
8#
9# 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
10# Free Software Foundation; either version 3 of the License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>
16#
17#
18# Version 1.0
19#
20#
21
22use strict ;
23use warnings ;
24
25use OSM::osm 5.1 ;
26use File::stat;
27use Time::localtime;
28
29
30my $program = "checkoverlay.pl" ;
31my $usage = $program . " file.osm out.htm" ;
32my $version = "1.0" ;
33
34my $wayId ; 
35my $wayUser ; my @wayNodes ; my @wayTags ;
36my $nodeId ; 
37my $nodeUser ; my $nodeLat ; my $nodeLon ; my @nodeTags ;
38my $aRef1 ; my $aRef2 ;
39
40my %startNodes = () ;
41my %endNodes = () ;
42my @result = () ;
43my %segments = () ;
44my %neededNodes = () ;
45my $count= 0 ;
46
47my $time0 = time() ; my $time1 ; my $timeA ;
48
49my $html ;
50my $gpx ;
51my $osmName ;
52my $htmlName ;
53my $gpxName ;
54
55my %lon ; my %lat ;
56my %motorwayNodes = () ;
57
58###############
59# get parameter
60###############
61$osmName = shift||'';
62if (!$osmName)
63{
64        die (print $usage, "\n");
65}
66
67$htmlName = shift||'';
68if (!$htmlName)
69{
70        die (print $usage, "\n");
71}
72
73$gpxName = $htmlName ;
74$gpxName =~ s/htm/gpx/ ;
75
76print "\n$program $version for file $osmName\n\n" ;
77
78
79
80
81######################
82# skip all nodes first
83######################
84openOsmFile ($osmName) ;
85print "pass1: skipping nodes...\n" ;
86skipNodes () ;
87
88
89print "pass1...\n" ;
90($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
91if ($wayId != -1) {
92        @wayNodes = @$aRef1 ;
93        @wayTags = @$aRef2 ;
94}
95while ($wayId != -1) { 
96
97        my $mw = 0 ;
98        foreach my $tag (@wayTags) {
99                if ( ($tag->[0] eq "highway") and (scalar @wayNodes > 1) and ($wayNodes[0] != $wayNodes[-1]) ) {
100                        for (my $i=0; $i<$#wayNodes; $i++) {
101                                my $start = $wayNodes[$i] ;
102                                my $end = $wayNodes[$i+1] ;
103                                $segments{$count} = [$start, $end, $wayId] ;
104                                push @{$startNodes{$start}}, $count ; 
105                                push @{$endNodes{$end}}, $count ; 
106                                $count++ ;
107                        }
108                }
109        } 
110
111
112        # next way
113        ($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
114        if ($wayId != -1) {
115                @wayNodes = @$aRef1 ;
116                @wayTags = @$aRef2 ;
117        }
118}
119
120closeOsmFile () ;
121
122
123foreach my $segment (keys %segments) {
124        my $start = $segments{$segment}->[0] ;
125        my $end = $segments{$segment}->[1] ;
126        my $way = $segments{$segment}->[2] ;
127        if (scalar @{$startNodes{$start}} > 1) {
128                my @here = @{$startNodes{$start}} ;
129                foreach my $segHere (@here) { # segments starting here
130                        if ( ($segments{$segHere}->[1] == $end) and ($segments{$segHere}->[2] != $way) ) {
131                                push @result, [$way, $segments{$segHere}->[2], $start, $end] ;
132                                $neededNodes{$start} = 1 ;
133                                $neededNodes{$end} = 1 ;
134                                # print "$way, $segments{$segHere}->[2], $start, $end\n" ;
135                        } 
136                }
137                if (defined @{$startNodes{$end}}) {
138                        @here = @{$startNodes{$end}} ;
139                        foreach my $segHere (@here) {
140                                if ( ($segments{$segHere}->[1] == $start) and ($segments{$segHere}->[2] != $way) ) {
141                                        push @result, [$way, $segments{$segHere}->[2], $start, $end] ;
142                                        $neededNodes{$start} = 1 ;
143                                        $neededNodes{$end} = 1 ;
144                                        # print "$way, $segments{$segHere}->[2], $start, $end\n" ;
145                                } 
146                        }
147                }
148        }
149}
150
151# print scalar @result, " problems found\n" ;
152
153
154######################
155# get node information
156######################
157print "pass2: get node information...\n" ;
158
159openOsmFile ($osmName) ;
160
161($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
162if ($nodeId != -1) {
163        #@nodeTags = @$aRef1 ;
164}
165
166while ($nodeId != -1) {
167
168        if (defined $neededNodes{$nodeId}) {
169                $lon{$nodeId} = $nodeLon ;
170                $lat{$nodeId} = $nodeLat ;
171        }
172
173        # next
174        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
175        if ($nodeId != -1) {
176                #@nodeTags = @$aRef1 ;
177        }
178}
179
180closeOsmFile () ;
181
182
183
184
185
186
187$time1 = time () ;
188
189
190##################
191# PRINT HTML INFOS
192##################
193open ($html, ">", $htmlName) || die ("Can't open html output file") ;
194open ($gpx, ">", $gpxName) || die ("Can't open gpx output file") ;
195
196
197printHTMLiFrameHeader ($html, "Overlay Check by Gary68") ;
198printGPXHeader ($gpx) ;
199
200print $html "<H1>Overlay Check by Gary68</H1>\n" ;
201print $html "<p>Version ", $version, "</p>\n" ;
202print $html "<H2>Statistics</H2>\n" ;
203print $html "<p>", stringFileInfo ($osmName), "<br>\n" ;
204
205print $html "<H2>Overlays found</H2>\n" ;
206print $html "<p>At the given two ways share the exact same nodes." ;
207print $html "<table border=\"1\">\n";
208print $html "<tr>\n" ;
209print $html "<th>Line</th>\n" ;
210print $html "<th>way1 Id</th>\n" ;
211print $html "<th>way2 Id</th>\n" ;
212print $html "<th>Links</th>\n" ;
213print $html "<th>JOSM Ways</th>\n" ;
214print $html "<th>JOSM Nodes</th>\n" ;
215print $html "<th>Pic</th>\n" ;
216print $html "</tr>\n" ;
217
218my $i = 0 ;
219
220foreach my $res (@result) {
221
222        my $lo = ($lon{$res->[2]} + $lon{$res->[3]}) / 2 ;
223        my $la = ($lat{$res->[2]} + $lat{$res->[3]}) / 2 ;
224
225        $i++ ;
226        # HTML
227        print $html "<tr>\n" ;
228        print $html "<td>", $i , "</td>\n" ;
229        print $html "<td>", historyLink ("way", $res->[0]), "</td>\n" ;
230        print $html "<td>", historyLink ("way", $res->[1]), "</td>\n" ;
231        print $html "<td>", osmLink ($lo, $la, 16) , "<br>\n" ;
232        print $html osbLink ($lo, $la, 16) , "<br>\n" ;
233        print $html mapCompareLink ($lo, $la, 16) , "</td>\n" ;
234        print $html "<td>", josmLinkSelectWays ($lo, $la, 0.002, $res->[0], $res->[1]), "</td>\n" ;
235        print $html "<td>", josmLinkSelectNodes ($lo, $la, 0.002, $res->[2], $res->[3]), "</td>\n" ;
236        print $html "<td>", picLinkOsmarender ($lo, $la, 16), "</td>\n" ;
237        print $html "</tr>\n" ;
238
239        # GPX
240        my $text = "ChkOverlay - " . $res->[0] . " / " . $res->[1]  . " ways do overlay" ;
241        printGPXWaypoint ($gpx, $lo, $la, $text) ;
242}
243print $html "</table>\n" ;
244print $html "<p>$i lines total</p>\n" ;
245
246
247
248########
249# FINISH
250########
251print $html "<p>", stringTimeSpent ($time1-$time0), "</p>\n" ;
252printHTMLFoot ($html) ;
253printGPXFoot ($gpx) ;
254
255close ($html) ;
256close ($gpx) ;
257
258
259print "\n$program finished after ", stringTimeSpent ($time1-$time0), "\n\n" ;
260
261print "$i lines total\n\n" ;
262
263
Note: See TracBrowser for help on using the repository browser.