@@ -10,15 +10,36 @@ use std::thread;
1010
1111use osm_pbf_iter:: * ;
1212
13+ struct NodeData {
14+ lat : f64 ,
15+ lon : f64 ,
16+ }
17+
18+ struct WayData {
19+ nodes : HashMap < u64 , NodeData > ,
20+ }
21+
22+ struct RelationData {
23+ name : String ,
24+ fixed_way : Vec < NodeData > ,
25+ ways : HashMap < u64 , WayData > ,
26+ }
27+
1328struct Data {
14- nodeslat : HashMap < u64 , f64 > ,
15- nodeslon : HashMap < u64 , f64 > ,
29+ pt : HashMap < u64 , RelationData > , // { relation_id: { name: name, fixed_way: Vec<LatLon>, ways: { way_id: { name: name, nodes: { node_id: { lat: lat, lng: lng } } } } } }
30+ ways : HashMap < u64 , Vec < u64 > > , // aux structure { way_id: [ relation_id ] }
31+ stops : HashMap < u64 , Vec < u64 > > , // aux structure { node_id: [ relation_id ] }
1632}
1733
34+ // worker which processes one part of the data
1835fn blobs_worker ( req_rx : Receiver < Blob > , res_tx : SyncSender < Data > ) {
36+ let routetypes_stops = [ "train" , "subway" , "monorail" , "tram" , "light_rail" ] ;
37+ let routetypes_all = [ "train" , "subway" , "monorail" , "tram" , "light_rail" , "bus" , "trolleybus" ] ;
38+
1939 let mut collecteddata = Data {
20- nodeslat : HashMap :: new ( ) ,
21- nodeslon : HashMap :: new ( ) ,
40+ pt : HashMap :: new ( ) ,
41+ ways : HashMap :: new ( ) ,
42+ stops : HashMap :: new ( ) ,
2243 } ;
2344 loop {
2445 let blob = match req_rx. recv ( ) {
@@ -30,9 +51,18 @@ fn blobs_worker(req_rx: Receiver<Blob>, res_tx: SyncSender<Data>) {
3051 let primitive_block = PrimitiveBlock :: parse ( & data) ;
3152 for primitive in primitive_block. primitives ( ) {
3253 match primitive {
33- Primitive :: Node ( node) => {
34- collecteddata. nodeslat . insert ( node. id , node. lat ) ;
35- collecteddata. nodeslon . insert ( node. id , node. lon ) ;
54+ Primitive :: Relation ( relation) => {
55+ // relation.members()
56+ let routetag = relation. tags ( ) . find ( |& kv| kv. 0 == "route" ) ;
57+ let nametag = relation. tags ( ) . find ( |& kv| kv. 0 == "name" ) ;
58+ if routetag != None && routetypes_all. contains ( & routetag. unwrap ( ) . 1 ) && nametag != None {
59+ // condicion para saber si esta relation es un public transport
60+ collecteddata. pt . insert ( relation. id , RelationData {
61+ name : nametag. unwrap ( ) . 1 . to_string ( ) ,
62+ ways : HashMap :: new ( ) ,
63+ fixed_way : Vec :: new ( ) ,
64+ } ) ;
65+ }
3666 } ,
3767 _ => { }
3868 }
@@ -67,33 +97,27 @@ fn main() {
6797 req_tx. send ( blob) . unwrap ( ) ;
6898 }
6999
70-
100+ // reduce / join all data from workers into one structure
71101 let mut collecteddata = Data {
72- nodeslat : HashMap :: new ( ) ,
73- nodeslon : HashMap :: new ( ) ,
102+ pt : HashMap :: new ( ) ,
103+ ways : HashMap :: new ( ) ,
104+ stops : HashMap :: new ( ) ,
74105 } ;
75106 for ( req_tx, res_rx) in workers. into_iter ( ) {
76107 drop ( req_tx) ;
77108 let worker_collecteddata = res_rx. recv ( ) . unwrap ( ) ;
78- collecteddata. nodeslat . extend ( worker_collecteddata. nodeslat ) ;
79- collecteddata. nodeslon . extend ( worker_collecteddata. nodeslon ) ;
80- }
81-
82- let mut avglat = 0.0 ;
83- let mut count = 0 ;
84- for ( _key, value) in collecteddata. nodeslat . iter ( ) {
85- count += 1 ;
86- avglat += value;
109+ collecteddata. pt . extend ( worker_collecteddata. pt ) ;
110+ // TODO: these two are wrong, we need to merge the Vecs for the same key
111+ // collecteddata.ways.extend(worker_collecteddata.ways);
112+ // collecteddata.stops.extend(worker_collecteddata.stops);
87113 }
88- print ! ( "avg lat: {:?}" , avglat / count as f64 ) ;
89114
90- let mut avglon = 0.0 ;
91115 let mut count = 0 ;
92- for ( _key , value) in collecteddata. nodeslon . iter ( ) {
116+ for ( key , value) in collecteddata. pt . iter ( ) {
93117 count += 1 ;
94- avglon += value;
118+ print ! ( "{:?}: {:?} \n " , key , value. name ) ;
95119 }
96- print ! ( "avg lon: {:?}" , avglon / count as f64 ) ;
120+ print ! ( "\n Found {:?} relations \n " , count) ;
97121
98122 }
99123}
0 commit comments