Take the 2-minute tour ×
Geographic Information Systems Stack Exchange is a question and answer site for cartographers, geographers and GIS professionals. It's 100% free, no registration required.

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.

share|improve this question
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? –  Haziq 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 :) –  Haziq Nov 19 '12 at 18:51

1 Answer 1

up vote 3 down vote accepted

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:

    Proximity

  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.

share|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 :) –  Haziq Nov 19 '12 at 18:47
    
I need to verify something; did I do step #3 right?: (sqrt(proximity))*(exp(distance/-bandwith)) –  Haziq 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

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.