[GRASS-user] Merge spatially connected features

Johannes Radinger johannesradinger at gmail.com
Thu Mar 5 00:47:44 PST 2020

Hi Micha, hi all,

sorry for my late response...however, just today I managed to try your
approach of building polylines to connect "touching stream lines"...but...
On 24.02.20 16:48, Micha Silver wrote:

On 24/02/2020 10:45, Johannes Radinger wrote:

Hi all,
I have a large river network dataset (lines). Now I'd to assign unique
categories to each group of connected lines that have an attribute in

For example, my rivers are categorized based on some kind of stream order.
I want to group all rivers that belong to stream order 2 and are spatially
connected; each group should get a unique category value. I thought that I
could first extract all rivers with a particular attribute (e.g. stream
order = 2) which will provide me some scattered pattern of lines. Then I
need a spatial join tool to make subgroups of lines that are connected. How
can I achieve the latter? Any idea?

Here's a procedure that might work for you. Somewhat clunky, but I think it
gets what you want.

It's based on the v.build.polylines module to connect all touching stream
reaches. First extract each order from the stream vector into a new vector.
Then build polylines. Patch them all together. Now you have a polyline
vector with a single cat value for each set of original stream reaches that
had the same order and that were touching.

Unfortunately, the v.build.polylines tool does not work as it only does not
connect multiple (intersecting) lines like in a river network. As an
example I tried to build polylines from the stream network of the NC
dataset. Yous suggested approach should result that each sub-network (i.e.
river network that is not connected to another one) should get its own
ID/cat...however, v.build.polylines results in a connected stream network
that consists of multiple cats:

v.clean --overwrite input=streams at PERMANENT output=streams_break tool=break
v.build.polylines --overwrite input=streams_break at test output=streams_poly
cats=first type=line
d.vect -c map=streams_poly

So what would be needed here is some kind of tool that connects all
touching lines and assigns a common category value, similar to the
v.dissolve tool for polygon features. I can imagine that such a task might
be not that uncommon also in another context? Any suggestions how to
achieve this in GRASS?

A workaround that came into my mind was to create buffers around lines in
order to make areas out of lines. Subsequently these touching areas can be
merged using v.dissolve and the information about the common category can
be queried using v.distance. Nevertheless, a rather cumbersome way to just
assign a common category value to all lines that are touching...

Any further ideas?



Finally, with v.distance you can upload that cat value to the original

# Get a list of stream orders
ORDERS=`v.db.select -c streams group=strahler column=strahler`
echo $ORDERS
#1 2 3 4 5 6
# How many stream segments in original
v.info -t streams | grep lines
# lines=1420

# Now loop thru list of stream orders and extract stream segments for each
for o in $ORDERS; do
        v.extract input=streams output=streams_${o} where="strahler=${o}"
        # Create polyline for each stream order
        # Line "connects" all touching stream segments
        v.build.polylines input=streams_${o} output=streams_${o}_polyline
type=line cat=first

# Patch stream order polylines together
POLYLINES=`g.list vect pattern="streams*polyline" separator=comma`
v.patch input=$POLYLINES output=streams_polylines
v.info -t streams_polylines | grep lines
# lines=738

# Add a new column to the original streams for new ID value
v.db.addcolumn map=streams column="merged_id INTEGER"
# And use v.distance to update that column from cat values in polylines
v.distance from=streams to=streams_polylines upload=cat column=merged_id



grass-user mailing list
grass-user at lists.osgeo.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/grass-user/attachments/20200305/3c0a39f1/attachment-0001.html>

More information about the grass-user mailing list