Skip to main content
`Ctrl`+`K`

Note

Go to the end to download the full example code.

# Editing network geometry: Splitting link

In this example, we split a link right in the middle, while keeping all fields in the database equal. Distance is proportionally computed automatically in the database.

References

- Link layer changes and expected behavior

See also

Several functions, methods, classes and modules are used in this example:

- `aequilibrae.project.network.Links()`

    # Imports
    from uuid import uuid4
    from tempfile import gettempdir
    from os.path import join
    from aequilibrae.utils.create_example import create_example
    from shapely.ops import substring
    import matplotlib.pyplot as plt

    # We create the example project inside our temp folder
    fldr = join(gettempdir(), uuid4().hex)

    project = create_example(fldr)

We will split link 37 right in the middle. Let’s get the link and check its length.

    links = project.network.links
    all_nodes = project.network.nodes

    link = links.get(37)
    print(link.distance)

    6010.108655014215

The idea is basically to copy a link and allocate the appropriate geometries to split the geometry we use Shapely’s substring.

    new_link = links.copy_link(37)

    first_geometry = substring(link.geometry, 0, 0.5, normalized=True)
    second_geometry = substring(link.geometry, 0.5, 1, normalized=True)

    link.geometry = first_geometry
    new_link.geometry = second_geometry
    links.save()

The link objects in memory still don’t have their ID fields updated, so we refresh them.

    links.refresh()

    link = links.get(37)
    new_link = links.get(new_link.link_id)
    print(link.distance, new_link.distance)

    3005.040184141035 3005.0684894898027

    # We can plot the two links only
    plt.clf()
    plt.plot(*link.geometry.xy, color="blue")
    plt.plot(*new_link.geometry.xy, color="blue")

    for node in [link.a_node, link.b_node, new_link.b_node]:
        geo = all_nodes.get(node).geometry
        plt.plot(*geo.xy, "o", color="black")
    plt.show()

    # Or we plot the entire network
    plt.clf()
    curr = project.conn.cursor()
    curr.execute("Select link_id from links;")

    for lid in curr.fetchall():
        geo = links.get(lid[0]).geometry
        plt.plot(*geo.xy, color="blue")

    all_nodes = project.network.nodes
    curr = project.conn.cursor()
    curr.execute("Select node_id from nodes;")

    for nid in curr.fetchall():
        geo = all_nodes.get(nid[0]).geometry
        plt.plot(*geo.xy, "o", color="black")

    plt.show()

    project.close()

Total running time of the script: (0 minutes 0.633 seconds)

Gallery generated by Sphinx-Gallery