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

Last change on this file since 30595 was 24623, checked in by gary68, 9 years ago

new version of whitespots, list limited further

  • Property svn:executable set to *
File size: 7.7 KB
Line 
1#
2#
3# whitespots.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#
19#
20
21use strict ;
22use warnings ;
23
24use OSM::osm 5.1 ;
25use OSM::QuadTree ;
26use File::stat;
27use Time::localtime;
28
29
30my $program = "whitespots.pl" ;
31my $usage = $program . " file.osm out.htm" ;
32my $version = "2.2" ;
33
34my %excludes = () ;
35$excludes{"locality"} = 1 ;
36$excludes{"farm"} = 1 ;
37$excludes{"region"} = 1 ;
38$excludes{"island"} = 1 ;
39
40my $maxDist = 0.3 ;
41my $limit = 1000 ;
42my $highwayNodeLimit = 15 ;
43
44my $wayId ; 
45my $wayUser ; my @wayNodes ; my @wayTags ;
46my $nodeId ; 
47my $nodeUser ; my $nodeLat ; my $nodeLon ; my @nodeTags ;
48my $aRef1 ; my $aRef2 ;
49
50my %placeName = () ;
51my %placeType = () ;
52my %placeCount = () ;
53my %placeNodes = () ;
54my %evalNodes = () ;
55my @result = () ;
56
57my $time0 = time() ; my $time1 ; my $timeA ;
58
59my $html ;
60my $osmName ;
61my $htmlName ;
62
63my %lon ; my %lat ;
64
65###############
66# get parameter
67###############
68$osmName = shift||'';
69if (!$osmName)
70{
71        die (print $usage, "\n");
72}
73
74$htmlName = shift||'';
75if (!$htmlName)
76{
77        die (print $usage, "\n");
78}
79
80print "\n$program $version for file $osmName\n\n" ;
81
82
83my $minLon = 999 ;
84my $minLat = 999 ;
85my $maxLon = -999 ;
86my $maxLat = -999 ;
87
88
89openOsmFile ($osmName) ;
90print "pass 1: find places...\n" ;
91my $placeCount = 0 ;
92my $nodeCount = 0 ;
93
94($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
95if ($nodeId != -1) {
96        @nodeTags = @$aRef1 ;
97}
98
99while ($nodeId != -1) {
100
101        $nodeCount++ ;
102        my $place = 0 ;
103        my $type = "unknown" ;
104        my $name = "unknown" ;
105
106        if ($nodeLon > $maxLon) {$maxLon = $nodeLon ; }
107        if ($nodeLat > $maxLat) {$maxLat = $nodeLat ; }
108        if ($nodeLon < $minLon) {$minLon = $nodeLon ; }
109        if ($nodeLat < $minLat) {$minLat = $nodeLat ; }
110
111        foreach my $t (@nodeTags) {
112                if ( ($t->[0] eq "place") and ( ! defined $excludes{$t->[1]}) ) { 
113                        $place = 1 ; 
114                        $type = $t->[1] ; 
115                }
116                if ($t->[0] eq "name") { $name = $t->[1] ; }
117        }
118
119        if ($place) {
120                $placeCount++ ;
121                $placeName{$nodeId} = $name ;
122                $placeType{$nodeId} = $type ;
123                $placeCount{$nodeId} = 0 ;
124                $lon{$nodeId} = $nodeLon ;
125                $lat{$nodeId} = $nodeLat ;
126        }
127
128        # next
129        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
130        if ($nodeId != -1) {
131                @nodeTags = @$aRef1 ;
132        }
133}
134
135closeOsmFile () ;
136
137print "$nodeCount nodes read.\n" ; 
138print "$placeCount places found.\n" ; 
139
140# init quadtree
141
142my $placeTree = OSM::QuadTree->new(  -xmin  => $minLon,
143                                      -xmax  => $maxLon,
144                                      -ymin  => $minLat,
145                                      -ymax  => $maxLat,
146                                      -depth => 6);
147
148foreach my $p (keys %placeName) {
149        $placeTree->add ($p, $lon{$p}, $lat{$p}, $lon{$p}, $lat{$p}) ;
150}
151
152
153openOsmFile ($osmName) ;
154print "pass 2: find nodes near places...\n" ;
155
156
157my $actualNode = 0 ;
158my $actualPercent = 10 ;
159
160($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
161if ($nodeId != -1) {
162        @nodeTags = @$aRef1 ;
163}
164
165while ($nodeId != -1) {
166
167        $actualNode++ ; 
168        if ($actualNode / $nodeCount * 100 >= $actualPercent)  {
169                print "$actualPercent percent of pass 2 done...\n" ;
170                $actualPercent += 10 ;
171        }
172
173        my $ref = $placeTree->getEnclosedObjects ($nodeLon-0.01, $nodeLat-0.01, $nodeLon+0.01, $nodeLat+0.01) ;
174        my @placesTemp = @$ref ;
175        # print $#placesTemp, " @placesTemp\n" ;
176
177        foreach my $p (@placesTemp) {
178                my $dist = distance ($nodeLon, $nodeLat, $lon{$p}, $lat{$p}) ;
179                if ( ($dist < $maxDist) and ($p != $nodeId) ) {
180                        $placeNodes{$p}{$nodeId} = 1 ;
181                        $evalNodes{$nodeId} = 0 ;
182                }
183        }
184
185        # next
186        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode2 () ;
187        if ($nodeId != -1) {
188                @nodeTags = @$aRef1 ;
189        }
190}
191
192
193
194#############################
195# identify check/against ways
196#############################
197print "pass 3: parsing ways...\n" ;
198($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
199if ($wayId != -1) {
200        @wayNodes = @$aRef1 ;
201        @wayTags = @$aRef2 ;
202}
203while ($wayId != -1) { 
204
205        my $hw = 0 ;
206        foreach my $tag (@wayTags) {
207                if ($tag->[0] eq "highway") {
208                        $hw = 1 ;
209                }
210        } 
211
212        if ($hw) {
213                foreach my $n (@wayNodes) {
214                        if (defined $evalNodes{$n}) { $evalNodes{$n}++ ; }
215                }
216        }
217
218        # next way
219        ($wayId, $wayUser, $aRef1, $aRef2) = getWay2 () ;
220        if ($wayId != -1) {
221                @wayNodes = @$aRef1 ;
222                @wayTags = @$aRef2 ;
223        }
224}
225
226closeOsmFile () ;
227
228
229foreach my $p (keys %placeName) {
230        foreach my $e (keys %{$placeNodes{$p}}) {
231                if ($evalNodes{$e} > 0) { $placeCount{$p}++ ; }
232        }
233}
234
235foreach my $p (keys %placeName) {
236        push @result, [$p, $placeCount{$p}] ;
237}
238
239@result = sort { $a->[1] <=> $b->[1] } @result ;
240
241if ($#result > $limit) { @result = @result[0..$limit] ; }
242print "result list limited to $limit entries.\n" ;
243
244
245
246$time1 = time () ;
247
248
249my @excludeArray = keys %excludes ;
250
251##################
252# PRINT HTML INFOS
253##################
254open ($html, ">", $htmlName) || die ("Can't open html output file") ;
255
256
257printHTMLiFrameHeader ($html, "White spots by Gary68") ;
258
259print $html "<H1>White spots by Gary68</H1>\n" ;
260print $html "<p>Version ", $version, "</p>\n" ;
261print $html "<H2>Statistics</H2>\n" ;
262print $html "<p>", stringFileInfo ($osmName), "</p>\n" ;
263print $html "<p>Max dist from place for nodes $maxDist</p>\n" ;
264print $html "<p>Highway node limit to qualify for \"white spot\": $highwayNodeLimit</p>\n" ;
265print $html "<p>Limit result list to $limit</p>\n" ;
266print $html "<p>Excluded place types: @excludeArray</p>\n" ;
267
268print $html "<H2>Data</H2>\n" ;
269print $html "<table border=\"1\">\n";
270print $html "<tr>\n" ;
271print $html "<th>Highway Node Count</th>\n" ;
272print $html "<th>Node Count</th>\n" ;
273print $html "<th>Place name</th>\n" ;
274print $html "<th>Place type</th>\n" ;
275print $html "<th>Node history</th>\n" ;
276print $html "<th>Link</th>\n" ;
277print $html "<th>JOSM</th>\n" ;
278print $html "<th>PIC</th>\n" ;
279print $html "</tr>\n" ;
280
281my $i = 0 ;
282
283foreach my $res (@result) {
284
285        my $node = $res->[0] ;
286        my $nodeCount = $res->[1] ;
287        my $name = $placeName{$node} ;
288        my $type = $placeType{$node} ;
289        my $nodes = scalar (keys %{$placeNodes{$node}}) ;
290
291        if ($nodeCount <= $highwayNodeLimit) {
292                $i++ ;
293                print $html "<tr>\n" ;
294                print $html "<td>", $nodeCount, "</td>\n" ;
295                print $html "<td>", $nodes, "</td>\n" ;
296                print $html "<td>", $name, "</td>\n" ;
297                print $html "<td>", $type, "</td>\n" ;
298                print $html "<td>", historyLink ("node", $node), "</td>\n" ;
299                print $html "<td>", osmLink ($lon{$node}, $lat{$node}, 16) , "<br>\n" ;
300                print $html osbLink ($lon{$node}, $lat{$node}, 16) , "<br>\n" ;
301                print $html mapCompareLink ($lon{$node}, $lat{$node}, 16) , "</td>\n" ;
302                print $html "<td>", josmLinkSelectNode ($lon{$node}, $lat{$node}, 0.01, $node), "</td>\n" ;
303                print $html "<td>", picLinkMapnik ($lon{$node}, $lat{$node}, 15), "</td>\n" ;
304                print $html "</tr>\n" ;
305        }
306}
307
308print $html "</table>\n" ;
309
310
311
312########
313# FINISH
314########
315
316print $html "<p>$i places listed</p>\n" ;
317print $html "<p>", stringTimeSpent ($time1-$time0), "</p>\n" ;
318printHTMLFoot ($html) ;
319
320close ($html) ;
321
322
323print "\n$program finished after ", stringTimeSpent ($time1-$time0), "\n\n" ;
324
325
326
Note: See TracBrowser for help on using the repository browser.