.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "_auto_examples/network_manipulation/plot_create_from_layer.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr__auto_examples_network_manipulation_plot_create_from_layer.py: .. _project_from_link_layer: Create project from a link layer ================================ In this example, we show how to create an empty project and populate it with a network coming from a link layer we load from a text file. It can easily be replaced with a different form of loading the data (GeoPandas, for example). We use Folium to visualize the resulting network. .. GENERATED FROM PYTHON SOURCE LINES 15-18 .. admonition:: References * :doc:`../../aequilibrae_project/project_components` .. GENERATED FROM PYTHON SOURCE LINES 20-27 .. seealso:: Several functions, methods, classes and modules are used in this example: * :func:`aequilibrae.project.network.Links` * :func:`aequilibrae.project.network.Nodes` * :func:`aequilibrae.project.network.Modes` * :func:`aequilibrae.project.network.LinkTypes` .. GENERATED FROM PYTHON SOURCE LINES 29-41 .. code-block:: Python # Imports from uuid import uuid4 import urllib.request from string import ascii_lowercase from tempfile import gettempdir from os.path import join from shapely.wkt import loads as load_wkt import pandas as pd from aequilibrae import Project .. GENERATED FROM PYTHON SOURCE LINES 43-50 .. code-block:: Python # We create an empty project on an arbitrary folder fldr = join(gettempdir(), uuid4().hex) project = Project() project.new(fldr) .. rst-class:: sphx-glr-script-out .. code-block:: none No pre-existing parameter file exists for this project. Will use default No pre-existing parameter file exists for this project. Will use default .. GENERATED FROM PYTHON SOURCE LINES 51-54 Now we obtain the link data for our example (in this case from a link layer we will download from the AequilibraE website). With data, we load it on Pandas .. GENERATED FROM PYTHON SOURCE LINES 54-59 .. code-block:: Python dest_path = join(fldr, "queluz.csv") urllib.request.urlretrieve("https://aequilibrae.com/data/queluz.csv", dest_path) df = pd.read_csv(dest_path) .. GENERATED FROM PYTHON SOURCE LINES 60-62 Let's see if we have to add new link_types to the model before we add links The links we have in the data are: .. GENERATED FROM PYTHON SOURCE LINES 62-64 .. code-block:: Python link_types = df.link_type.unique() .. GENERATED FROM PYTHON SOURCE LINES 65-66 And the existing link types are .. GENERATED FROM PYTHON SOURCE LINES 66-70 .. code-block:: Python lt = project.network.link_types lt_dict = lt.all_types() existing_types = [ltype.link_type for ltype in lt_dict.values()] .. GENERATED FROM PYTHON SOURCE LINES 71-75 We could also get it directly from the project database with project.db_connection as conn: existing_types = [x[0] for x in conn.execute('Select link_type from link_types')] .. GENERATED FROM PYTHON SOURCE LINES 77-81 We add the link types that do not exist yet. The trickier part is to choose a unique link type ID for each link type. You might want to tailor the link type for your use, but here we get letters in alphabetical order. .. GENERATED FROM PYTHON SOURCE LINES 83-90 .. code-block:: Python types_to_add = [ltype for ltype in link_types if ltype not in existing_types] for i, ltype in enumerate(types_to_add): new_type = lt.new(ascii_lowercase[i]) new_type.link_type = ltype # new_type.description = 'Your custom description here if you have one' new_type.save() .. GENERATED FROM PYTHON SOURCE LINES 91-92 We need to use a similar process for modes .. GENERATED FROM PYTHON SOURCE LINES 92-96 .. code-block:: Python md = project.network.modes md_dict = md.all_modes() existing_modes = {k: v.mode_name for k, v in md_dict.items()} .. GENERATED FROM PYTHON SOURCE LINES 97-99 Now let's see the modes we have in the network that we DON'T have already in the model. .. GENERATED FROM PYTHON SOURCE LINES 101-102 We get all the unique mode combinations and merge them into a single string .. GENERATED FROM PYTHON SOURCE LINES 102-109 .. code-block:: Python all_variations_string = "".join(df.modes.unique()) # We then get all the unique modes in that string above all_modes = set(all_variations_string) # This would all fit nicely in a single line of code, btw. Try it! .. GENERATED FROM PYTHON SOURCE LINES 110-111 Now let's add any new mode to the project .. GENERATED FROM PYTHON SOURCE LINES 111-122 .. code-block:: Python modes_to_add = [mode for mode in all_modes if mode not in existing_modes] for i, mode_id in enumerate(modes_to_add): new_mode = md.new(mode_id) # You would need to figure out the right name for each one, but this will do new_mode.mode_name = f"Mode_from_original_data_{mode_id}" # new_type.description = 'Your custom description here if you have one' # It is a little different because you need to add it to the project project.network.modes.add(new_mode) new_mode.save() .. GENERATED FROM PYTHON SOURCE LINES 123-125 We cannot use the existing link_id, so we create a new field to not loose this information .. GENERATED FROM PYTHON SOURCE LINES 125-134 .. code-block:: Python links = project.network.links link_data = links.fields # Create the field and add a good description for it link_data.add("source_id", "link_id from the data source") # We need to refresh the fields so the adding method can see it links.refresh_fields() .. GENERATED FROM PYTHON SOURCE LINES 135-136 We can now add all links to the project! .. GENERATED FROM PYTHON SOURCE LINES 136-148 .. code-block:: Python for idx, record in df.iterrows(): new_link = links.new() # Now let's add all the fields we had new_link.source_id = record.link_id new_link.direction = record.direction new_link.modes = record.modes new_link.link_type = record.link_type new_link.name = record.name new_link.geometry = load_wkt(record.WKT) new_link.save() .. GENERATED FROM PYTHON SOURCE LINES 149-150 We grab all the links data as a geopandas GeoDataFrame so we can process it easier .. GENERATED FROM PYTHON SOURCE LINES 150-152 .. code-block:: Python links = project.network.links.data .. GENERATED FROM PYTHON SOURCE LINES 153-154 Let's plot our network! .. GENERATED FROM PYTHON SOURCE LINES 154-156 .. code-block:: Python links.explore(color="blue", style_kwds={"weight": 2}, tooltip="link_type") .. raw:: html
Make this Notebook Trusted to load map: File -> Trust Notebook


.. GENERATED FROM PYTHON SOURCE LINES 157-158 .. code-block:: Python project.close() .. rst-class:: sphx-glr-script-out .. code-block:: none This project at /tmp/8eb47b0b5bf74275b138fba2bc5854e8 is already closed .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 4.067 seconds) .. _sphx_glr_download__auto_examples_network_manipulation_plot_create_from_layer.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_create_from_layer.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_create_from_layer.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: plot_create_from_layer.zip ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_