I am using ArcGIS 10.4.1.

I am trying to extract watersheds for a number of random locations along a river network. These locations represent points where certain physio-chemical qualities of the river water are measured and I am interested in knowing for which cells in the DEM the water is flowing to this cell.

The datasets i have are:

  • A (filled) DEM (5m resolution) covering the entire study area (the whole of Flanders, a comparatively large area and thus a heavy file).
  • A polyline dataset containing the locations of all flemish rivers & waterways. This dataset is divided into many small segments which all have a unique code and contain beginning and end points consistent with the flow direction.
  • A shapefile containing the measuring points, I snapped these locations using the Near tool to ensure they're located on the rivers.

At first this seemed to be a straightforward problem as I have extracted watersheds many times before using the following sequence of tools: Fill->Flow Direction->Flow Accumulation->Snap Pour Points->Watersheds.

However the problem with the data is that the waterways are not consistent with the DEM: they do not necessarily follow the topography (Flanders has artificially changed the course of many rivers and also has many canals). A colleague advised me to 'burn' the rivers into the DEM (By converting them into a raster, giving them all an arbitrary low value (e.g. -2000) and adding that raster to the DEM). Thus my model has come to look like this (notice I have split up the last part of the analysis because there are two categories of points and otherwise there would be overlap between the watersheds of the different points):


Unfortunately, this approach does not seem to work and it yields very small, nonsensical watersheds that sometimes even violate the flow direction of the rivers. As such I myself with the help of colleagues have tried several other approaches:

  1. A colleague suggested that I simply try to extract the watersheds using the polyline dataset directly rather than using pour points. I have tried this, by first dissolving the polyine dataset so it becomes just one element and then breaking it up at the locations of the measuring points using the 'Split Line at Point' tool. This however splits the dissolved polyline not only at those points but also at all junctions (nodes) as well some random vertices. (I have tried to run the integrate tool first but to no avail.) I have no idea why the tool does this but it makes this approach useless. I have also tried to split the lines at the points manually but this still aggregates the lines in strange ways, leading to the following, bizarre pattern of watersheds:

Strange watersheds

  1. Since a shapefile containing the watersheds of all the small segments individually already exists, a possible approach would be to determine all the upstream segments and then add up all the small watersheds to one large one that would correspond to the watershed of the start point of the section on which the measuring point is located. To achieve this, I converted the rivers polyline dataset to a geometric network and subsequently used the trace upstream functionality that exists for this type of datasets. However, this yields no output and the group layer which is supposed to be created by the tool does not show up anywhere. I have never worked with networks before though so maybe (probably) I am doing something wrong.
  2. I imagine it must be possible to use Python to circumvent the experienced problems and extract the watersheds in a method uniquely suited to this situation. While I have limited experience in working with Python, I have never used it in conjunction with ArcGIS and would like to avoid this scenario since I imagine there is fairly steep learning curve and I simply do not have the time for that right now.

I'm at a loss as to how to proceed at this point.

  • Strange way of burning streams. Usually you drop existing elevation by some amount. Another way is converting Dem under stream to nodata and fill. Convert streams to integer grid, each reach. Compute reaches subcatchments. – FelixIP Sep 17 '17 at 20:56
  • Thanks for your thoughts PolyGeo. You say that normally you drop existing elevation by some amount but isn't that what is done here also? The existing elevation is lowered by a value of 2000 meters by adding up the two rasters: the DEM and the rivers dataset converted to a raster with river cells value of -2000. I would be interested in trying the alternative approach you propose that involves converting cells under streams to NoData and then filling them. However, could you elaborate what you mean with "Convert streams to integer grid, each reach." nad how I would go about doing that? – Arno vdh Sep 18 '17 at 7:11
  • Convert raeches to raster using oid field. Reach can be same Length part of stream segment or entire segment between junctions. – FelixIP Sep 18 '17 at 9:37
  • It is too flat in Flanders for the flow direction D8 algorithm to work effectively. The area is highly urbanized and storm water facilities would also need to be incorporated (burned) into any surface reconditioning. Check out this publication and the cited works file.scirp.org/pdf/JWARP20111200006_84386076.pdf – GBG Sep 20 '17 at 16:41
  • This is valuable, thank you. In the meantime I have made progress using networks but it is not a simple task. – Arno vdh Sep 21 '17 at 8:17

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.