[GRASS-user] Merge spatially connected features

Johannes Radinger johannesradinger at gmail.com
Mon Mar 2 13:14:19 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 common.
>> 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 here as it does 
not connect multiple (intersecting) lines like in a river network. For 
example, I tried to build polylines from the stream network of the NC 
dataset. The 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  stream sub-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 is there any other way to join all lines that are touching...This 
would be something similar to v.dissolve but based on lines rather than 
on polygons.

Any ideas for a simple work around?



> Finally, with v.distance you can upload that cat value to the original 
> streams.
> # 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 order
> 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
> done
> # 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 vector
> v.distance from=streams to=streams_polylines upload=cat column=merged_id
>> Cheers,
>> Johannes
>> _______________________________________________
>> grass-user mailing list
>> grass-user at lists.osgeo.org
>> https://lists.osgeo.org/mailman/listinfo/grass-user

More information about the grass-user mailing list