[GRASS-user] Copy and concatenate a vector attribute between layers

Hi,

I have a vector (POINT) which has two layers containing relevant attributes (’strata’ and ’stand’). I would like to concatenate the two values into a new attribute for Layer 1 (’_’). I’ve been struggling to sort this out for too long and am tapping out. Its probably blatantly obvious but it has escaped me.

Thank you!

Here are some specifics.

east, north: 651849.842735, 6604949.78485
c34_patch@project_area:
Type: Point
Id: 21622
Layer: 1
Category: 21623
Driver: sqlite
Database: /Users/pete/grassdata/PortGraham/project_area/sqlite/sqlite.db
Table: c34_patch
Key_column: cat
Attributes:
cat: 21623
strata: 3 — STRATA
c34_patch@project_area:
Type: Point
Id: 21622
Layer: 2
Category: 10 — STAND

On 02/12/17 02:03, Peter Tittmann wrote:

Hi,

I have a vector (`POINT`) which has two layers containing relevant attributes (’strata’ and ’stand’). I would like to concatenate the two values into a new attribute for Layer 1 (’<STRATA>_<STAND>’). I’ve been struggling to sort this out for too long and am tapping out. Its probably blatantly obvious but it has escaped me.

Probably the easiest way if your not very familiar with SQL:

- Create a new column in layer 1 where you can put the info from layer 2
- Fill this column with v.to.db option=query query_layer=2, etc
- Create a second new column to hold the concatenation
- v.db.update to update this new column with the concatenation of the two others (something like qcol = "STRATA || '_' || STAND")

Otherwise, if there is a common key in both tables, you can just create a new column and use db.execute to launch a UPDATE TABLE directly, grabbing the info from the two table and concatenating it directly in the query.

Moritz

Thank you!

Here are some specifics.

east, north: 651849.842735, 6604949.78485
c34_patch@project_area:
Type: Point
Id: 21622
Layer: 1
Category: 21623
Driver: sqlite
Database: /Users/pete/grassdata/PortGraham/project_area/sqlite/sqlite.db
Table: c34_patch
Key_column: cat
Attributes:
cat: 21623
*strata: 3 — STRATA*
c34_patch@project_area:
Type: Point
Id: 21622
Layer: 2
*Category: 10 — STAND*

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

Thank you, Moritz.

I’m pretty familiar with SQL but can’t figure out how layer 2 is stored in the database. When I pragma table_info(<vector>) I only see the layer 1 attributes.

I’ll work with the GRASS approach you suggested.

Best,
Peter

On Dec 1, 2017, at 11:53 PM, Moritz Lennert <mlennert@club.worldonline.be> wrote:

On 02/12/17 02:03, Peter Tittmann wrote:

Hi,
I have a vector (POINT) which has two layers containing relevant attributes (’strata’ and ’stand’). I would like to concatenate the two values into a new attribute for Layer 1 (’_’). I’ve been struggling to sort this out for too long and am tapping out. Its probably blatantly obvious but it has escaped me.

Probably the easiest way if your not very familiar with SQL:

  • Create a new column in layer 1 where you can put the info from layer 2
  • Fill this column with v.to.db option=query query_layer=2, etc
  • Create a second new column to hold the concatenation
  • v.db.update to update this new column with the concatenation of the two others (something like qcol = “STRATA || ‘_’ || STAND”)

Otherwise, if there is a common key in both tables, you can just create a new column and use db.execute to launch a UPDATE TABLE directly, grabbing the info from the two table and concatenating it directly in the query.

Moritz

Thank you!
Here are some specifics.
east, north: 651849.842735, 6604949.78485
c34_patch@project_area:
Type: Point
Id: 21622
Layer: 1
Category: 21623
Driver: sqlite
Database: /Users/pete/grassdata/PortGraham/project_area/sqlite/sqlite.db
Table: c34_patch
Key_column: cat
Attributes:
cat: 21623
strata: 3 — STRATA
c34_patch@project_area:
Type: Point
Id: 21622
Layer: 2
Category: 10 — STAND


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

Am 6. Dezember 2017 18:42:22 MEZ schrieb Peter Tittmann <ptittmann@gmail.com>:

Thank you, Moritz.

I'm pretty familiar with SQL but can’t figure out how layer 2 is stored
in the database. When I `pragma table_info(<vector>)` I only see the
layer 1 attributes.

v.db.connect -p (or grass.script.vector_db() )will show you all connections between the map and database tables.

Moritz

I’ll work with the GRASS approach you suggested.

Best,
Peter

On Dec 1, 2017, at 11:53 PM, Moritz Lennert

<mlennert@club.worldonline.be> wrote:

On 02/12/17 02:03, Peter Tittmann wrote:

Hi,
I have a vector (`POINT`) which has two layers containing relevant

attributes (’strata’ and ’stand’). I would like to concatenate the two
values into a new attribute for Layer 1 (’<STRATA>_<STAND>’). I’ve been
struggling to sort this out for too long and am tapping out. Its
probably blatantly obvious but it has escaped me.

Probably the easiest way if your not very familiar with SQL:

- Create a new column in layer 1 where you can put the info from

layer 2

- Fill this column with v.to.db option=query query_layer=2, etc
- Create a second new column to hold the concatenation
- v.db.update to update this new column with the concatenation of the

two others (something like qcol = "STRATA || '_' || STAND")

Otherwise, if there is a common key in both tables, you can just

create a new column and use db.execute to launch a UPDATE TABLE
directly, grabbing the info from the two table and concatenating it
directly in the query.

Moritz

Thank you!
Here are some specifics.
east, north: 651849.842735, 6604949.78485
c34_patch@project_area:
  Type: Point
  Id: 21622
  Layer: 1
  Category: 21623
  Driver: sqlite
  Database:

/Users/pete/grassdata/PortGraham/project_area/sqlite/sqlite.db

  Table: c34_patch
  Key_column: cat
  Attributes:
    cat: 21623
*strata: 3 — STRATA*
c34_patch@project_area:
  Type: Point
  Id: 21622
  Layer: 2
*Category: 10 — STAND*
_______________________________________________
grass-user mailing list
grass-user@lists.osgeo.org <mailto:grass-user@lists.osgeo.org>
https://lists.osgeo.org/mailman/listinfo/grass-user

<https://lists.osgeo.org/mailman/listinfo/grass-user&gt;

Moritz,

v.db.connect -p c34_patch
Vector map <c34_patch> is connected by:
layer <1/c34_patch> table <c34_patch> in database </Users/pete/grassdata//project_area/sqlite/sqlite.db> through driver with key

So it seems that only layer 1 is connected.

When try to connect layer 2:

v.db.connect map=c34_patch@project_area table=c34_patch layer=2
ERROR: Use -o to overwrite existing link for layer <2>

I’m little unclear on the ‘table’ argument, maybe that should be a now table?

Thanks very much.

Peter

On Dec 6, 2017, at 10:27 AM, Moritz Lennert <mlennert@club.worldonline.be> wrote:

Am 6. Dezember 2017 18:42:22 MEZ schrieb Peter Tittmann <ptittmann@gmail.com>:

Thank you, Moritz.

I’m pretty familiar with SQL but can’t figure out how layer 2 is stored
in the database. When I pragma table_info(<vector>) I only see the
layer 1 attributes.

v.db.connect -p (or grass.script.vector_db() )will show you all connections between the map and database tables.

Moritz

I’ll work with the GRASS approach you suggested.

Best,
Peter

On Dec 1, 2017, at 11:53 PM, Moritz Lennert

<mlennert@club.worldonline.be> wrote:

On 02/12/17 02:03, Peter Tittmann wrote:

Hi,
I have a vector (POINT) which has two layers containing relevant

attributes (’strata’ and ’stand’). I would like to concatenate the two
values into a new attribute for Layer 1 (’_’). I’ve been
struggling to sort this out for too long and am tapping out. Its
probably blatantly obvious but it has escaped me.

Probably the easiest way if your not very familiar with SQL:

  • Create a new column in layer 1 where you can put the info from

layer 2

  • Fill this column with v.to.db option=query query_layer=2, etc
  • Create a second new column to hold the concatenation
  • v.db.update to update this new column with the concatenation of the

two others (something like qcol = “STRATA || ‘_’ || STAND”)

Otherwise, if there is a common key in both tables, you can just

create a new column and use db.execute to launch a UPDATE TABLE
directly, grabbing the info from the two table and concatenating it
directly in the query.

Moritz

Thank you!
Here are some specifics.
east, north: 651849.842735, 6604949.78485
c34_patch@project_area:
Type: Point
Id: 21622
Layer: 1
Category: 21623
Driver: sqlite
Database:

/Users/pete/grassdata/PortGraham/project_area/sqlite/sqlite.db

Table: c34_patch
Key_column: cat
Attributes:
cat: 21623
strata: 3 — STRATA
c34_patch@project_area:
Type: Point
Id: 21622
Layer: 2
Category: 10 — STAND


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

<https://lists.osgeo.org/mailman/listinfo/grass-user>

Am 6. Dezember 2017 19:45:49 MEZ schrieb Peter Tittmann <ptittmann@gmail.com>:

Moritz,

v.db.connect -p c34_patch
Vector map <c34_patch> is connected by:
layer <1/c34_patch> table <c34_patch> in database
</Users/pete/grassdata/<FOO>/project_area/sqlite/sqlite.db> through
driver <sqlite> with key <cat>

So it seems that only layer 1 is connected.

When try to connect layer 2:

v.db.connect map=c34_patch@project_area table=c34_patch layer=2
ERROR: Use -o to overwrite existing link for layer <2>

This is weird. This message normally only comes when there really is a connection defined for this layer:

GRASS 7.2.2 (nc_spm_08):~ > g.copy v=hospitals,test
Copy vector <hospitals@PERMANENT> to current mapset as
<test>
GRASS 7.2.2 (nc_spm_08):~ > v.db.connect -p test
Vector map <test> is connected by:
layer <1/hospitals> table <test> in database </data/home/mlennert/GRASSDATA/nc_spm_08/user1/sqlite/sqlite.db>
through driver <sqlite> with key <cat>
GRASS 7.2.2 (nc_spm_08):~ > v.db.connect test layer=2 table=test
The table <test> is now part of vector map <test> and may be deleted or
overwritten by GRASS modules
Select privileges were granted on the table
GRASS 7.2.2 (nc_spm_08):~ > v.db.connect -p test
Vector map <test> is connected by:
layer <1/hospitals> table <test> in database </data/hom
e/mlennert/GRASSDATA/nc_spm_08/user1/sqlite/sqlite.db>
through driver <sqlite> with key <cat>
layer <2/test> table <test> in database </data/home/mlennert/GRASSDATA/nc_spm_08/user1/sqlite/sqlite.db> through driver <sqlite> with key <cat>
GRASS 7.2.2 (nc_spm_08):~ > v.db.connect test layer=2 table=test
ERROR: Use -o to overwrite existing link for layer <2>

So I don't really understand why you get the error message...

I’m little unclear on the ‘table’ argument, maybe that should be a now
table?

Although there might be situations where one could want to connect two layers to the same table, generally each layer is connected to a different table.

In your original post you said the vector had two layers with attributes. This does not seem to be the case when I see the v.db.connect -p output. Maybe if you go a bit back and explain to us in what format the original data is and how you imported it, this might help us help you.

Moritz

Thanks very much.

Peter

On Dec 6, 2017, at 10:27 AM, Moritz Lennert

<mlennert@club.worldonline.be> wrote:

Am 6. Dezember 2017 18:42:22 MEZ schrieb Peter Tittmann

<ptittmann@gmail.com <mailto:ptittmann@gmail.com>>:

Thank you, Moritz.

I'm pretty familiar with SQL but can’t figure out how layer 2 is

stored

in the database. When I `pragma table_info(<vector>)` I only see the
layer 1 attributes.

v.db.connect -p (or grass.script.vector_db() )will show you all

connections between the map and database tables.

Moritz

I’ll work with the GRASS approach you suggested.

Best,
Peter

On Dec 1, 2017, at 11:53 PM, Moritz Lennert

<mlennert@club.worldonline.be> wrote:

On 02/12/17 02:03, Peter Tittmann wrote:

Hi,
I have a vector (`POINT`) which has two layers containing relevant

attributes (’strata’ and ’stand’). I would like to concatenate the

two

values into a new attribute for Layer 1 (’<STRATA>_<STAND>’). I’ve

been

struggling to sort this out for too long and am tapping out. Its
probably blatantly obvious but it has escaped me.

Probably the easiest way if your not very familiar with SQL:

- Create a new column in layer 1 where you can put the info from

layer 2

- Fill this column with v.to.db option=query query_layer=2, etc
- Create a second new column to hold the concatenation
- v.db.update to update this new column with the concatenation of

the

two others (something like qcol = "STRATA || '_' || STAND")

Otherwise, if there is a common key in both tables, you can just

create a new column and use db.execute to launch a UPDATE TABLE
directly, grabbing the info from the two table and concatenating it
directly in the query.

Moritz

Thank you!
Here are some specifics.
east, north: 651849.842735, 6604949.78485
c34_patch@project_area:
Type: Point
Id: 21622
Layer: 1
Category: 21623
Driver: sqlite
Database:

/Users/pete/grassdata/PortGraham/project_area/sqlite/sqlite.db

Table: c34_patch
Key_column: cat
Attributes:
   cat: 21623
*strata: 3 — STRATA*
c34_patch@project_area:
Type: Point
Id: 21622
Layer: 2
*Category: 10 — STAND*
_______________________________________________
grass-user mailing list
grass-user@lists.osgeo.org <mailto:grass-user@lists.osgeo.org>

<mailto:grass-user@lists.osgeo.org>

https://lists.osgeo.org/mailman/listinfo/grass-user

<https://lists.osgeo.org/mailman/listinfo/grass-user&gt;

<https://lists.osgeo.org/mailman/listinfo/grass-user

<https://lists.osgeo.org/mailman/listinfo/grass-user&gt;&gt;

On Thu, Dec 7, 2017 at 9:21 AM, Moritz Lennert <mlennert@club.worldonline.be> wrote:

Am 6. Dezember 2017 19:45:49 MEZ schrieb Peter Tittmann <ptittmann@gmail.com>:

Moritz,

v.db.connect -p c34_patch
Vector map <c34_patch> is connected by:
layer <1/c34_patch> table <c34_patch> in database
</Users/pete/grassdata//project_area/sqlite/sqlite.db> through
driver with key

So it seems that only layer 1 is connected.

When try to connect layer 2:

v.db.connect map=c34_patch@project_area table=c34_patch layer=2
ERROR: Use -o to overwrite existing link for layer <2>

This is weird. This message normally only comes when there really is a connection defined for this layer:

The reason for the error could be that the table c34_patch is already attached to layer 1.

I guess what is needed here is v.db.addtable map=c34_patch layer=2

Now you could proceed as suggested by Moritz:

  • Create a new column in layer 1 where you can put the info from layer 2
  • Fill this column with v.to.db option=query query_layer=2, etc
  • Create a second new column to hold the concatenation
  • v.db.update to update this new column with the concatenation of the two others (something like qcol = “STRATA || ‘_’ || STAND”)

Markus M

GRASS 7.2.2 (nc_spm_08):~ > g.copy v=hospitals,test
Copy vector hospitals@PERMANENT to current mapset as

GRASS 7.2.2 (nc_spm_08):~ > v.db.connect -p test
Vector map is connected by:
layer <1/hospitals> table in database </data/home/mlennert/GRASSDATA/nc_spm_08/user1/sqlite/sqlite.db>
through driver with key
GRASS 7.2.2 (nc_spm_08):~ > v.db.connect test layer=2 table=test
The table is now part of vector map and may be deleted or
overwritten by GRASS modules
Select privileges were granted on the table
GRASS 7.2.2 (nc_spm_08):~ > v.db.connect -p test
Vector map is connected by:
layer <1/hospitals> table in database </data/hom
e/mlennert/GRASSDATA/nc_spm_08/user1/sqlite/sqlite.db>
through driver with key
layer <2/test> table in database </data/home/mlennert/GRASSDATA/nc_spm_08/user1/sqlite/sqlite.db> through driver with key
GRASS 7.2.2 (nc_spm_08):~ > v.db.connect test layer=2 table=test
ERROR: Use -o to overwrite existing link for layer <2>

So I don’t really understand why you get the error message…

I’m little unclear on the ‘table’ argument, maybe that should be a now
table?

Although there might be situations where one could want to connect two layers to the same table, generally each layer is connected to a different table.

In your original post you said the vector had two layers with attributes. This does not seem to be the case when I see the v.db.connect -p output. Maybe if you go a bit back and explain to us in what format the original data is and how you imported it, this might help us help you.

Moritz

Thanks very much.

Peter

On Dec 6, 2017, at 10:27 AM, Moritz Lennert
<mlennert@club.worldonline.be> wrote:

Am 6. Dezember 2017 18:42:22 MEZ schrieb Peter Tittmann
<ptittmann@gmail.com mailto:[ptittmann@gmail.com](mailto:ptittmann@gmail.com)>:

Thank you, Moritz.

I’m pretty familiar with SQL but can’t figure out how layer 2 is
stored
in the database. When I pragma table_info(<vector>) I only see the
layer 1 attributes.

v.db.connect -p (or grass.script.vector_db() )will show you all
connections between the map and database tables.

Moritz

I’ll work with the GRASS approach you suggested.

Best,
Peter

On Dec 1, 2017, at 11:53 PM, Moritz Lennert
<mlennert@club.worldonline.be> wrote:

On 02/12/17 02:03, Peter Tittmann wrote:

Hi,
I have a vector (POINT) which has two layers containing relevant
attributes (’strata’ and ’stand’). I would like to concatenate the
two
values into a new attribute for Layer 1 (’_’). I’ve
been
struggling to sort this out for too long and am tapping out. Its
probably blatantly obvious but it has escaped me.

Probably the easiest way if your not very familiar with SQL:

  • Create a new column in layer 1 where you can put the info from
    layer 2
  • Fill this column with v.to.db option=query query_layer=2, etc
  • Create a second new column to hold the concatenation
  • v.db.update to update this new column with the concatenation of
    the
    two others (something like qcol = “STRATA || ‘_’ || STAND”)

Otherwise, if there is a common key in both tables, you can just
create a new column and use db.execute to launch a UPDATE TABLE
directly, grabbing the info from the two table and concatenating it
directly in the query.

Moritz

Thank you!
Here are some specifics.
east, north: 651849.842735, 6604949.78485
c34_patch@project_area:
Type: Point
Id: 21622
Layer: 1
Category: 21623
Driver: sqlite
Database:
/Users/pete/grassdata/PortGraham/project_area/sqlite/sqlite.db
Table: c34_patch
Key_column: cat
Attributes:
cat: 21623
strata: 3 — STRATA
c34_patch@project_area:
Type: Point
Id: 21622
Layer: 2
Category: 10 — STAND


grass-user mailing list
grass-user@lists.osgeo.org mailto:[grass-user@lists.osgeo.org](mailto:grass-user@lists.osgeo.org)
<mailto:grass-user@lists.osgeo.org mailto:[grass-user@lists.osgeo.org](mailto:grass-user@lists.osgeo.org)>
https://lists.osgeo.org/mailman/listinfo/grass-user
<https://lists.osgeo.org/mailman/listinfo/grass-user>
<https://lists.osgeo.org/mailman/listinfo/grass-user
<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

Am 7. Dezember 2017 14:42:38 MEZ schrieb Markus Metz <markus.metz.giswork@gmail.com>:

On Thu, Dec 7, 2017 at 9:21 AM, Moritz Lennert
<mlennert@club.worldonline.be>
wrote:

Am 6. Dezember 2017 19:45:49 MEZ schrieb Peter Tittmann <

ptittmann@gmail.com>:

>Moritz,
>
>v.db.connect -p c34_patch
>Vector map <c34_patch> is connected by:
>layer <1/c34_patch> table <c34_patch> in database
></Users/pete/grassdata/<FOO>/project_area/sqlite/sqlite.db> through
>driver <sqlite> with key <cat>
>
>So it seems that only layer 1 is connected.
>
>When try to connect layer 2:
>
>v.db.connect map=c34_patch@project_area table=c34_patch layer=2
>ERROR: Use -o to overwrite existing link for layer <2>

This is weird. This message normally only comes when there really is

a
connection defined for this layer:

The reason for the error could be that the table c34_patch is already
attached to layer 1.

In my NC data example you can see that it works as expected when attaching layer 2 to the same table as layer 1.

I guess what is needed here is v.db.addtable map=c34_patch layer=2

v.db.addtable will create a new, empty table containing only the vector features' cat values. In the OP, Peter indicated that he had two layers with respective attribute tables, containing the attributes Strata and Stand. Unless these two attributes are included in the two layers as the respective category values, I don't think v.db.addtable will help.

But that's why we need more info...

Moritz

Now you could proceed as suggested by Moritz:

- Create a new column in layer 1 where you can put the info from layer
2
- Fill this column with v.to.db option=query query_layer=2, etc
- Create a second new column to hold the concatenation
- v.db.update to update this new column with the concatenation of the
two
others (something like qcol = "STRATA || '_' || STAND")

Markus M

GRASS 7.2.2 (nc_spm_08):~ > g.copy v=hospitals,test
Copy vector <hospitals@PERMANENT> to current mapset as
<test>
GRASS 7.2.2 (nc_spm_08):~ > v.db.connect -p test
Vector map <test> is connected by:
layer <1/hospitals> table <test> in database

</data/home/mlennert/GRASSDATA/nc_spm_08/user1/sqlite/sqlite.db>

through driver <sqlite> with key <cat>
GRASS 7.2.2 (nc_spm_08):~ > v.db.connect test layer=2 table=test
The table <test> is now part of vector map <test> and may be deleted

or

overwritten by GRASS modules
Select privileges were granted on the table
GRASS 7.2.2 (nc_spm_08):~ > v.db.connect -p test
Vector map <test> is connected by:
layer <1/hospitals> table <test> in database </data/hom
e/mlennert/GRASSDATA/nc_spm_08/user1/sqlite/sqlite.db>
through driver <sqlite> with key <cat>
layer <2/test> table <test> in database

</data/home/mlennert/GRASSDATA/nc_spm_08/user1/sqlite/sqlite.db>
through
driver <sqlite> with key <cat>

GRASS 7.2.2 (nc_spm_08):~ > v.db.connect test layer=2 table=test
ERROR: Use -o to overwrite existing link for layer <2>

So I don't really understand why you get the error message...

>
>I’m little unclear on the ‘table’ argument, maybe that should be a

now

>table?

Although there might be situations where one could want to connect

two
layers to the same table, generally each layer is connected to a
different
table.

In your original post you said the vector had two layers with

attributes.
This does not seem to be the case when I see the v.db.connect -p
output.
Maybe if you go a bit back and explain to us in what format the
original
data is and how you imported it, this might help us help you.

Moritz

>
>Thanks very much.
>
>Peter
>> On Dec 6, 2017, at 10:27 AM, Moritz Lennert
><mlennert@club.worldonline.be> wrote:
>>
>>
>>
>> Am 6. Dezember 2017 18:42:22 MEZ schrieb Peter Tittmann
><ptittmann@gmail.com <mailto:ptittmann@gmail.com>>:
>>> Thank you, Moritz.
>>>
>>> I'm pretty familiar with SQL but can’t figure out how layer 2 is
>stored
>>> in the database. When I `pragma table_info(<vector>)` I only see

the

>>> layer 1 attributes.
>>
>> v.db.connect -p (or grass.script.vector_db() )will show you all
>connections between the map and database tables.
>>
>>
>> Moritz
>>>
>>> I’ll work with the GRASS approach you suggested.
>>>
>>> Best,
>>> Peter
>>>
>>>
>>>> On Dec 1, 2017, at 11:53 PM, Moritz Lennert
>>> <mlennert@club.worldonline.be> wrote:
>>>>
>>>> On 02/12/17 02:03, Peter Tittmann wrote:
>>>>> Hi,
>>>>> I have a vector (`POINT`) which has two layers containing

relevant

>>> attributes (’strata’ and ’stand’). I would like to concatenate

the

>two
>>> values into a new attribute for Layer 1 (’<STRATA>_<STAND>’).

I’ve

>been
>>> struggling to sort this out for too long and am tapping out. Its
>>> probably blatantly obvious but it has escaped me.
>>>>
>>>>
>>>> Probably the easiest way if your not very familiar with SQL:
>>>>
>>>> - Create a new column in layer 1 where you can put the info from
>>> layer 2
>>>> - Fill this column with v.to.db option=query query_layer=2, etc
>>>> - Create a second new column to hold the concatenation
>>>> - v.db.update to update this new column with the concatenation

of

>the
>>> two others (something like qcol = "STRATA || '_' || STAND")
>>>>
>>>> Otherwise, if there is a common key in both tables, you can just
>>> create a new column and use db.execute to launch a UPDATE TABLE
>>> directly, grabbing the info from the two table and concatenating

it

>>> directly in the query.
>>>>
>>>> Moritz
>>>>
>>>>
>>>>> Thank you!
>>>>> Here are some specifics.
>>>>> east, north: 651849.842735, 6604949.78485
>>>>> c34_patch@project_area:
>>>>> Type: Point
>>>>> Id: 21622
>>>>> Layer: 1
>>>>> Category: 21623
>>>>> Driver: sqlite
>>>>> Database:
>>> /Users/pete/grassdata/PortGraham/project_area/sqlite/sqlite.db
>>>>> Table: c34_patch
>>>>> Key_column: cat
>>>>> Attributes:
>>>>> cat: 21623
>>>>> *strata: 3 — STRATA*
>>>>> c34_patch@project_area:
>>>>> Type: Point
>>>>> Id: 21622
>>>>> Layer: 2
>>>>> *Category: 10 — STAND*
>>>>> _______________________________________________
>>>>> grass-user mailing list
>>>>> grass-user@lists.osgeo.org <mailto:grass-user@lists.osgeo.org>
><mailto:grass-user@lists.osgeo.org

<mailto:grass-user@lists.osgeo.org>>

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

On Thu, Dec 7, 2017 at 3:20 PM, Moritz Lennert <mlennert@club.worldonline.be> wrote:

Am 7. Dezember 2017 14:42:38 MEZ schrieb Markus Metz <markus.metz.giswork@gmail.com>:

On Thu, Dec 7, 2017 at 9:21 AM, Moritz Lennert
<mlennert@club.worldonline.be>
wrote:

Am 6. Dezember 2017 19:45:49 MEZ schrieb Peter Tittmann <
ptittmann@gmail.com>:

Moritz,

v.db.connect -p c34_patch
Vector map <c34_patch> is connected by:
layer <1/c34_patch> table <c34_patch> in database
</Users/pete/grassdata//project_area/sqlite/sqlite.db> through
driver with key

So it seems that only layer 1 is connected.

When try to connect layer 2:

v.db.connect map=c34_patch@project_area table=c34_patch layer=2
ERROR: Use -o to overwrite existing link for layer <2>

This is weird. This message normally only comes when there really is
a
connection defined for this layer:

The reason for the error could be that the table c34_patch is already
attached to layer 1.

In my NC data example you can see that it works as expected when attaching layer 2 to the same table as layer 1.

OK, I see.

I guess what is needed here is v.db.addtable map=c34_patch layer=2

v.db.addtable will create a new, empty table containing only the vector features’ cat values. In the OP, Peter indicated that he had two layers with respective attribute tables, containing the attributes Strata and Stand.

In the OP, it says

c34_patch@project_area:
Type: Point
Id: 21622
Layer: 1
Category: 21623
Driver: sqlite
Database: /Users/pete/grassdata/PortGraham/project_area/sqlite/sqlite.db
Table: c34_patch
Key_column: cat
Attributes:
cat: 21623
strata: 3 — STRATA

c34_patch@project_area:
Type: Point
Id: 21622
Layer: 2
Category: 10 — STAND

→ no attributes in layer 2, only categories in layer 2. IIUC, the attribute ‘strata’ from layer 1 must be combined with the category value from layer 2. Your suggestion should work, after a new table has been added to layer 2.

Markus M

Unless these two attributes are included in the two layers as the respective category values, I don’t think v.db.addtable will help.

But that’s why we need more info…

Moritz

Now you could proceed as suggested by Moritz:

  • Create a new column in layer 1 where you can put the info from layer
    2
  • Fill this column with v.to.db option=query query_layer=2, etc
  • Create a second new column to hold the concatenation
  • v.db.update to update this new column with the concatenation of the
    two
    others (something like qcol = “STRATA || ‘_’ || STAND”)

Markus M

GRASS 7.2.2 (nc_spm_08):~ > g.copy v=hospitals,test
Copy vector hospitals@PERMANENT to current mapset as

GRASS 7.2.2 (nc_spm_08):~ > v.db.connect -p test
Vector map is connected by:
layer <1/hospitals> table in database
</data/home/mlennert/GRASSDATA/nc_spm_08/user1/sqlite/sqlite.db>
through driver with key
GRASS 7.2.2 (nc_spm_08):~ > v.db.connect test layer=2 table=test
The table is now part of vector map and may be deleted
or
overwritten by GRASS modules
Select privileges were granted on the table
GRASS 7.2.2 (nc_spm_08):~ > v.db.connect -p test
Vector map is connected by:
layer <1/hospitals> table in database </data/hom
e/mlennert/GRASSDATA/nc_spm_08/user1/sqlite/sqlite.db>
through driver with key
layer <2/test> table in database
</data/home/mlennert/GRASSDATA/nc_spm_08/user1/sqlite/sqlite.db>
through
driver with key
GRASS 7.2.2 (nc_spm_08):~ > v.db.connect test layer=2 table=test
ERROR: Use -o to overwrite existing link for layer <2>

So I don’t really understand why you get the error message…

I’m little unclear on the ‘table’ argument, maybe that should be a
now
table?

Although there might be situations where one could want to connect
two
layers to the same table, generally each layer is connected to a
different
table.

In your original post you said the vector had two layers with
attributes.
This does not seem to be the case when I see the v.db.connect -p
output.
Maybe if you go a bit back and explain to us in what format the
original
data is and how you imported it, this might help us help you.

Moritz

Thanks very much.

Peter

On Dec 6, 2017, at 10:27 AM, Moritz Lennert
<mlennert@club.worldonline.be> wrote:

Am 6. Dezember 2017 18:42:22 MEZ schrieb Peter Tittmann
<ptittmann@gmail.com mailto:[ptittmann@gmail.com](mailto:ptittmann@gmail.com)>:

Thank you, Moritz.

I’m pretty familiar with SQL but can’t figure out how layer 2 is
stored
in the database. When I pragma table_info(<vector>) I only see
the
layer 1 attributes.

v.db.connect -p (or grass.script.vector_db() )will show you all
connections between the map and database tables.

Moritz

I’ll work with the GRASS approach you suggested.

Best,
Peter

On Dec 1, 2017, at 11:53 PM, Moritz Lennert
<mlennert@club.worldonline.be> wrote:

On 02/12/17 02:03, Peter Tittmann wrote:

Hi,
I have a vector (POINT) which has two layers containing
relevant
attributes (’strata’ and ’stand’). I would like to concatenate
the
two
values into a new attribute for Layer 1 (’_’).
I’ve
been
struggling to sort this out for too long and am tapping out. Its
probably blatantly obvious but it has escaped me.

Probably the easiest way if your not very familiar with SQL:

  • Create a new column in layer 1 where you can put the info from
    layer 2
  • Fill this column with v.to.db option=query query_layer=2, etc
  • Create a second new column to hold the concatenation
  • v.db.update to update this new column with the concatenation
    of
    the
    two others (something like qcol = “STRATA || ‘_’ || STAND”)

Otherwise, if there is a common key in both tables, you can just
create a new column and use db.execute to launch a UPDATE TABLE
directly, grabbing the info from the two table and concatenating
it
directly in the query.

Moritz

Thank you!
Here are some specifics.
east, north: 651849.842735, 6604949.78485
c34_patch@project_area:
Type: Point
Id: 21622
Layer: 1
Category: 21623
Driver: sqlite
Database:
/Users/pete/grassdata/PortGraham/project_area/sqlite/sqlite.db
Table: c34_patch
Key_column: cat
Attributes:
cat: 21623
strata: 3 — STRATA
c34_patch@project_area:
Type: Point
Id: 21622
Layer: 2
Category: 10 — STAND


grass-user mailing list
grass-user@lists.osgeo.org mailto:[grass-user@lists.osgeo.org](mailto:grass-user@lists.osgeo.org)
<mailto:grass-user@lists.osgeo.org
mailto:[grass-user@lists.osgeo.org](mailto:grass-user@lists.osgeo.org)>
https://lists.osgeo.org/mailman/listinfo/grass-user
<https://lists.osgeo.org/mailman/listinfo/grass-user>
<https://lists.osgeo.org/mailman/listinfo/grass-user
<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

Thank you both for your suggestions. I found another way around this. My goal was to generate a topologically valid vector (POLYGON) layer containing stand as a predicate of strata (all stands exist within a strata, no stand overlaps strata). To achieve this, I used v.what.rast using centroid after converting the strata raster to polygons with the strata as a mask. Then I remove the mask and patch all the strata polygons with stand attributes together to create a table containing all strata.

pseudocode:

for all S in STRATA:
create mask using S
r.to.vect area — a polygon layer reflecting stands within the strata
v.db.acccolumn ‘strata’ — create a new column to store strata values
v.what.rast raster=STRATA — add the strata attribute to the polygon

v.patch all S from above…

Now I have another issue, though. Will post to a different thread.

Thank you again,

Peter

On Dec 7, 2017, at 7:00 AM, Markus Metz <markus.metz.giswork@gmail.com> wrote:

On Thu, Dec 7, 2017 at 3:20 PM, Moritz Lennert <mlennert@club.worldonline.be> wrote:

Am 7. Dezember 2017 14:42:38 MEZ schrieb Markus Metz <markus.metz.giswork@gmail.com>:

On Thu, Dec 7, 2017 at 9:21 AM, Moritz Lennert
<mlennert@club.worldonline.be>
wrote:

Am 6. Dezember 2017 19:45:49 MEZ schrieb Peter Tittmann <
ptittmann@gmail.com>:

Moritz,

v.db.connect -p c34_patch
Vector map <c34_patch> is connected by:
layer <1/c34_patch> table <c34_patch> in database
</Users/pete/grassdata//project_area/sqlite/sqlite.db> through
driver with key

So it seems that only layer 1 is connected.

When try to connect layer 2:

v.db.connect map=c34_patch@project_area table=c34_patch layer=2
ERROR: Use -o to overwrite existing link for layer <2>

This is weird. This message normally only comes when there really is
a
connection defined for this layer:

The reason for the error could be that the table c34_patch is already
attached to layer 1.

In my NC data example you can see that it works as expected when attaching layer 2 to the same table as layer 1.

OK, I see.

I guess what is needed here is v.db.addtable map=c34_patch layer=2

v.db.addtable will create a new, empty table containing only the vector features’ cat values. In the OP, Peter indicated that he had two layers with respective attribute tables, containing the attributes Strata and Stand.

In the OP, it says

c34_patch@project_area:
Type: Point
Id: 21622
Layer: 1
Category: 21623
Driver: sqlite
Database: /Users/pete/grassdata/PortGraham/project_area/sqlite/sqlite.db
Table: c34_patch
Key_column: cat
Attributes:
cat: 21623
strata: 3 — STRATA

c34_patch@project_area:
Type: Point
Id: 21622
Layer: 2
Category: 10 — STAND

→ no attributes in layer 2, only categories in layer 2. IIUC, the attribute ‘strata’ from layer 1 must be combined with the category value from layer 2. Your suggestion should work, after a new table has been added to layer 2.

Markus M

Unless these two attributes are included in the two layers as the respective category values, I don’t think v.db.addtable will help.

But that’s why we need more info…

Moritz

Now you could proceed as suggested by Moritz:

  • Create a new column in layer 1 where you can put the info from layer
    2
  • Fill this column with v.to.db option=query query_layer=2, etc
  • Create a second new column to hold the concatenation
  • v.db.update to update this new column with the concatenation of the
    two
    others (something like qcol = “STRATA || ‘_’ || STAND”)

Markus M

GRASS 7.2.2 (nc_spm_08):~ > g.copy v=hospitals,test
Copy vector hospitals@PERMANENT to current mapset as

GRASS 7.2.2 (nc_spm_08):~ > v.db.connect -p test
Vector map is connected by:
layer <1/hospitals> table in database
</data/home/mlennert/GRASSDATA/nc_spm_08/user1/sqlite/sqlite.db>
through driver with key
GRASS 7.2.2 (nc_spm_08):~ > v.db.connect test layer=2 table=test
The table is now part of vector map and may be deleted
or
overwritten by GRASS modules
Select privileges were granted on the table
GRASS 7.2.2 (nc_spm_08):~ > v.db.connect -p test
Vector map is connected by:
layer <1/hospitals> table in database </data/hom
e/mlennert/GRASSDATA/nc_spm_08/user1/sqlite/sqlite.db>
through driver with key
layer <2/test> table in database
</data/home/mlennert/GRASSDATA/nc_spm_08/user1/sqlite/sqlite.db>
through
driver with key
GRASS 7.2.2 (nc_spm_08):~ > v.db.connect test layer=2 table=test
ERROR: Use -o to overwrite existing link for layer <2>

So I don’t really understand why you get the error message…

I’m little unclear on the ‘table’ argument, maybe that should be a
now
table?

Although there might be situations where one could want to connect
two
layers to the same table, generally each layer is connected to a
different
table.

In your original post you said the vector had two layers with
attributes.
This does not seem to be the case when I see the v.db.connect -p
output.
Maybe if you go a bit back and explain to us in what format the
original
data is and how you imported it, this might help us help you.

Moritz

Thanks very much.

Peter

On Dec 6, 2017, at 10:27 AM, Moritz Lennert
<mlennert@club.worldonline.be> wrote:

Am 6. Dezember 2017 18:42:22 MEZ schrieb Peter Tittmann
<ptittmann@gmail.com mailto:[ptittmann@gmail.com](mailto:ptittmann@gmail.com)>:

Thank you, Moritz.

I’m pretty familiar with SQL but can’t figure out how layer 2 is
stored
in the database. When I pragma table_info(<vector>) I only see
the
layer 1 attributes.

v.db.connect -p (or grass.script.vector_db() )will show you all
connections between the map and database tables.

Moritz

I’ll work with the GRASS approach you suggested.

Best,
Peter

On Dec 1, 2017, at 11:53 PM, Moritz Lennert
<mlennert@club.worldonline.be> wrote:

On 02/12/17 02:03, Peter Tittmann wrote:

Hi,
I have a vector (POINT) which has two layers containing
relevant
attributes (’strata’ and ’stand’). I would like to concatenate
the
two
values into a new attribute for Layer 1 (’_’).
I’ve
been
struggling to sort this out for too long and am tapping out. Its
probably blatantly obvious but it has escaped me.

Probably the easiest way if your not very familiar with SQL:

  • Create a new column in layer 1 where you can put the info from
    layer 2
  • Fill this column with v.to.db option=query query_layer=2, etc
  • Create a second new column to hold the concatenation
  • v.db.update to update this new column with the concatenation
    of
    the
    two others (something like qcol = “STRATA || ‘_’ || STAND”)

Otherwise, if there is a common key in both tables, you can just
create a new column and use db.execute to launch a UPDATE TABLE
directly, grabbing the info from the two table and concatenating
it
directly in the query.

Moritz

Thank you!
Here are some specifics.
east, north: 651849.842735, 6604949.78485
c34_patch@project_area:
Type: Point
Id: 21622
Layer: 1
Category: 21623
Driver: sqlite
Database:
/Users/pete/grassdata/PortGraham/project_area/sqlite/sqlite.db
Table: c34_patch
Key_column: cat
Attributes:
cat: 21623
strata: 3 — STRATA
c34_patch@project_area:
Type: Point
Id: 21622
Layer: 2
Category: 10 — STAND


grass-user mailing list
grass-user@lists.osgeo.org mailto:[grass-user@lists.osgeo.org](mailto:grass-user@lists.osgeo.org)
<mailto:grass-user@lists.osgeo.org
mailto:[grass-user@lists.osgeo.org](mailto:grass-user@lists.osgeo.org)>
https://lists.osgeo.org/mailman/listinfo/grass-user
<https://lists.osgeo.org/mailman/listinfo/grass-user>
<https://lists.osgeo.org/mailman/listinfo/grass-user
<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