Skip to content

Commit c421715

Browse files
committed
parse public transport routes
1 parent 8e57e95 commit c421715

File tree

3 files changed

+50
-26
lines changed

3 files changed

+50
-26
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "osmptparser"
3-
version = "0.0.1"
3+
version = "0.0.2"
44
authors = ["Julian Perelli <jperelli@gmail.com>"]
55
edition = "2018"
66
license = "AGPL-3.0-or-later"

src/main.rs

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,36 @@ use std::thread;
1010

1111
use 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+
1328
struct 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
1835
fn 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!("\nFound {:?} relations\n", count);
97121

98122
}
99123
}

0 commit comments

Comments
 (0)