Я пытаюсь использовать osmnx, чтобы найти расстояния между исходной точкой (широта / долгота) и ближайшей инфраструктурой, такой как железные дороги, вода или парки.
1) Я получаю весь график из области с network_type='walk'
.
2) Получить необходимую инфраструктуру, например, железная дорога для той же области.
3) Составьте два графика в один.
4) Найти ближайший узел от исходной точки в исходном графе.
5) Найти ближайший узел от начальной точки на графе инфраструктуры
6) Найдите кратчайшую длину маршрута между двумя узлами.
Если вы запустите приведенный ниже пример, вы увидите, что ему не хватает 20% данных, поскольку он не может найти маршрут между узлами. Для infrastructure='way["leisure"~"park"]'
или infrastructure='way["natural"~"wood"]'
это еще хуже, 80-90% узлов не подключены.
Минимальный воспроизводимый пример:
import osmnx as ox
import networkx as nx
bbox = [55.5267243, 55.8467243, 12.4100724, 12.7300724]
g = ox.graph_from_bbox(bbox[0], bbox[1], bbox[2], bbox[3],
retain_all=True,
truncate_by_edge=True,
simplify=False,
network_type='walk')
points = [(55.6790884456018, 12.568493971506154),
(55.6790884456018, 12.568493971506154),
(55.6867418740291, 12.58232314016353),
(55.6867418740291, 12.58232314016353),
(55.6867418740291, 12.58232314016353),
(55.67119624894504, 12.587201455313153),
(55.677406927839506, 12.57651997656002),
(55.6856574907879, 12.590500429002823),
(55.6856574907879, 12.590500429002823),
(55.68465359365924, 12.585474365063224),
(55.68153666806675, 12.582594757267945),
(55.67796979175, 12.583111746311117),
(55.68767346629932, 12.610040871066179),
(55.6830855237578, 12.575431380892427),
(55.68746749645466, 12.589488615911913),
(55.67514254640597, 12.574308210656602),
(55.67812748568291, 12.568454119053886),
(55.67812748568291, 12.568454119053886),
(55.6701733527419, 12.58989203029166),
(55.677700136266616, 12.582800629527789)]
railway = ox.graph_from_bbox(bbox[0], bbox[1], bbox[2], bbox[3],
retain_all=True,
truncate_by_edge=True,
simplify=False,
network_type='walk',
infrastructure='way["railway"]')
g_rail = nx.compose(g, railway)
l_rail = []
for point in points:
nearest_node = ox.get_nearest_node(g, point)
rail_nn = ox.get_nearest_node(railway, point)
if nx.has_path(g_rail, nearest_node, rail_nn):
l_rail.append(nx.shortest_path_length(g_rail, nearest_node, rail_nn, weight='length'))
else:
l_rail.append(-1)