Stream tapering adds realism to your map

By Aileen Buckley, Mapping Center Lead

Stream Tapering - Thumb

Stream tapering is a technique cartographers use to add realism to a map and help readers determine the direction of flow by using a wider line for downstream reaches than those upstream. Streams in nature vary in width due to things like flow, topography, or anthropogenic confinement. Tapering wider downstream lines into thinner ones upstream simulates the variation in stream width caused by increasing flow downstream. This method, which has long been used in cartography, is also described in Tom Patterson’s article, Getting Real: Reflecting on the New Look of National Park Service Maps on his web-site, Shaded Relief. Although he describes how he achieved the effect using Adobe Illustrator, this blog entry describes how you can use ArcMap to accomplish the same thing.

The example described here uses a map of southwestern Oregon in the Crater Lake area (figure 1).

Stream Tapering - OR Map

Figure 1. The Crater Lake area map

In essence, tapered streams are created in ArcMap by using the graduated symbols renderer with a hydro line feature class that contains an attribute, like flow, that can be used to logically vary the width of the line (figure 2).

Stream Tapering - No Tapering
Stream Tapering - With Tapering

Figure 2. Hydro line features symbolized without tapering (top) and with tapering (bottom)

For this exercise, we used National Hydrography Dataset Plus (NHDPlus) which has a mean annual flow attribute.

To access this data, visit the NHDPlus web-site. Download the National Hydrography Dataset and Catchment Flowline Attributes data, unzip it, and add it to ArcMap. Then join the attribute data to the NHD data so that you can use the MAFlowU attribute, which represents the annual flow (cfs) at bottom of flowline as computed by the unit runoff method.

Creating tapered streams is a two-step process:

  1. Define the streams that will be shown with tapering.
  2. Apply the symbology.

Step One

The first step is to define the streams that you want to show with tapering (figure 3).

Stream Tapering - All Streams

Figure 3. The map when all streams are shown. The hillshade and elevation have been added to provide context.

This is one of the first steps cartographers take to ensure that the right type and number of features are shown, given the final map scale (figure 4).

Stream Tapering - Subset of Streams

Figure 4. The map when only the larger streams are shown

To reduce the number of features shown on the map, you can use a definition query.

  1. Right-click the hydro lines layer in the table of contents and click Properties.
  2. On the Definition Query tab, click Query Builder.
  3. Input a query that will result in the features you want to be shown, for example, “MAFLOWU” > 60.
  4. Click OK.
  5. Click Apply to see the results.
  6. If necessary, refine the query.
  7. When you are done, click OK to close the Layer Properties dialog box.

Step Two

The next step is to symbolize the features:

  1. Right-click the layer in the table of contents and click Properties.
  2. Click the Symbology tab, and choose Quantities > Graduated symbols.
  3. Set the Value field to the attribute you want to use, for example, MAFLOWU.
  4. Change the symbol sizes, for example, 0.2 to 2.0 points.
  5. Click Template to change the symbol. In this example, a blue line with 0 197 255 as the RGB color definition was used (figure 5).
    Stream Tapering - Layer Properties
    Figure 5. The Layer Properties dialog box
  6. For the classification, change the number of classes to a number between 8 and 10. This number will vary based on how smoothly you want the streams to taper. Having fewer classes will enable the reader to more easily see the different line sizes that will be used. Having more classes will make the variation between connected line sizes less apparent.
  7. Click Apply to see the results.
  8. If necessary, refine the number of classes and, if desired, the class breaks.
  9. When you are done, click OK to close the Layer Properties dialog box.

When combined with other effects that promote a feeling of realism on a map, such as sun glints (described in a previous blog entry), hillshading, and elevation tinting, stream tapering provides a much more aesthetically pleasing impression (figure 6).

Stream Tapering - Final Map

Figure 6. The tapered streams with other “realistic” symbology such as sun glints, hillshades, and elevation tints

Learn about modifications you can make to simplify and label tapered streams in our previous blog entry, Symbolizing rivers and streams with proportional symbols.

Thanks to David Barnes, Cartographic Product Engineer, for his Crater Lake area map.

This entry was posted in Mapping and tagged , , , . Bookmark the permalink.

Leave a Reply


  1. hornbydd says:

    If you are not lucky enough to be using the NHD dataset but your own national river network that may not be attributed as well as the NHD you can achieve the same affect by graduating symbol size with total upstream network length. RivEX can build such network attribution which you can symbolize with.

  2. huffmanp says:

    I’ve been using tapered polygons representations to taper the upstream portion of streams in Washington State’s Fishhydro since ArcGIS 9.2 because I didn’t have an attribute for flow in the routed FC. Back in those days, you had to install tape.dll yourself.

    Except today I tried to do it again, and the tapers are going the wrong way. Don’t rember having a problem with direction before.

    • abuckley says:

      Here is a bit more info:

      In NHDPlus v2.1, there is no layer that contains the mean annual flow directly. In order to create it, one must download the NHD Snapshot and the EROM extension, and join the NHDFlow and EROM_MA0001 tables using the COMID as the join field. Six flow values are computed in EROM, through an iterative process, listed as A to F below:

      A. Cumulative runoff based on the runoff grids (Q1000A).
      B. The application of the Excess EvapoTranspiration (ET) step to the cumulative runoff (Q1000B).
      C. The flow adjustments based on the Reference Gage regression (Q1000C).
      D. The application of PlusFlowAR flow additions and removals, when known (Q1000D).
      E. Gage adjustment, in which the flows at the gages and a distance upstream from the gage are adjusted to match the gage flow. Statistics of the accuracy of this step are not possible because the gage adjustment is performed at every gage; the gage adjustment values will always be a “perfect” match to the gage flows (Q1000E).
      F. The gage adjustment performed with a randomly selected proportion of the gages removed (typically 20%); this process is referred to as gage sequestering. The gage sequestering provides a means to estimate the accuracy of the flows after the gage adjustment step (Q1000F).

      In our estimate, either the Q1000E or Q1000F reflect the best mean annual flows. More information can be obtained by reading the NHDPlusV2_User_Guide.pdf (pages 117- 128).

  3. abuckley says:

    The Tapered Polygon geometric effect uses a From Width and a To Width to control it, so you could reverse those values to get the opposite effect, or you could insert a Reverse geometric effect into the rule before the Tapered Polygon effect. The Reverse effect dynamically flips the line geometry that will be symbolized.

  4. huffmanp says:

    Another thing I discovered when I was making map animations of streamflow and fish movement ( I thought I would have to calculate a item for cubed root of the discharge to use for the width of the stream. But no, ArcGIS proportional line width symbology aready takes care of that for you. Buried way down somewhere I found this documented. Line width is proportional to the cubed root of the item.

  5. abuckley says:

    Thanks for the tip!

  6. huffmanp says:

    I keep searching NHD 2.1 but I haven’t found a layer that has an attribute for mean annual flow like MAFlowU. I thought NHDSnapshot\Hydrography\NHDFlowline.shp would be the one, but no joy.

  7. huffmanp says:

    It looks like in NHD version 2.1, you use item Q0001A in table EROMExtension*\EROM_MA0001 for mean annual flow.

    • abuckley says:

      There are 6 values for mean annual flow: from Q1A to Q1F. The Q1A is a theoretical flow resulting from a runoff model. It was noticed that is lower than observed, so a regression equation was applied and Q1B was derived. From Q1B, there are adjustments made to account for evapotranspiration, and Q1C was derived. I am not sure right now how the Q1D valeu was generated. But the best value for the mean annual flow is Q1E, which is the flow adjusted to observations in stream gates.

      It’s all documented under the EROM extension in the user’s guide.

  8. abuckley says:

    Glad you are getting sorted out on this!

    • huffmanp says:

      I was having really poor draw performance when I tried ESRI’s method with NHDPlusV2. Working with the Pacific NW 17c files, I joined NHDFlowline to EROM_MA0001 by COMID, created proportional line widths based on Q1E (had to increase the sample size in order to include large flow values for the Columbia River), added a definition query to select Q1E > 10, and left it run overnight. It looked pretty good, but I tried different things to see if I could speed up drawing.

      I copied NHDFlowline and EROM_MA0001 into a ArcGIS 10.1 file geodatabase, indexed each on their object ids, created an index in EROM_MA0001 on Q1E, joined them by COMID, and created proportional line widths based on Q1E, and it drew pretty fast. But when I added the query on Q1E, drawing slowed down to a crawl. Have you been able to get better draw times with different indexes?

      I also tried the option to keep only matching records when I joined NHDFlowline to EROM_MA0001. Again draw times were very slow when I also added a query for Q1E > 10. It was interesting which lines didn’t have matches in EROM_MA0001. Most irrigation canals in our region didn’t have a match, but I have other sources for canal flow in the Yakima Basin.

      • huffmanp says:

        I found a couple of work arounds for the slow draw performance.

        Drawing performance was somewhat improved by going back to NHD V1. I put the shapefile nhdflowline and the dbf table flowlineattributesflow.dbf into a file geodatabase, linked them on COMID, built indices on COMID and MAFLOWU. But that still took a few minutes to draw.

        But what really helped was removing the definition query that weeds out the tiny streams. Instead, I used the Graduated Symbols to weed out the tiny streams. I added one extra symbol class, then I manually set the first symbol range to 0 – 60 discharge variable (Q0001E in v2.1 or MAFLOWU in v.1) and set its width to 0. This drew much faster.

        • abuckley says:

          There are a couple of things you can do to speed up drawing performance:
          1. rather than using a definition query, create a new feature class that does not include features that you do not want to draw
          2. dissolve the features based on the attributes you need to either display or label features differently
          3. both of the above

          These techniques will result in a new data set that you can use to draw and label the map. Of course, this means you have one additional data set to think about if there are updates or changes that need to be propagated through to the final carto feature class, so you will need to weigh the pros and cons of the methods I suggest.

          Note that this is something we will commonly do with not only stream feature classes, but also roads, because they often have the same issues as streams when you are mapping them. For example, we discuss this cartographic workflow in the “Symbolizing rivers and streams” blog entry:

          One additional thing to think about is whether you want to generalize the streams for the map scale you are using. If the streams are too complex (you can tell that they are if the stream lines fall back in upon themselves and coalesce to appear like polygons in some areas), then simplify the lines using one of the tools in the Cartography > Generalization toolbox.