This is a continuation of the question I initially posed here.

Also, I've attached a shapefile on my Drop Box account here.

I'm trying to break a stream network up into 100m reaches, assigning elevation values pulled from a DEM, to the start and end of each segment, the goal being to determine gradient for each segment.

Process-wise, I'm not approaching this correctly. So far, I haven't been able to those z-values to the start and end nodes. What I've been doing is to segment the stream network, and using XTools, convert Features to Points, again, at 100m intervals. They do line up with the segments, as you can see below. From there, I can easily use XTools to pull raster values, and assign them to the points.

What I'm not able to do, is to assign those points back into the reaches. I can get one of them, sure, but not both. Thus, I can't calculate gradient.

Again, any help would be MUCH appreciated, particularly any sort of working example.

enter image description here

  • Does your shapefile retain any NHD attributes? Do you have a Flow table that accompanies the stream lines? – Kirk Kuykendall May 12 '11 at 3:13
  • It doesn't keep any NHD lines because this network was derived from a DEM instead. It certainly is possible for me to use the NHD lines however. No flow table, but thanks for the link. – Jacques Tardie May 12 '11 at 3:46
  • From what I gather, the flow table essentially adds the equivalent of the from/to_node attributes I currently have. I used ArcHydro to generate those once I'd split the polylines into 100m segments. – Jacques Tardie May 12 '11 at 3:50
  • Your sample data on Drop Box appears to have been removed. – Hornbydd Jun 19 '14 at 10:36

Several types of solutions are available. Let's focus on those not requiring any scripting.

Raster based

In principle the zonal range of each segment gives you the additional information needed to compute slope: just divide it by segment length. (The zonal range is one of the statistics returned by a "zonal summary" of the DEM using the segments as zones.)

In practice this needs to be corrected because ranges typically are decreased due to zone overlaps at the endpoints. Each point's elevation is assigned to just one of the segments.

In most cases things will work out so that each segment "keeps" one of its endpoints and loses the other to the adjacent segment (you can check that visually by converting the segments to a grid). Therefore, because stream elevations change monotonically, you can correct the ranges by extrapolating them out by one more cell. If 'c' is the cellsize and 'l' is the segment length, this extrapolation amounts to multiplying the estimated slopes by (l+c)/l. If stream lengths are long compared to the DEM resolution (c << l), this adjustment is inconsequential and can be ignored.

Route based

An elegant way to create the segments is by making the streams into "routes" which are "m-aware." By means of an event table (just a list of stream names and "mileages" down their reaches, easily prepared with a spreadsheet or short program) you then create the segments as "line events" along the route. With almost the same table you can create the segment endpoints as "point events". Because this is under your control, you can include identifiers for the segments and the points, thereby allowing you to match them (via database joins) afterwards.

Other software

Still have ArcView 3? You can extract the DEM values at the segment endpoints with two Field Calculator operations, one for each endpoint. :-) Use the .Along request (to get endpoints) and the .PointValue request (to read DEM values). Example:

av.FindDoc("View1").FindTheme("My Grid").GetGrid.PointValue([shape].Along(100), Prj.MakeNull)
  • I'm running Arc10. – Jacques Tardie May 11 '11 at 14:06
  • I'm intrigued with your Route based method. Could you give more detail as to how you'd accomplish this in Arc10? – Jacques Tardie May 11 '11 at 14:23
  • I just did this via your Zonal method. Thanks so much! I'm not going to say it's one of the most beautiful things I've ever seen, but it does feel like it! – Jacques Tardie May 11 '11 at 14:33
  • @Jacques I don't use Arc10, but it appears to have the same approach as earlier versions: look at the "Linear Referencing Tools" toolbox. Use "Create Routes" to make your streams m-aware and then "Make Route Event Layer" to create line and point events. – whuber May 11 '11 at 15:34

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.