Trails and Graph Theory 20: Desimplify

In a previous article we showed how to extract a rudimentary databook from a route on a OSMnx graph. Now let us see how we can improve the output.

Reversing Simplify

One problem noticed since that article is that the OSMnx simplify_graph() function that removes 2nodes can cause trail names to be concatenated together, making it hard to know what trail you are supposed to be on. Another issue is that we want to list in our databook each time a trail crosses a road or another trail, and that information was lost when we simplified and removed 1nodes.

After simplify_graph(), here is an example of a ‘name’ attribute on a trail section (edge):

Cooney Canyon Trail (201),Cooney Canyon/Mineral Creek Trail,McKean                             

Or another example:

Bursum Road,Middle Fork Trail,Snow Canyon Trail #142,Forestry Road 652,Forest Road 1421,Loco Mountain Road   

These concatenated names are also displayed on our map when you hover over trails, and also on my tracks that I exported for use by a GPS app.

The simplify_graph() function has an argument that preserves all the node pairs in a simplified edge, saving them in the edge attribute ‘merged_edges‘. From the node pairs we should be able to go back to the original graph and “desimplify” to see all individual trail segments before they are concatenated together.

for u,v,k,d in J.edges(keys=True,data=True):
    if 'merged_edges' in d:
        merged_edges = d['merged_edges']
    else:
        merged_edges = [ [u,v] ]

    if len(merged_edges)==0:
        continue

    for s,t in merged_edges:
        if GTR.has_edge(s,t):
            for kg in GTR[s][t]:  #fix improve
                dat = GTR[s][t][kg]
                K.add_edge(s,t,key=None,**dat)
                break
        elif GTR.has_edge(t,s): # in case 1-way divided street around Silver City
            for kg in GTR[t][s]:  #fix improve
                dat = GTR[t][s][kg]
                K.add_edge(t,s,key=None,**dat)
                break
        else:
            print('FATAL ERROR WITH MERGED EDGES',s,t) 
            continue

The resulting graph is rather large, with edges typically 0.1 miles in length or smaller, showing each bend in the trail, going from 217 nodes in the simplified graph to over 40000 in the unsimplified.

[link to map full screen]

We will be able to use the desimplified graph to create a more detailed databook, which we explore in the next post.

Download source code here.

Related Posts:

Author: Jim, Sagebrush

Jim (trail-name Sagebrush) codes audio software for Windows, Linux, Android, and embedded systems. When not working at sagebrush.com, he enjoys backpacking, which this blog is about.

Leave a Reply

Your email address will not be published. Required fields are marked *