Re: [GRASS-user] Merge spatially connected features

2020-03-05 Thread Micha Silver


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

[GRASS-user] RES: v.centerline addon

2020-03-05 Thread cesar
Hi Moritz and colleagues!!

 

Thank you for write and being help me. About the python version make sense
because I’m using Python 3.7.

 

I’ll try install Python 2.x and run again the addon v.centerline and I’ll
tell about the result.

 

Tks.

 

César de Paula

 

De: Moritz Lennert  
Enviada em: quinta-feira, 5 de março de 2020 05:10
Para: ce...@fototerra.com.br; grass-user@lists.osgeo.org
Assunto: Re: [GRASS-user] v.centerline addon

 

 

On 4/03/20 18:10, ce...@fototerra.com.br 
wrote:

Hello!!!

 

I’m new user on GRASS and I’m trying to execute the addon v.centerline on
GRASS 7.9. As input I’m using a shapefile containing line (MultiLineString)
as geometry and when I have run the v.centerline an erro is returning:

 

“Traceback (most recent call last):

  File "C:\Users\cesar\AppData\Roaming\GRASS7\addons/scripts

/v.centerline.py", line 319, in 

main()

  File "C:\Users\cesar\AppData\Roaming\GRASS7\addons/scripts

/v.centerline.py", line 111, in main

segment_input += 'P ' + category.strip()

TypeError: can only concatenate str (not "bytes") to str

(Wed Mar  4 17:27:25 2020) Comando terminado (3 segundos)


(Wed Mar  4 17:27:25 2020)


v.centerline input=Linha_rio_teste_Centerline@PERMANENT output=teste range=2
refline=2

Traceback (most recent call last):

  File "C:\Users\cesar\AppData\Roaming\GRASS7\addons/scripts

/v.centerline.py", line 319, in 

main()

  File "C:\Users\cesar\AppData\Roaming\GRASS7\addons/scripts

/v.centerline.py", line 111, in main

segment_input += 'P ' + category.strip()

TypeError: can only concatenate str (not "bytes") to str

(Wed Mar  4 17:27:28 2020) Comando terminado (2 segundos)”

 

I would like help to try understand what’s happening.

 

I would guess that this is a Python 3 vs Python 2 issue. I never updated the
addon to Python 3. If someone else can do this, it would be great, as I'm
currently on mission abroad and do not really have the necessary access to
the development tools to do this from here.

 

Moritz

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

Re: [GRASS-user] Merge spatially connected features

2020-03-05 Thread Johannes Radinger
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:

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


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`
echo $POLYLINES
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

HTH


Cheers,
Johannes

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

Re: [GRASS-user] v.centerline addon

2020-03-05 Thread Moritz Lennert


On 4/03/20 18:10, ce...@fototerra.com.br wrote:


Hello!!!

I’m new user on GRASS and I’m trying to execute the addon v.centerline 
on  GRASS 7.9. As input I’m using a shapefile containing line 
(MultiLineString) as geometry and when I have run the v.centerline an 
erro is returning:


*“Traceback (most recent call last):*

*  File "C:\Users\cesar\AppData\Roaming\GRASS7\addons/scripts*

*/v.centerline.py", line 319, in *

*    main()*

*  File "C:\Users\cesar\AppData\Roaming\GRASS7\addons/scripts*

*/v.centerline.py", line 111, in main*

*    segment_input += 'P ' + category.strip()*

*TypeError: can only concatenate str (not "bytes") to str*

*(Wed Mar  4 17:27:25 2020) Comando terminado (3 segundos) *

*(Wed Mar  4 17:27:25 2020) *

*v.centerline input=Linha_rio_teste_Centerline@PERMANENT output=teste 
range=2 refline=2*


*Traceback (most recent call last):*

*  File "C:\Users\cesar\AppData\Roaming\GRASS7\addons/scripts*

*/v.centerline.py", line 319, in *

*    main()*

*  File "C:\Users\cesar\AppData\Roaming\GRASS7\addons/scripts*

*/v.centerline.py", line 111, in main*

*    segment_input += 'P ' + category.strip()*

*TypeError: can only concatenate str (not "bytes") to str*

*(Wed Mar  4 17:27:28 2020) Comando terminado (2 segundos)”*

I would like help to try understand what’s happening.



I would guess that this is a Python 3 vs Python 2 issue. I never updated 
the addon to Python 3. If someone else can do this, it would be great, 
as I'm currently on mission abroad and do not really have the necessary 
access to the development tools to do this from here.



Moritz

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