source: subversion/applications/utils/gary68/prouting.pl

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

routing

  • Property svn:executable set to *
File size: 3.7 KB
Line 
1#
2#
3# Copyright (C) 2009, Gerhard Schwanz
4#
5# 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
6# Free Software Foundation; either version 3 of the License, or (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
10#
11# You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>
12#
13
14use strict ;
15use warnings ;
16
17use OSM::osm ;
18
19my $programName = "prouting.pl" ;
20my $usage = $programName . " file.osm out.rou" ; 
21my $version = "1.0" ;
22
23# add all allowed pathes here
24my %allowedPaths = () ;
25$allowedPaths{"highway:motorway"} = 1 ;
26$allowedPaths{"highway:motorway_link"} = 1 ;
27$allowedPaths{"highway:trunk"} = 1 ;
28$allowedPaths{"highway:trunk_link"} = 1 ;
29$allowedPaths{"highway:primary"} = 1 ;
30$allowedPaths{"highway:primary_link"} = 1 ;
31$allowedPaths{"highway:secondary"} = 1 ;
32$allowedPaths{"highway:secondary_link"} = 1 ;
33$allowedPaths{"highway:tertiary"} = 1 ;
34$allowedPaths{"highway:residential"} = 1 ;
35$allowedPaths{"highway:service"} = 1 ;
36# etc...
37
38my %edge ;
39my %wayCount = () ;
40
41my $wayId ;
42my $wayUser ;
43my @wayNodes ;
44my @wayTags ;
45my $nodeId ;
46my $nodeUser ;
47my $nodeLat ;
48my $nodeLon ;
49my @nodeTags ;
50my $aRef1 ;
51my $aRef2 ;
52
53my $osmName ; 
54my $outFileName ;
55
56my %lon ; my %lat ;
57
58my $time0 ; my $time1 ;
59
60# get parameter
61
62$osmName = shift||'';
63if (!$osmName)
64{
65        die (print $usage, "\n");
66}
67
68$outFileName = shift||'';
69if (!$outFileName)
70{
71        die (print $usage, "\n");
72}
73
74
75print "\n$programName $version for file $osmName\n" ;
76
77$time0 = time() ;
78
79# get all node locations
80
81print "get node information...\n" ;
82openOsmFile ($osmName) ;
83
84($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode () ;
85if ($nodeId != -1) {
86        @nodeTags = @$aRef1 ;
87}
88
89while ($nodeId != -1) {
90
91        $lon{$nodeId} = $nodeLon ;     
92        $lat{$nodeId} = $nodeLat ;     
93
94        ($nodeId, $nodeLon, $nodeLat, $nodeUser, $aRef1) = getNode () ;
95        if ($nodeId != -1) {
96                @nodeTags = @$aRef1 ;
97        }
98}
99
100
101print "get way information...\n" ;
102
103($wayId, $wayUser, $aRef1, $aRef2) = getWay () ;
104if ($wayId != -1) {
105        @wayNodes = @$aRef1 ;
106        @wayTags = @$aRef2 ;
107}
108while ($wayId != -1) {
109        my $highway = "none" ;
110        foreach my $key (@wayTags) {
111                if (grep /^highway:/, $key) { $highway = $key ; }
112        }       
113
114        if ( (defined ($allowedPaths{$highway})) and (scalar (@wayNodes) > 1 ) ) {
115                # set distances
116                my $i ;
117                for ($i=0; $i<$#wayNodes; $i++) {
118                        my $dist = distance ($lon{$wayNodes[$i]}, $lat{$wayNodes[$i]}, $lon{$wayNodes[$i+1]}, $lat{$wayNodes[$i+1]}) ;
119                        $edge{$wayNodes[$i]}{$wayNodes[$i+1]} = $dist ;
120                        $edge{$wayNodes[$i+1]}{$wayNodes[$i]} = $dist ;
121                }
122
123                # incr waycount per node (count > 0 --> crossing)
124                foreach my $node (@wayNodes) {
125                        if (defined ($wayCount{$node})) {
126                                $wayCount{$node} ++ ;
127                        }
128                        else {
129                                $wayCount{$node} = 1 ;
130                        }
131                }
132
133        }       
134
135        ($wayId, $wayUser, $aRef1, $aRef2) = getWay () ;
136        if ($wayId != -1) {
137                @wayNodes = @$aRef1 ;
138                @wayTags = @$aRef2 ;
139        }
140}
141
142closeOsmFile () ;
143
144my $outFile ;
145open ($outFile, ">", $outFileName) or die ("can't open output file!") ;
146foreach my $from (keys %edge) {
147        foreach my $to (keys %{$edge{$from}}) {
148                print $outFile $from, " ", $to, " ", $edge{$from}{$to}, "\n" ;
149        }
150}
151close ($outFile) ;
152
153
154$time1 = time() ;
155print "\n$programName finished after ", stringTimeSpent ($time1-$time0), "\n\n" ;
156
Note: See TracBrowser for help on using the repository browser.