OsmRx example¶

Imports and prepare input parameters¶

In [1]:
from IPython.display import display

from bokeh.plotting import output_notebook

output_notebook()
Loading BokehJS ...
In [2]:
# Set a location name
location = "Roanne"

Get POIs¶

In [3]:
%%time
from osmrx import Pois

pois_object = Pois()
pois_object.from_location(location)

# Get the roads data: a list of dict containing the geometry and the attributes
pois_data = pois_object.data
2025-01-02 14:07:20 - Pois            - INFO     : Building OsmFeatureModes.poi Data
2025-01-02 14:07:20 - Pois            - INFO     : Building the query
2025-01-02 14:07:21 - Pois            - INFO     : NominatimApi: Query 200:OK in 0.44 sec.
2025-01-02 14:07:21 - Pois            - INFO     : From Roanne
2025-01-02 14:07:21 - Pois            - INFO     : Building the query
2025-01-02 14:07:21 - Pois            - INFO     : Execute the query
2025-01-02 14:07:23 - Pois            - INFO     : OverpassApi: Query 200:OK in 1.47 sec.
CPU times: user 708 ms, sys: 53.1 ms, total: 761 ms
Wall time: 2.62 s

Get Roads¶

In [4]:
%%time
from osmrx import Roads

# Let's to get the roads network and connect POIs found on the same location
vehicle_object = Roads("vehicle",
                        pois_object.data)
vehicle_object.from_location(location)

# Get the roads data: a list of dict containing the geometry and the attributes
roads_data = vehicle_object.data
2025-01-02 14:07:23 - Roads           - INFO     : Building OsmFeatureModes.vehicle Data
2025-01-02 14:07:23 - Roads           - INFO     : Building the query
2025-01-02 14:07:23 - Roads           - INFO     : NominatimApi: Query 200:OK in 0.19 sec.
2025-01-02 14:07:23 - Roads           - INFO     : From Roanne
2025-01-02 14:07:23 - Roads           - INFO     : Building the query
2025-01-02 14:07:23 - Roads           - INFO     : Execute the query
2025-01-02 14:07:25 - Roads           - INFO     : OverpassApi: Query 200:OK in 1.23 sec.
2025-01-02 14:07:25 - Roads           - INFO     : Network cleaning...
2025-01-02 14:07:25 - Roads           - INFO     : Starting: Adding new nodes on the network
2025-01-02 14:07:25 - Roads           - INFO     : Find nearest line for each node
2025-01-02 14:07:25 - Roads           - INFO     : Split line
2025-01-02 14:07:25 - Roads           - INFO     : Starting: Find intersections
2025-01-02 14:07:25 - Roads           - INFO     : Done: Find intersections
2025-01-02 14:07:25 - Roads           - INFO     : Build lines
2025-01-02 14:07:27 - Roads           - INFO     : Graph built
CPU times: user 1.96 s, sys: 45.4 ms, total: 2 s
Wall time: 4.19 s

Display roads and nodes¶

In [5]:
%%time

from bokeh.plotting import show
import geopandas as gpd
from gdf2bokeh import Gdf2Bokeh

map_session = Gdf2Bokeh(
    "My network map",
    width=800,
    height=600,
    background_map_name="CARTODBPOSITRON"
)

map_session.add_layer_from_dict_list("Roads", roads_data, from_epsg=4326,
                                     color="black")
map_session.add_layer_from_dict_list("POIs", pois_data, from_epsg=4326,
                                     color="blue", size=9)

map_session.add_layers_on_maps()

show(map_session.figure)
BokehDeprecationWarning: 'circle() method with size value' was deprecated in Bokeh 3.4.0 and will be removed, use 'scatter(size=...) instead' instead.
CPU times: user 5.05 s, sys: 195 ms, total: 5.24 s
Wall time: 5.24 s

Check topology details¶

In [6]:
%%time

roads_topo_data = vehicle_object.topology_checker()

map_session = Gdf2Bokeh(
    "My topology network map",
    width=800,
    height=600,
    background_map_name="CARTODBPOSITRON"
)

map_session.add_layer_from_dict_list("Roads unchanged", roads_topo_data.lines_unchanged, from_epsg=4326,
                                     color="black")
map_session.add_layer_from_dict_list("Roads added", roads_topo_data.lines_added, from_epsg=4326,
                                     color="green")
map_session.add_layer_from_dict_list("Roads split", roads_topo_data.lines_split, from_epsg=4326,
                                     color="orange")
map_session.add_layer_from_dict_list("Intersections added", roads_topo_data.intersections_added, from_epsg=4326,
                                     color="red")
map_session.add_layer_from_dict_list("POIs added", roads_topo_data.nodes_added, from_epsg=4326,
                                     color="blue", size=9)

map_session.add_layers_on_maps()

show(map_session.figure)
2025-01-02 14:07:32 - Roads           - INFO     : Topology analysis built.
BokehDeprecationWarning: 'circle() method with size value' was deprecated in Bokeh 3.4.0 and will be removed, use 'scatter(size=...) instead' instead.
CPU times: user 2.17 s, sys: 1.9 ms, total: 2.17 s
Wall time: 2.16 s

Compute a shortest path¶

In [7]:
from osmrx.main.roads import GraphAnalysis

from_poi = pois_data[50]["geometry"]
to_poi = pois_data[60]["geometry"]

analysis_object = GraphAnalysis("pedestrian",
                                [from_poi, to_poi])
paths_found = analysis_object.get_shortest_path()
paths = []
for feature in paths_found:
    paths.extend(feature.features())

map_session = Gdf2Bokeh(
    "My computed path",
    width=800,
    height=600,
    background_map_name="CARTODBPOSITRON"
)

map_session.add_layer_from_dict_list("Path found", paths, from_epsg=4326,
                                     color="blue")
map_session.add_layer_from_geom_list("From", [from_poi], from_epsg=4326,
                                     color="red", size=9)
map_session.add_layer_from_geom_list("To", [to_poi], from_epsg=4326,
                                     color="green", size=9)

map_session.add_layers_on_maps()

show(map_session.figure)
2025-01-02 14:07:35 - GraphAnalysis   - INFO     : Building OsmFeatureModes.pedestrian Data
2025-01-02 14:07:35 - GraphAnalysis   - INFO     : Building the query
2025-01-02 14:07:35 - GraphAnalysis   - INFO     : From 46.032791452507176, 4.067489452507176, 46.04412544745645, 4.07191724745645
2025-01-02 14:07:35 - GraphAnalysis   - INFO     : Building the query
2025-01-02 14:07:35 - GraphAnalysis   - INFO     : Execute the query
2025-01-02 14:07:35 - GraphAnalysis   - INFO     : OverpassApi: Query 200:OK in 0.63 sec.
2025-01-02 14:07:35 - GraphAnalysis   - INFO     : Network cleaning...
2025-01-02 14:07:35 - GraphAnalysis   - INFO     : Starting: Adding new nodes on the network
2025-01-02 14:07:35 - GraphAnalysis   - INFO     : Find nearest line for each node
2025-01-02 14:07:35 - GraphAnalysis   - INFO     : Split line
2025-01-02 14:07:35 - GraphAnalysis   - INFO     : Starting: Find intersections
2025-01-02 14:07:35 - GraphAnalysis   - INFO     : Done: Find intersections
2025-01-02 14:07:35 - GraphAnalysis   - INFO     : Build lines
2025-01-02 14:07:35 - GraphAnalysis   - INFO     : Graph built
2025-01-02 14:07:35 - GraphAnalysis   - INFO     : Shortest path(s) built from POINT (4.0701086 46.0423168) to POINT (4.0692981 46.0346001).
BokehDeprecationWarning: 'circle() method with size value' was deprecated in Bokeh 3.4.0 and will be removed, use 'scatter(size=...) instead' instead.
BokehDeprecationWarning: 'circle() method with size value' was deprecated in Bokeh 3.4.0 and will be removed, use 'scatter(size=...) instead' instead.

Compute isochrones¶

In [8]:
from bokeh.palettes import all_palettes

from_poi = pois_data[50]["geometry"]
 
analysis_object = GraphAnalysis("vehicle", [from_poi])
isochrones_built = analysis_object.isochrones_from_distance([0, 250, 500, 1000, 1500], 0.6)

isochrones = isochrones_built.data
for pos, feature in enumerate(isochrones):
    feature["color"] = all_palettes['RdBu'][len(isochrones)][::-1][pos]

map_session = Gdf2Bokeh(
    "My isochrone",
    width=800,
    height=600,
    background_map_name="CARTODBPOSITRON"
)

map_session.add_layer_from_dict_list("Isochrones", isochrones_built.data, from_epsg=4326,
                                     color="color", line_color="white", fill_alpha=0.6)
map_session.add_layer_from_geom_list("From", [from_poi], from_epsg=4326,
                                     color="red", size=9)

map_session.add_layers_on_maps()

show(map_session.figure)
2025-01-02 14:07:36 - GraphAnalysis   - INFO     : Building OsmFeatureModes.vehicle Data
2025-01-02 14:07:36 - GraphAnalysis   - INFO     : Building the query
2025-01-02 14:07:36 - GraphAnalysis   - INFO     : From 46.01337844070291, 4.041170240702905, 46.071255159297095, 4.0990469592970955
2025-01-02 14:07:36 - GraphAnalysis   - INFO     : Building the query
2025-01-02 14:07:36 - GraphAnalysis   - INFO     : Execute the query
2025-01-02 14:07:37 - GraphAnalysis   - INFO     : OverpassApi: Query 200:OK in 0.64 sec.
2025-01-02 14:07:37 - GraphAnalysis   - INFO     : Network cleaning...
2025-01-02 14:07:37 - GraphAnalysis   - INFO     : Starting: Adding new nodes on the network
2025-01-02 14:07:37 - GraphAnalysis   - INFO     : Find nearest line for each node
2025-01-02 14:07:37 - GraphAnalysis   - INFO     : Split line
2025-01-02 14:07:37 - GraphAnalysis   - INFO     : Starting: Find intersections
2025-01-02 14:07:37 - GraphAnalysis   - INFO     : Done: Find intersections
2025-01-02 14:07:37 - GraphAnalysis   - INFO     : Build lines
2025-01-02 14:07:39 - GraphAnalysis   - INFO     : Graph built
2025-01-02 14:07:39 - GraphAnalysis   - INFO     : Isochrones [(0, 250), (250, 500), (500, 1000), (1000, 1500)] built from POINT (4.0701086 46.0423168).
BokehDeprecationWarning: 'circle() method with size value' was deprecated in Bokeh 3.4.0 and will be removed, use 'scatter(size=...) instead' instead.