Самый короткий маршрут при преобразовании в LineString пропускает путь в OSMNX - PullRequest
1 голос
/ 25 мая 2020

Я пытаюсь сохранить маршрут на диск, построенный с помощью OSMNX. Созданный маршрут следует по дорожному пути, но когда я пытаюсь преобразовать путь в LineString, который я могу легко сохранить на диск, маршрут изменяется таким образом, что он не следует по дороге, которую вы можете сравнить на двух изображениях.

ORIGIN_point = (13.013206, 77.670987)
DESTINATION_point= (12.821339, 77.678500)          

G = ox.graph_from_point(ORIGIN_point, distance=10000, distance_type='network', network_type='drive')      

ORIGIN_node  = ox.get_nearest_node(G, ORIGIN_point)
DESTINATION_node  = ox.get_nearest_node(G, DESTINATION_point)                   




# find the route between these nodes then plot it
route = nx.shortest_path(G, ORIGIN_node, DESTINATION_node, weight='length')

Этот маршрут строится с использованием osmnx для кратчайшего пути IMAGE-1

from shapely.geometry import LineString, Point

graph_proj = ox.project_graph(G)
nodes_proj, edges_proj = ox.graph_to_gdfs(graph_proj, nodes=True, edges=True)
route_nodes = nodes_proj.loc[route]

# Create a geometry for the shortest path
route_line = LineString(list(route_nodes.geometry.values))

маршрут теперь преобразован в lineString IMAGE-2

Я хочу сохранить маршрут на диск в шейп-файле, помогите мне с этим.

1 Ответ

1 голос
/ 03 июня 2020

Это сохранит ваш маршрут кратчайшего пути OSMnx как геометрию LineString в шейп-файле:

import geopandas as gpd
import networkx as nx
import osmnx as ox
from shapely.geometry import LineString, MultiLineString
ox.config(log_console=True, use_cache=True)

orig = (13.013206, 77.670987)
dest = (12.821339, 77.678500)
G = ox.graph_from_point(orig, dist=10000, dist_type='network', network_type='drive')
orig_node  = ox.get_nearest_node(G, orig)
dest_node  = ox.get_nearest_node(G, dest)

# impute edge speeds, add travel times, calculate shortest path
G = ox.add_edge_speeds(G)
G = ox.add_edge_travel_times(G)
route = nx.shortest_path(G, orig_node, dest_node, weight='travel_time')

# OPTION 1: save node-to-node straightline route as shapefile
nodes, edges = ox.graph_to_gdfs(G)
route_nodes = nodes.loc[route]
route_line = LineString(route_nodes['geometry'].tolist())
gdf1 = gpd.GeoDataFrame(geometry=[route_line], crs=ox.settings.default_crs)
gdf1.to_file('route1')

# OPTION 2: save route edge geometries as shapefile
edges = edges.set_index(['u', 'v', 'key'])
geoms = [edges.loc[(u, v, 0), 'geometry'] for u, v in zip(route[:-1], route[1:])]
gdf2 = gpd.GeoDataFrame(geometry=[MultiLineString(geoms)], crs=ox.settings.default_crs)
gdf2.to_file('route2')
...