Tuesday 26 December 2017

arcgis desktop - Assigning points to their respective Reaches using Stream Gradient?



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



Answer



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)

No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...