I have an ArcGIS question that is either very easy or impossible (my favorite kind). I am somewhat inexperienced when it comes to dealing with network analysis, so maybe I'm missing something major here.

I have a stream network covering a very large area & some census data. My problem is: I want to take each of the highest-order river mouths and associate a population value with it, which will tell you "here's how many people live in the drainage area derived from this pour point".

I understand the usual way to do this would be to delineate catchments using ArcHydro or Spatial Analyst Hydrology tools, which I've done many times (then I could associate said catchments w/ census data). In this case, however, the area of interest is huge, and the processing time for even one raster operation seems to be far longer than is acceptable.

Since I can't imagine that there's any way to delineate catchments w/o involving raster processing, I'm wondering if there's a way to do something like the following rough workaround:

Given a feature class of pour points, have ArcGIS go through each pour point & determine the upstream river network. I also have a separate shapefile of watershed polygons for the area, with associated population attribute. Then, tracing down the network to the river mouth, it could tell when the network crosses a polygon boundary, and then "add" the population of the new watershed it has entered to the subsequent downstream reach. So, it'd be kind of like a weighted flow accumulation, except the "cells" would be large watershed polygons, & it would need to know, as it traces along the network, when it's crossed into a new one. By the time it reaches the mouth, it will have tabulated the total populations of all the polygons the network has passed through.

In the following image: One river mouth of interest is circled in red (there would be hundreds of these, probably). The higher-order streams are selected in turquoise just for more visual clarity. Basically, I just want to see how many of the watershed polygons upstream the network leading to that mouth propagates through, & add up their populations.

River network and watersheds visual aid

Is anything like this at all possible? I would greatly appreciate any insight! Thanks!

(One non-automated way to do what I want is to put a flag at the river mouth using Utility Network Analyst, cross my fingers & hope that it's been placed correctly, use Trace Upstream to select the features connected to that mouth, extract those, & count up the populations of the watershed polygons they intersect with. Now if there was a way to automate doing this hundreds of times... -- unfortunately I don't know how to access that toolbar via arcpy or automate things that require human clicking)

  • 3
    Interesting question! It would help to use a visual aid and/or sample data to demonstrate the problem you are trying to solve. Also, are you comfortable using Python & arcpy?
    – blah238
    Oct 11 '13 at 2:29
  • Edited to include image! Yes I can handle a little Python/arcpy to do this if I need to but have no idea where to start... (Just realized I don't have the Network Analyst extension also).
    – user14175
    Oct 11 '13 at 14:46

Are you in the United States? Are you working at a scale of 100k or smaller? I'm really rusty on this stuff, but it might be worth looking at NHDPlus, National Hydrography Dataset Plus, because it is a dataset that, for the entire United States, already has "catchment" polygons built that are associated with stream "reach" vectors (again, already built) through common identifying attributes.


Particulary page 74 of the current user guide, "Building an NHDPlusV2 Attribute Accumulator." might get you what you want.


Good luck!

  • Thanks! Unfortunately this is Canadian data. But I hadn't run into the "attribute accumulator" guide before & I'm sure I'll be needing to do this with NHD data in the future.
    – user14175
    Oct 18 '13 at 13:27

Assuming your river network and watershed boundaries are really clean and hydrologically correct, something along the lines of the following procedure might work. I have only sketched this in my head, so this might need some creative adjustment (with python):

  1. Dissolve your river network by subwatershed ID, then assign the population value to that river reach.
  2. The dissolved river network will be used to create a geometric network (hopefully your flow directions are correct); use the population number as a network weight.
  3. Convert the dissolved river network (from step 1) and convert the polylines to points. These will be individual flags you use in an iterative model.
  4. Use the model builder and iterate through the points (flags) and run the trace network tool ("Find upstream accumulation") at each iteration (these tools are exposed in 10.1 under Data Management -> Geometric Networks).
  5. Aggregate the results from each run into a table, where each river reach (=subwatershed) will have the sum of upstream population assigned.
  • Interesting! This seems like it could really work. Step 3 wouldn't have occurred to me, and I didn't know about 4 (I'm running 10.0). The only problem I see is that there isn't a one-to-one association between reaches and catchments (like in NHD data ... this is for Canada), & each catchment is filled with a complex stream network. I don't know enough to know how rebuilding the network after step #1 would affect the integrity of the data. But a workaround might be to parcel out catchments' populations amongst the polyline segments in them.
    – user14175
    Oct 18 '13 at 13:25
  • I'm very interested to see if you can make this work with the Canadian data. I guess it depends weather or not those subwatershed IDs are based on the type of hydrological connectivity that is required by a geometric network. This may not be the case. Do let us know what you decided to do. Thanks!
    – G-wizard
    Oct 21 '13 at 20:09
  • How do I tell the network tool what is "Upstream" when I build the network? Basically how do I include the flow direction in the Network (step 2). Jul 21 '15 at 16:31
  • Flow direction is based on digitized direction of network edge features.
    – G-wizard
    Jul 22 '15 at 17:25

This could be done quite easily with RivEX and then using a simple model. One of the attribution tools in RivEX is to encode each catchment that drains to the sea with a unique ID.

Then you cycle through each ID (in a model you make), select all polylines for that ID and use that selection to select you polygon layer, then you can sum up your population field.

If you want to do this at a sub-catchment level, this is also achievable with RivEX as another tool creates tables which lists all polylines upstream of a polyline. So this logic would be get ID of polyline that pour point intersects, selects rows with this ID in the table that RivEX creates and then relate that selection to the network which can then be used to select your polygons. I give an example of using this table and relating selections here.

  • Thanks for the recommendation, looks like an interesting tool & definitely worth a look for the future. At the moment it would be good to at least eliminate the possibility of a free solution...
    – user14175
    Oct 12 '13 at 16:45

Your Answer

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

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