# Estimating river Channel Width using Python/ArcGIS/MATLAB/R?

I am trying to estimate the river channel width from digitized polygon or poly-lines shapefiles. To do so, I converted poly-line shape files to points.shp at regular intervals (at 1 cm). Later, I calculated distance between corresponding points distance from both bank. However, points distribution are not uniform throughout both bank. Therefore, this method will yield much error in continuous width data set. I have calculated manually at regular interval of 100 m of 20 km river length using distance tool in ArcGIS but I need this in automation mode which can provide continuously width of the river channel.

I am open to other method. Can we draw perpendicular lines from right bank to left bank or vice-versa? Or can we draw transect lines at user defined interval across the river? If this possible then we can convert these perpendicular lines into shapefile. Later we can use intersect tool to get channel width. I posted snap of the points from polylines below for which I need to estimate width.This is just small reach of the river. Has anyone done anything like this before? If someone have better idea I would be happy to use that. • Just throwing out thoughts, could you take the river and slice it into small polygon sections, then calculate the area of the polygons, and using that to derive your width? – ed.hank Sep 24 '15 at 13:41
• If you have the centre line of your river network and a separate polygon layer representing the channel (as you see it on the map) then RivEX has a tool for automating the extraction of channel widths, have a look at the help file here. – Hornbydd Sep 24 '15 at 20:35
• I ran into the exact same problem. I figured, it can't be done without a reference line (I call it centerline) in the middle of the river. To these I calculated transects. See the R-package cmgo. Documentation. – Toni May 16 '17 at 12:17

The crux of the matter is finding a quantitative definition of "width" of the channel. Consider a point P located anywhere within the river. The width certainly cannot be any less than the shortest distance from P to the left bank plus the shortest distance from P to the right bank. A moment's thought suggests this is an excellent candidate for the width of the river at point P.

It is simple to calculate this quantity: sum the Euclidean distance grids for the left and right banks. Call this the [Width] grid.

It is now attractive to use the [Width] grid to find a route through the river passing through points of optimal (that is, minimal) width. Use [Width] as the impedance grid in a cost-distance calculation. (Set the impedance to null or very large values at all points not within the river.) Take as starting point A some location in the channel at the head of the river and as ending point B some location in the channel at the mouth of the river. The cost-distance algorithm will seek paths between A and B that pass through the locally smallest values of [Width]. Any one of these will go as straight as possible through the river from A to B. The values of [Width] encountered along such a path provide the "continuous width of the river channel" you seek.

This evidently is a straightforward costdistance calculation. The whole workflow can therefore be fully automated after A and B are selected. Even determining A and B can be automated, in various ways. For instance, if you already have a polyline representation of the river segment, use its endpoints. If not, simplify the river representation into a polyline and use that. You could also identify the four endpoints of the two river bank polylines and use the midpoints of the upper pair and lower pair. For a river (as opposed to a lake-like waterbody), those two pairs can automatically be identified as the two pairs that are closest to each other.

I apologize that I haven't the time to illustrate this procedure.

• I do not agree. Although, the "width (...) cannot be any less than the shortest distance from P to the left bank plus (...) to the right bank". But, no, this (...) "suggests this is an excellent candidate for the width of the river at point P". Because, the real width can and will be more, in cases where the river banks are curvy. Given you have a pocket (as shown in the red bank of the example of the OP). The both distances from a point P in there to the banks would be attracted by the nearest points. However, the actual width there is more. The problem can't be solved without a centerline! – Toni May 16 '17 at 12:13
• @Toni I have no problem with disagreement, because (as I suggest in the first sentence) the issue concerns what role "width" plays in any analysis and how to quantify it, both of which could vary from one application to another. I see you have posted an answer and I appreciate that. (I developed software for the approach you advocate some 15 years ago, and posted it on the ESRI site, but ESRI has since abandoned all that material.) Your answer unfortunately lacks any discussion of what kinds of problems that solution answers and what its advantages and disadvantages might be. – whuber May 16 '17 at 12:49
• That's correct and I agree. The definition of the width actually is not trivial and depends on the application. During the last EGU metting I saw tons of approaches. In our case we found the most objective approach via a centerline. In fact, we where inspired by this thread to work on something. I review in the paper many GIS solutions. There ARE solutions but I still hope that a scriptable, open-source, full-stack solution helps the community ;) Thanks for your input! – Toni May 16 '17 at 12:58

Here is a list of some of the tools I know of that could be helpful for you:

• The Arc Hydro Tools or the HEC-GeoRas tools (which I think were developed partially from Arc Hydro tools). While there is a lot going on with these you may not need, they have the ability to create Cross Sections at specified distances, from which you could get your widths. The HEC-GeoRAS tools are used to develop hydraulic models, for which width is obviously important.

• I have seen this "Perpendicular Transects" tool mentioned on this forum as well.

• A possible solution for R is the AMBUR project. Like the HEC-GeoRAS tools, it goes beyond your initial question, but a part of the tool includes creating transects and calculating the distances.

I should note that I'm not sure exactly what you mean by 'continuous' width of river channel... not matter what you do, there will be some error in these calculations. You'll need to find the suitable balance between how many transects you need to get the desired results and the scale of your study.

I'm not sure how these would fit in to your method of automating this task, but it's possible you could find the methodology and/or code and apply it to your own script/tool, or whatever you are developing.

• AMBUR has a doubtful method of deriving the transects, though. – Toni May 16 '17 at 12:14

Since I cannot comment on his post yet, I would like to add to what Tangnar said.

We use a few different methods similar to this to estimate the distance that coastlines have moved.

The first is called DSAS (http://woodshole.er.usgs.gov/project-pages/DSAS/). It uses a baseline "offshore" and then casts lines and measure the intersect with each of your shorelines.

The second is AMBUR, which is similar but within R

And finally, we created our own method to quickly draw the lines that would transect your shorelines. We draw two lines outside the shorelines, convert them to points, then create a line from one point to the nearest point on the opposite line.

• You might consider using a simpler, comprehensive technique based on the Euclidean distance grid for the initial shoreline. The value at any new shoreline point is a lower bound for the amount by which it moved--and plausibly is a reasonable estimate for the total motion. Simply average these values over the new shoreline (a quick zonal statistic operation). One signal advantage of this approach is that it does not use arbitrary baselines or transects (and therefore avoids all the computation associated with their construction). – whuber Sep 24 '15 at 19:51
• Thanks for your help. I will apply what did you suggest. Continuous channel width means to make width vs distance profile which will highlight the zones where width is narrowest and largest in whole channel width series. This is used to monitor channel migration in river. We can see temporal changes in channel width using satellite images. – Amit Sep 25 '15 at 6:54

If you like R, there is the R-package cmgo which does exactly what you are looking for: it calculates a centerline first, derives the width locally and the reports the bank shifts (if several surveys are provided). Visualization of the work flow of the package, a) the channel bank points represent the data input, b) a polygon is generated where bank points are linearly interpolated, c-e) the centerline is calculated via Voronoi polygons, f) transects are calculated, g) the channel width is derived from the transects.

Basically, it follows the idea of @PolyGeo but does it all in one solution. It is open source, well documented and has tons of options for parametrization.

Here would be a procedure suggestion using Matlab and the mapping toolbox. this is not a turnkey solution, but if you are familiar with matlab, it would provide you the advantage of automation and replication on many rivers.

1- Produce a centerline, either by hand in ArcGis or produce it automatically (google for a method). I have'nt found a way that does'nt require editing.

3-Smooth and [Centerlineb]=sgolayfilt(Centerline, other parameters)

4- increase the number of vertices on your centerline Something like this npoints=5 % uneven number, 5 would add three vertices between each two vertices

``````for i=1:length(Y1)-1
%[linspace(x1,x2,npoints);linspace(y1,y2,npoints)]
interpointX=linspace(X1(i),X1(i+1),npoints);
interpointY=linspace(Y1(i),Y1(i+1),npoints);

CenterlineX=[CenterlineX interpointX];
CenterlineY=[CenterlineY interpointY];
end
Centerline(:,1)=CenterlineX';
Centerline(:,2)=CenterlineY';

end
``````

5- Resample your centerline to the desired interval create a vector of at desired interval ex. 20m Use the function interp1 to resample your centerline

For the next step, create a loop (moving window)

for i=1:length(centerline(:,1))

6- Generate orthonormals to each vertice of the centerline along a moving window. Discussion here might help you write this code

7- find the intersections between eachline and the river polygon. To do that, you could find for each transect, the closest point (minimum distance) between the two tips of your transect and the vertices of the polygon. (pdist functions for distances and min for minimum)

8- estimate the distance between the two intersections pdist function

save it within the loop, this is your width

Riverwidth(i,1)=pdist(input)

I know this question is old, but I have just uploaded a Matlab toolbox that will compute width from either 1) input channel mask or 2) input banklines (your case). It has a number of other tools that might be helpful to you; check it out here.

You will probably want to define a centerline (for parameterization of your along-stream variables i.e. width). If you have the same number of points in your left and right banklines, you can just take their pointwise average to define a centerline. Otherwise, you can resample the banks to have the same number of points using something like interparc, then perform the averaging.