I've performed hydrological analysis using r.watershed using GRASS and now I have some stream vectors for a large area. Next, I'm planning to taper these streams to varying width to make them appear more 'natural'.

Is there an easy way to taper huge amounts of drainage vectors?

I have Inkscape, GIMP, GRASS and QGIS at my disposal. I appreciate any help I can get, thanks.

  • 1
    I can't test this idea at the moment, so I'll just comment: approximately, the stream width will be proportional to some power of its mean flow (probably a power between 1/3 and 1/2). So, if you compute a focal mean of that power of the flow, you should be able to find a threshold corresponding roughly to the stream width (and you can vary that threshold to make the streams wider or narrower overall). – whuber Nov 18 '12 at 22:36
  • That makes sense. Haven't heard stream-tapering done this way before.. Has the process been documented in any way by anyone? – user8723 Nov 19 '12 at 3:39
  • Nope--as I said, it's an idea, not a tested procedure. But if you have a valid flowaccumulation grid readily available, it's easy to test it! – whuber Nov 19 '12 at 15:49
  • It looks great enough :) – user8723 Nov 19 '12 at 18:51

Tapering will emerge from an appropriate kernel smooth of a transformed streamflow grid. For a start, consider using the square root of stream flow and use an exponential kernel: the bandwidth of the kernel will determine the apparent width on the map.

Here is a sample workflow using operations commonly found in raster GISes such as Spatial Analyst, Idrisi, and--I believe--GRASS. It begins with a flow accumulation grid. A running example works with this one (a full 7.5 minute USGS DEM, 30 meter resolution, showing the log flow with graduated colors):

Flow accumulation

  1. Limit the streams to points having a flow accumulation exceeding some threshold. (This is routine).

    Flow in streams

  2. Compute distance and proximity grids to the stream cells. To do this you usually need to convert the streamflow itself to a categorical ("integer") grid. The proximity grid, by definition, contains the value of the nearest streamflow cell.

    Here is the proximity grid shown on the same log scale as the first grid:


  3. Compute the square root of the proximity. Divide the distance by the negative of the bandwidth and exponentiate the result. Multiply these two grids.

    Tapered streams

In this final image, steams (as after step 1, now shown in cyan) are overlaid on the result (shown in graduated shades of gray). The white-gray contour creates a visual threshold providing a good tapering effect. Vary the contour threshold to control the apparent width of the taper.

| improve this answer | |
  • 1
    There may be some strange constrictions where low-volume streams join high-volume streams. If those are a bother, they can be removed by repeating these calculations with ever higher initial thresholds to limit the streams at step (1)--this will wipe out lower-volume streams--and then taking the local maximum of all these calculations. – whuber Nov 19 '12 at 17:22
  • Wow. This is amazing - thanks for writing it all up! I'll be sure to put it all to test right away :) – user8723 Nov 19 '12 at 18:47
  • I need to verify something; did I do step #3 right?: (sqrt(proximity))*(exp(distance/-bandwith)) – user8723 Nov 27 '12 at 0:50
  • Looks good to me. What matters is whether you can find a value of bandwidth that does what you are looking for: if so, you got it right! – whuber Nov 27 '12 at 8:05

Your Answer

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