routing-lisbon/generate_graph.py

58 lines
1.7 KiB
Python

import json
import random
from copy import deepcopy
from collections import namedtuple
import access
from andyamo import types
from generator import generate_graph
from geopy import distance as geo_distance
Edge = namedtuple("Edge", ["start_id", "end_id", "distance"])
with open("data.json", "r") as f:
data = [json.loads(x.strip()) for x in f.readlines()]
def get_graph(profile: types.Profile):
node_set = set()
edges = list()
for feature in data:
try:
if access.is_accessible(feature, profile):
nodes = feature["feature"]["properties"]["nodes"]
if len(nodes) == 2:
coordinates = feature["feature"]["geometry"]["coordinates"]
for node in nodes:
node_set.add(f"id_{node}")
distance = 0
for i in range(len(coordinates)-1):
distance += geo_distance.distance(
coordinates[i], coordinates[i+1]
).m
edges.append(Edge(f"id_{nodes[0]}", f"id_{nodes[1]}", distance))
except Exception as e :
print(feature)
raise(e)
node_ids = list(node_set)
return node_ids, edges
node_ids, edges = get_graph(types.Profile("manual_wheelchair"))
generate_graph("manual_wheelchair.cpp", "c_manual_wheelchair", node_ids, edges)
node_ids, edges = get_graph(types.Profile("electric_wheelchair"))
generate_graph("electric_wheelchair.cpp", "c_electric_wheelchair", node_ids, edges)
node_ids, edges = get_graph(types.Profile("foot"))
generate_graph("foot.cpp", "c_foot", node_ids, edges)