Skip to main content

A Python package to find the centerline and width of rivers based on the latitude and longitude from a right and left bank

Project description

Centerline-Width

PyPi license

Python implementation of R-Code CMGO to find the centerline and width of rivers based on the latitude and longitude of a right and left bank

Data

Data is accepted as text file that is converted to a .csv script

     llat       llon      rlat       rlon
30.037581 -92.868569 30.119804 -92.907933
30.037613 -92.868549 30.119772 -92.907924
30.037648 -92.868546 30.119746 -92.907917
30.037674 -92.868536 30.119721 -92.907909
30.037702 -92.868533 30.119706 -92.907905
...

Left and Right Bank Latitude and Longtiude:

  • Header: llat, llon, rlat, rlon
  • Data in degrees

Requirements

Currently running on Python 3.7+

pip install -r requirments.txt

Running Script

Plot Centerline on Matplotlib

python3 river_centerline_width.py 

Output: river_coords+png

Return the Latitude/Longitude of Centerline

Documentation and Algorithm

The centerline is defined by the greatest distance from the right and left bank, created from a Voronoi Diagram. The remaining paths within the river are filtered through Dijkstra's algorithm to find the shortest path that is the centerline

Right and Left bank points are plotted (X-Axis for Latitude, Y-Axis for Longitude)

example+png

Generate a polygon to encapsulate the river between the right and left banks to define in and outside of river

example+png

Generate a Voronoi based on the points along the river banks

example+png

Display Voronoi ridge vertices that lie within the polygon (within the river banks)

example+png

Filter out any point pairs that only have one connections to filter out the short dead end paths

Find the starting and ending node based on distance from the top and bottom of polygon

example+png example+png

Find the centerline: shortest path from the starting node to the ending node (Dijkstra's Algorithm)

Points on River Bank NetworkX Graph of Points on River Bank
example+png example+png

example+png

This is an attempt at a more robust algorithm working from raw data to ensure that all dead ends are removed and no gaps exist in the centerline

Points that only have one connection are removed, but by limiting the number of connections for a point to just two will create gaps. The Voronoi vertices connect to other vertex values, but some connect to more and some only connect to one other point. Removing additional values will create gaps, so this is avoided in this code by not applying additional filters.

All vertices: example+png

Vertices that have at least two connections (that would create gaps): example+png

Edge Cases

Invalid Polygon example+png

Invalid Polygon example+png

Invalid Starting Node example+png

Citations

Based on the work:

Golly, Antonius & Turowski, Jens. (2017). Deriving principle channel metrics from bank and long-profile geometry with the R-package cmgo. Earth Surface Dynamics Discussions. 5. 1-19. 10.5194/esurf-5-557-2017.

Github - CMGO

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

centerline-width-0.0.1.tar.gz (3.8 kB view hashes)

Uploaded Source

Built Distribution

centerline_width-0.0.1-py3-none-any.whl (4.2 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page