diff options
| author | Gustav Sörnäs <gusso230@student.liu.se> | 2020-12-16 11:12:24 +0100 |
|---|---|---|
| committer | Gustav Sörnäs <gusso230@student.liu.se> | 2020-12-16 11:12:24 +0100 |
| commit | ff702dfc656b289223e3700e66872c371e365a25 (patch) | |
| tree | 25f7b787775c6edf6e604c8010d4be5299fda0b2 /store.py | |
| parent | 90cba31d48974f1b7f694e570f8732098359a5ea (diff) | |
| parent | 066929eab31d55573aa7038df1f0be8a6555cfe5 (diff) | |
| download | tdde25-ff702dfc656b289223e3700e66872c371e365a25.tar.gz | |
Merge remote-tracking branch 'origin/implement-mode-of-transport'
Diffstat (limited to 'store.py')
| -rw-r--r-- | store.py | 113 |
1 files changed, 102 insertions, 11 deletions
@@ -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 |
