1
1
extern crate osmpbfreader;
2
- use std:: collections:: HashMap ;
2
+ use std:: collections:: { HashMap , HashSet } ;
3
3
use models:: * ;
4
4
use categorize:: * ;
5
5
use std;
@@ -14,13 +14,15 @@ struct Way {
14
14
struct Reader {
15
15
nodes : HashMap < i64 , Node > ,
16
16
ways : Vec < Way > ,
17
+ nodes_to_keep : HashSet < i64 > ,
17
18
}
18
19
19
20
impl Reader {
20
21
fn new ( ) -> Reader {
21
22
Reader {
22
23
nodes : HashMap :: new ( ) ,
23
24
ways : Vec :: new ( ) ,
25
+ nodes_to_keep : HashSet :: new ( ) ,
24
26
}
25
27
}
26
28
@@ -72,41 +74,54 @@ impl Reader {
72
74
result
73
75
}
74
76
75
- fn read ( & mut self , filename : & str ) -> Result < ( ) , String > {
76
- let path = std:: path:: Path :: new ( filename) ;
77
- let r = try!( std:: fs:: File :: open ( & path) . map_err ( |e| e. to_string ( ) ) ) ;
78
- let mut pbf = osmpbfreader:: OsmPbfReader :: new ( r) ;
77
+ fn read_ways ( & mut self , file : std:: fs:: File ) {
78
+ let mut pbf = osmpbfreader:: OsmPbfReader :: new ( file) ;
79
79
for obj in pbf. iter ( ) {
80
80
match obj {
81
- osmpbfreader:: OsmObj :: Node ( node) => {
82
- let mut n = Node :: new ( ) ;
83
- n. id = node. id ;
84
- n. coord = Coord {
85
- lon : node. lon ,
86
- lat : node. lat ,
87
- } ;
88
- self . nodes . insert ( node. id , n) ;
89
- }
90
81
osmpbfreader:: OsmObj :: Way ( way) => {
91
82
let mut properties = EdgeProperties :: new ( ) ;
92
83
for ( key, val) in way. tags {
93
84
properties. update ( key, val) ;
94
85
}
95
86
properties. normalize ( ) ;
96
87
if properties. accessible ( ) {
88
+ for node in & way. nodes {
89
+ self . nodes_to_keep . insert ( node. clone ( ) ) ;
90
+ }
97
91
self . ways . push ( Way {
98
92
id : way. id ,
99
93
nodes : way. nodes ,
100
94
properties : properties,
101
- } )
95
+ } ) ;
96
+
102
97
}
103
98
}
104
- osmpbfreader :: OsmObj :: Relation ( _ ) => { }
99
+ _ => { }
105
100
}
106
101
}
107
- Ok ( ( ) )
108
102
}
109
103
104
+ fn read_nodes ( & mut self , file : std:: fs:: File ) {
105
+ let mut pbf = osmpbfreader:: OsmPbfReader :: new ( file) ;
106
+ self . nodes . reserve ( self . nodes_to_keep . len ( ) ) ;
107
+ for obj in pbf. iter ( ) {
108
+ match obj {
109
+ osmpbfreader:: OsmObj :: Node ( node) => {
110
+ if self . nodes_to_keep . contains ( & node. id ) {
111
+ self . nodes_to_keep . remove ( & node. id ) ;
112
+ let mut n = Node :: new ( ) ;
113
+ n. id = node. id ;
114
+ n. coord = Coord {
115
+ lon : node. lon ,
116
+ lat : node. lat ,
117
+ } ;
118
+ self . nodes . insert ( node. id , n) ;
119
+ }
120
+ }
121
+ _ => { }
122
+ }
123
+ }
124
+ }
110
125
111
126
fn nodes ( self ) -> Vec < Node > {
112
127
self . nodes
@@ -124,7 +139,11 @@ impl Reader {
124
139
// Read all the nodes and ways of the osm.pbf file
125
140
pub fn read ( filename : & str ) -> Result < ( Vec < Node > , Vec < Edge > ) , String > {
126
141
let mut r = Reader :: new ( ) ;
127
- try!( r. read ( filename) ) ;
142
+ let path = std:: path:: Path :: new ( filename) ;
143
+ let file = try!( std:: fs:: File :: open ( & path) . map_err ( |e| e. to_string ( ) ) ) ;
144
+ r. read_ways ( file) ;
145
+ let file_nodes = try!( std:: fs:: File :: open ( & path) . map_err ( |e| e. to_string ( ) ) ) ;
146
+ r. read_nodes ( file_nodes) ;
128
147
r. count_nodes_uses ( ) ;
129
148
let edges = r. edges ( ) ;
130
149
Ok ( ( r. nodes ( ) , edges) )
@@ -151,6 +170,7 @@ fn test_count_nodes() {
151
170
let mut r = Reader {
152
171
ways : ways,
153
172
nodes : nodes,
173
+ nodes_to_keep : HashSet :: new ( ) ,
154
174
} ;
155
175
r. count_nodes_uses ( ) ;
156
176
assert_eq ! ( 2 , r. nodes[ & 1 ] . uses) ;
@@ -181,6 +201,7 @@ fn test_split() {
181
201
let mut r = Reader {
182
202
nodes : nodes,
183
203
ways : ways,
204
+ nodes_to_keep : HashSet :: new ( ) ,
184
205
} ;
185
206
r. count_nodes_uses ( ) ;
186
207
let edges = r. edges ( ) ;
0 commit comments