summaryrefslogtreecommitdiffstats
path: root/store.py
diff options
context:
space:
mode:
authorGustav Sörnäs <gusso230@student.liu.se>2020-12-16 11:12:24 +0100
committerGustav Sörnäs <gusso230@student.liu.se>2020-12-16 11:12:24 +0100
commitff702dfc656b289223e3700e66872c371e365a25 (patch)
tree25f7b787775c6edf6e604c8010d4be5299fda0b2 /store.py
parent90cba31d48974f1b7f694e570f8732098359a5ea (diff)
parent066929eab31d55573aa7038df1f0be8a6555cfe5 (diff)
downloadtdde25-ff702dfc656b289223e3700e66872c371e365a25.tar.gz
Merge remote-tracking branch 'origin/implement-mode-of-transport'
Diffstat (limited to 'store.py')
-rw-r--r--store.py113
1 files changed, 102 insertions, 11 deletions
diff --git a/store.py b/store.py
index 87cd940..4bca5ee 100644
--- a/store.py
+++ b/store.py
@@ -53,30 +53,69 @@ def add_neighbours(nodes, parser):
node1 = road[i]
node2 = road[i + 1]
- nodes[node1].neighbours.append(nodes[node2])
- nodes[node2].neighbours.append(nodes[node1])
- # These two are neighbours and should be part of the same tree.
- nodes[node1].union(nodes[node2])
+ # FIXME: lots of repeated code here
+ if suitable_bike(way):
+ bike_nodes = nodes['bike']
+
+ bike_nodes[node1].neighbours.append(bike_nodes[node2])
+ bike_nodes[node2].neighbours.append(bike_nodes[node1])
+
+ # These two are neighbours and should be part of the same tree.
+ bike_nodes[node1].union(bike_nodes[node2])
+
+ if suitable_car(way):
+ car_nodes = nodes['car']
+
+ car_nodes[node1].neighbours.append(car_nodes[node2])
+ car_nodes[node2].neighbours.append(car_nodes[node1])
+
+ # These two are neighbours and should be part of the same tree.
+ car_nodes[node1].union(car_nodes[node2])
return nodes
def extract_osm_nodes(f_name):
parser = get_default_parser(f_name)
- nodes = dict()
- grid = defaultdict()
+ nodes = {
+ 'bike': dict(),
+ 'car': dict()
+ }
for node in parser.iter_nodes():
- new_node = Node(node['id'], node['lat'], node['lon'])
- nodes[node['id']] = new_node
+ # FIXME: this can probably be solved better
+ nodes['bike'][node['id']] = Node(node['id'], node['lat'], node['lon'])
+ nodes['car'][node['id']] = Node(node['id'], node['lat'], node['lon'])
add_neighbours(nodes, parser)
+ # FIXME: this can probably be solved better
# Remove nodes without neighbours
- for node_id, node in nodes.copy().items():
+ for node_id, node in nodes['bike'].copy().items():
+ if not node.neighbours:
+ del nodes['bike'][node_id]
+
+ for node_id, node in nodes['car'].copy().items():
if not node.neighbours:
- del nodes[node_id]
+ del nodes['car'][node_id]
+ nodes['bike'], unconnected_bike = make_forest(nodes['bike'])
+ nodes['car'], unconnected_car = make_forest(nodes['car'])
+
+ unconnected_nodes = {
+ 'bike': unconnected_bike,
+ 'car': unconnected_car
+ }
+
+ grids = {
+ 'bike': make_grid(nodes['bike']),
+ 'car': make_grid(nodes['car'])
+ }
+
+ return nodes, grids, unconnected_nodes
+
+
+def make_forest(nodes):
# Construct a forest of disjoint trees.
# The forest is a { root: tree }-dict. If we construct a relation where
# two nodes relate to each other if they are a part of the same tree,
@@ -108,6 +147,13 @@ def extract_osm_nodes(f_name):
unconnected_nodes.append(node)
nodes = best_tree
+
+ return nodes, unconnected_nodes
+
+
+def make_grid(nodes):
+ grid = defaultdict()
+
# create a "grid" by grouping nearby nodes.
for node in nodes.copy().values():
@@ -120,10 +166,55 @@ def extract_osm_nodes(f_name):
else:
grid[key] = [node]
- return nodes, grid, unconnected_nodes
+ return grid
def select_nodes_in_rectangle(nodes, min_lat, max_lat, min_long, max_long):
return [node for node in nodes.values()
if min_lat <= node.lat <= max_lat
and min_long <= node.lng <= max_long]
+
+
+def get_relevant_neighbours(nodes, transport_mode):
+ if transport_mode == "bike":
+ return nodes.neighbours_bike
+ else:
+ return nodes.neighbours_car
+
+
+suitable_highway_types_bike = [
+ # Special road types
+ 'living_street', 'service', 'pedestrian', 'track', 'road',
+ # ???
+ 'path'
+]
+
+def suitable_bike(way):
+ tags = way['tags']
+
+ suitable_generic_type = tags['highway'] in suitable_highway_types_bike
+ suitable_bike = False
+ # This implies you can go by bike for some reason
+ is_segregated = 'segregated' in tags
+
+ if 'bicycle' in tags:
+ bicycle_tag = tags['bicycle']
+ suitable_bike = bicycle_tag == 'yes' or bicycle_tag == 'designated'
+
+ return suitable_generic_type or suitable_bike or is_segregated
+
+
+suitable_highway_types_car = [
+ # Roads
+ 'motorway', 'trunk', 'primary', 'secondary',
+ 'tertiary', 'unclassified', 'residential',
+ # Link roads
+ 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link',
+ 'tertiary_link',
+ # Special road types
+ 'living_street', 'service',
+ 'pedestrian', 'road' # FIXME: Handle predestrian and road differently?
+]
+
+def suitable_car(way):
+ return way['tags']['highway'] in suitable_highway_types_car