[GRASS-dev] [GRASS GIS] #3756: r.watershed: flow accumulation wrong with edge contamination

GRASS GIS trac at osgeo.org
Tue Feb 19 02:57:33 PST 2019


#3756: r.watershed: flow accumulation wrong with edge contamination
-------------------------------------------------+-------------------------
 Reporter:  itati01                              |      Owner:  grass-dev@…
     Type:  defect                               |     Status:  new
 Priority:  normal                               |  Milestone:
Component:  Raster                               |    Version:  svn-
 Keywords:  r.watershed, flow accumulation,      |  releasebranch76
  edge contamination                             |        CPU:  Unspecified
 Platform:  Unspecified                          |
-------------------------------------------------+-------------------------
 Dear developers,

 I compared the results of the flow accumulation (=facc) in the independent
 Python module ''pysheds'' to '''r.watershed''' with the '''flag -a'''. The
 input of ''pysheds'' was the flow direction (=fdr, D8) created by
 '''r.watershed''', so the resulting rasters should be identical.

 The difference in facc (=pysheds - r.watershed) is zero for most of the
 raster, except for raster cells affected by edge contamination where
 ''pysheds'' overestimates facc compared to r.watershed. At first, I
 suspected an error in the much younger pysheds, however r.watershed seems
 to be the culprit.

 Note: The catchment I use is crossed by a channel, which in turn is
 crossed by streams. I removed this channel by setting the DEM to nodata
 except for the crossings + some buffer. So, I cannot exclude edge-
 contaminated cells.

 Small differences are along the majority of the nodata values and they
 increase downstream. The source of the problem could be a) a mis-
 interpretation of negative fdr or b) wrong facc in case of edge
 contamination (or unexpected behaviour). For ''pysheds'', I assumed that
 the absolute value indicates the direction and the negative sign indicates
 edge contamination. I was puzzled about the output of '''d.rast.arrow
 type=drainage''': the arrows are shifted, e.g. -2 was identical to +1 not
 +2. Also tested it with ''pysheds'' to no avail.

 (By the way, the output of '''d.rast.arrow''' looks wrong, e.g. the red
 rectangles in figure 1. If someone confirms this error, I can open a
 separate ticket for this issue. The error in '''d.rast.arrow''' would be
 here:
 {{{
 if (...map_type == 5) {
     ...
     aspect_c = (int)(aspect_f + 0.5);
 }
 }}}
 ).

 Most likely it is about the cumulation of negative values. Take the
 rectangle in figure 2 as an example. It contains raster cells 1-9, I am
 counting row-wise starting with the top left cell. One route is 8 + 9 -> 6
 + 1 -> 2 -> Channel in blue. ''Pyshed'' produces what I expect: facc == 3
 for cell6 and facc == 5 for cell2, while '''r.watershed''' calculates for
 all cells +1, or -1 without the flag -a.

 The reason is presumably: cells 8, 9 and 1 are edge contaminated (i.e.
 facc is turned to -1). So, for cell 6: facc = -1 + -1 + 1 = -1 (1 is the
 default weight for all cells). The calculation for cell 2 is identical.

 I suggest to ''subtract'' not to ''add'' the weights in case of edge-
 contaminated upslope cells.

-- 
Ticket URL: <https://trac.osgeo.org/grass/ticket/3756>
GRASS GIS <https://grass.osgeo.org>



More information about the grass-dev mailing list