- Managing DEMs
- Topographic maps
- Mobile apps
The starting point for hydrology is a hydrologically sound DEM. Use a fill sinks or channel deepening algorithm.
There are many different ways of proceeding from here. A couple are outlined below. I originally used Approach 1, but Approach 2 seems to be an improvement.
Create Catchment Areas. There is a Catchment Area tool (in fact several), and six methods within the tool. For the purpose of delineating watercourses in steep terrain, the choice of method probably makes little difference.
This gives an output that is best viewed in log scale. You can do this via
Use the log scale version to determine the cutoff for what streams you want to see and which ones are too small. 10000 seems to give comparable results to the existing 1:25000 maps.
Note that if you don't have the entirety of the catchment, you may get erroneous results.
The following tool can be used to create channels (streams) - there are other options:
For 1:25000 maps, I've had reasonable results from using the following formula in the Raster Calculator to classify the streams into categories. Different scales may need different bounds, and this doesn't account for significantly larger rivers.
( log10 ( “Catchment Area@1” ) >= x) * ( log10 ( “Catchment Area@1” ) < y) * (“Channel Network@1” != 0)
Convert to vector using r.to.vect
The raw stream data is very jagged. Smooth using
Simplify using using:
Similar technique to approach 1. The following tool can be used to create channels (streams) - there are other options:
The Channel Network produces both a raster and a vector version of the streams.
Rather than trying to classify the raster stream layer, this approach classifies the vector layer directly from the underlying D8FlowAccumulation raster.
Open Attribute Table (F6), enable editing (Ctrl+E) and Open Field Calculator (Ctrl+I).
The following formula looks at the values in the underlying D8FlowLog layer at the start and end of each line and takes the largest, which is a reasonable approximation for stream size. The field type should be int, and the name can be whatever you want (I use Category). Note that you'd need to replace D8FlowLog in the formula below with your relevant layer id.
ceil(max(raster_value( 'D8FlowLog',1,make_point( $x_at(0),$y_at(0))),raster_value( 'D8FlowLog',1,make_point( $x_at(-1),$y_at(-1)))))-5