Search code examples
pythonopenstreetmapnetworkx

OSMNx : get coordinates of nodes using OSM id


I used the Python library OSMNx to draw an optimal route between several steps of a city trip. The final variable is a list of OSM ids.

Now, I'm trying to save this route as a shp or json files. The problem is that I need for that the latitude/longitude of each node, but I didn't found an OSMNx function to do that.

I tried get_route_edge_attributes (but coordinates are not a valid attribute for this function). Is there any way to get coordinates of an OSM node with this single id ?


Solution

  • you have all the attribute of each node and edge in the Graph. you can get node attributes using:

    G.node[38862848]
    #out: {'highway': nan,
    # 'lat': 45.3210533,
    # 'lon': -122.9790558,
    # 'osmid': '38862848',
    # 'ref': nan,
    # 'x': 501641.47862882155,
    # 'y': 5018616.5723966481}
    
    G.node[38862848]['lat']
    # out: 45.3210533
    

    and to get edge attributes you can use G[u][v]:

    G[5035130880][4963510289]
    # out: 
    #{0: {'bridge': 'yes',
    #  'geometry': <shapely.geometry.linestring.LineString at 0x7f90ad7d5860>,
    #  'highway': 'secondary',
    #  'length': 671.332597496,
    #  'name': 'Northwest 185th Avenue',
    #  'oneway': False,
    #  'osmid': [124454683, 24446714, 124454682]}}
    

    All attributes are also in GeoDataFrame's of the graph. If you have list of nodes, the easiest way to get the geometry of all nodes is:

    import osmnx as ox
    import networkx as nx
    
    gdf_nodes, gdf_edges = ox.graph_to_gdfs()
    path = nx.shortest_path(G, G.nodes()[0], G.nodes()[1])
    gdf_nodes.loc[path]
    #out: 
    #        highway    lat lon    osmid    ref x   y   geometry    traffic_signals
    #5035130880 NaN 45.5637 -122.868    5035130880  NaN 510334  5.04558e+06 POINT (510334.0390091945 5045583.999886028) 0
    #4963510289 NaN 45.5698 -122.868    4963510289  NaN 510329  5.04625e+06 POINT (510329.3114555664 5046254.728223645) 0
    # ... 
    

    the output is a GeoDataFrame.