[GRASS-user] center line with v.generalize ?

Hamish hamish_b at yahoo.com
Thu Jan 24 21:38:35 EST 2008


Gabriele wrote:
> I have a theme of a polygonal rivers. I have to locate the center line
> as a line that identifies the river. Obviously the edges of the river
> are not parallel and can not use v.parallel.
..
> I would locate the midline of the river.
> So I would like to transform the polygon with the middle line.

Maris:
> Just a quick idea - if vector map contains only rivers, You could try
> out v.to.rast and then r.thin till You get something similar to river
> and then convert back to vectors with r.to.vect.

Gabriele:
> I have already tried with r.thin etc. .. but sometimes I need a little
> too pixels (because the rivers is very narrow and contorted) to avoid
> errors of approximation.
> The problem is that choosing a region with high resolution happens '
> out of memory error '.


I have tried to solve this problem in a way similar to Maris's suggestion.
I was looking at fjords not rivers so my width was 500-1000m and I could
use the method at 10m resolution without region size problems.

For a long-thin river you might be able to do the processing piece-by-
piece in a moving region window then patch all the center line parts
together.

I am more interested in river-width than "river mile", I had hoped to
create a center line then v.to.rast that line and for each cell make a
line normal to the center-line and measure its distance (ie shore to shore
distance normal to center-line), and output a profile cross section (2 *
r.transect + bathy DEM). River width is interesting for things like
atmosphere-water surface coupling + heat/gas exchange, photo-reactive
dissolved organic chemistry exposure to sunlight, etc. -- a thinner
section of the river/fjord will expose less top-1m volume and (depending
on depth changes) may speed up the flow further reducing available
reaction time*spatial exposure.

Anyway I experimented with a few things, what I ended with AFAICR was
creating a land raster MASK with v.to.rast and the coastline, then
running r.cost to find distance to nearest shore. I then ran a
combination of r.slope.aspect + "r.mapcalc slope<5" and 'r.param.scale
param=feature' to look for ridges in the cost map. Then r.thin +
r.to.vect.

The result was a nice start, but there were some problems I still don't
know the answers to. For one thing the presence of islands in the channel
split the distance in two. I guess you could use v.extract and/or
v.dissolve to remove all islands before r.cost, then subtract island
width from the r.transect width later on? A second problem was what to do
when you came to a place where the channel forked.


here is an interesting link:
"Dynamic Segmentation and Thiessen Polygons: A Solution to the River Mile
Problem" [using Thiessen polygons] by William W. Hargrove, Richard F.
Winterfield, Daniel A. Levine:
  http://research.esd.ornl.gov/CRERP/DOCS/RIVERMI/P114.HTM


here are some old grass mailing list links, I though there was something
more recent, but don't see it now. the gmane threading seems a bit
broken, may nabble does better?
  http://thread.gmane.org/gmane.comp.gis.grass.user/12308
  http://article.gmane.org/gmane.comp.gis.grass.user/12332
  http://article.gmane.org/gmane.comp.gis.grass.user/12346
  http://thread.gmane.org/gmane.comp.gis.grass.user/12352
  http://img93.imageshack.us/my.php?image=schermorast73iv.png


be careful as river-mile can be a fractal problem.


Hamish



More information about the grass-user mailing list