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
See also
Several functions, methods, classes and modules are used in this example:
# 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.696 seconds)