/sewergraph

Network analysis for sewer systems

Primary LanguagePython

sewergraph

v0.1.4

Build status Build Status

Building upon Networkx, this package provides tools for analysis and manipulation of sewer network data.

Goals

Provide graph functions to tackle analytical problems typical in sewer collections systems:

  • traverse sewer networks up/downstream
  • accumulation calculations
  • downstream choke-point analysis
  • data gap handling (within reason, folks)
  • design capacity analysis

Installation

Inspired by osmnx, sewergraph depends on Networkx and Pandas. For most use cases, installation is easy:

$ pip install sewergraph

Additional functionality is provided that makes use of GeoPandas, scipy and Shapely. It's recommended to install GeoPandas with conda first, then install sewergraph via pip:

$ conda install geopandas
$ pip install sewergraph

If you have ArcMap installed, be sure that the GeoPandas installation doesn't conflict with arcpy. To avoid risks, install sewergraph in a conda environment:

$ conda create --name myenv
$ activate myenv #enter the new environment
$ conda install geopandas
$ pip install sewergraph

Examples

Create a Networkx DiGraph with a shapefile of a sewer network.

import sewergraph as sg

#read shapefile into DiGraph
shapefile_path = r'path/to/sewers.shp'
G = sg.graph_from_shp(shapefile_path)

Attributes of each sewer segment are stored as edge data. Geometry is parse and stored in the geometry attribute along with whatever other fields exist in the shapefile.

#sewer connecting node 0 to node 1
print(G[0][1])
{
  'OBJECTID': 115081,
  'STREET': 'ADAINVILLE DR',
  'ShpName': 'sample_sewer_network_1',
  'diameter': 8,
  'facilityid': 'BCE7B25E',
  'geometry': <shapely.geometry.linestring.LineString at 0x12a6caf0>,
  'height': 0,
  'length': 164.758,
  'local_area': 39449.474,
  'material': 'VCP',
  'pipeshape': 'CIR',
  'slope': 0.01,
  'width': 0
}

Calculate the total drainage area at each sewer by accumulating local_area from the top to bottom of the network (i.e. sewershed).

#accumulate drainage area
G = sg.accumulate_downstream(G, 'local_area', 'total_area')

#convert to GeoDataFrame and sort the sewers by total_area
sewers = sg.gdf_from_graph(G)
sewers = sewers.sort_values(by = 'total_area', ascending=False)
sewers.head()
total_area OBJECTID facilityid pipeshape diameter height width length slope material STREET local_area geometry
19 4,233,504 112545 A58064DF BOX 0 12 16 327.279370 0.0075 RCP None 119043.524941 LINESTRING (6558821.45028765 2032961.24586616,...
18 4,114,461 112546 5890D18F BOX 0 12 16 318.081402 0.0100 RCP None 171961.403740 LINESTRING (6558826.08945222 2032643.19829701,...
24 3,942,499 112563 12FF7372 BOX 0 12 16 131.352534 0.0100 RCP None 16557.605522 LINESTRING (6558821.78250872 2032511.9163921, ...

More functions are provided for calculating basic hydraulic capacity, outfall loading, flow splits, travel time, and identifying downstream constrictions from every point of the network.

#perform basic sewer capacity calculations (full flow Mannings capacity)
G = hhcalcs_on_network(G)

#id flow split sewers and calculate split fractions
G = analyze_flow_splits(G)

#accumulating travel times
G = accumulate_travel_time(G)

Running Tests

Test are located in the sewergraph > tests directory and are run with pytest.