On 3/5/20 10:47 AM, Johannes Radinger wrote:

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 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:

Maybe I misunderstood your question. The steps I tried use a stream_order column to group stream segments, then apply a new attribute "merged_id" to those stream orders that touch. i.e. that connect to the same confluence point.


Here's what I get using the nc_basic_spm mapset:


r.watershed elev=elevation accum=nc_facc drain=nc_fdir bas=nc_bas stream=nc_str thresh=1000 r.stream.order stream_rast=nc_str direct=nc_fdir elev=elevation accum=nc_facc stream_vect=nc_streams
ORDERS=`v.db.select -c nc_streams group=strahler column=strahler`
echo $ORDERS

# Create a new stream vector for each stream order

for o in $ORDERS; do

    v.extract input=nc_streams output=streams_${o} where="strahler=${o}"

    # Give each polyline it's own cat value

    v.build.polylines input=streams_${o} output=streams_${o}_polyline type=line cat=first

done


# patch the stream orders back together

POLYLINES=`g.list vect pattern="streams*polyline" separator=comma`

v.patch input=$POLYLINES output=streams_polylines

v.db.addcolumn map=streams column="merged_id INTEGER"


# And use v.distance to update that merged_id column from cat values in polylines vector
v.distance from=streams to=streams_polylines upload=cat column=merged_id
v.db.addcolumn map=nc_streams column="merged_id INTEGER"
v.distance from=nc_streams to=streams_polylines upload=cat column=merged_id

Now, all stream reaches that have the same order and are "touching" have the same merged_id. See the attached image.


If that's not your purpose, then just ignore...


v.clean --overwrite input=streams@PERMANENT output=streams_break tool=break v.build.polylines --overwrite input=streams_break@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?

cheers,

Johannes


Cheers,
Johannes

_______________________________________________
grass-user mailing list
grass-user@lists.osgeo.org <mailto:grass-user@lists.osgeo.org>
https://lists.osgeo.org/mailman/listinfo/grass-user

--
Micha Silver
Ben Gurion Univ.
Sde Boker, Remote Sensing Lab
cell: +972-523-665918

_______________________________________________
grass-user mailing list
grass-user@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/grass-user

Reply via email to