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

Moritz Lennert mlennert at club.worldonline.be
Thu Dec 7 00:21:01 PST 2017



Am 6. Dezember 2017 19:45:49 MEZ schrieb Peter Tittmann <ptittmann at 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 at 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 at 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 at club.worldonline.be> wrote:
>> 
>> 
>> 
>> Am 6. Dezember 2017 18:42:22 MEZ schrieb Peter Tittmann
><ptittmann at gmail.com <mailto:ptittmann at 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 at 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 at 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 at project_area:
>>>>>  Type: Point
>>>>>  Id: 21622
>>>>>  Layer: 2
>>>>> *Category: 10  — STAND*
>>>>> _______________________________________________
>>>>> grass-user mailing list
>>>>> grass-user at lists.osgeo.org <mailto:grass-user at lists.osgeo.org>
><mailto:grass-user at lists.osgeo.org <mailto:grass-user at 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>>


More information about the grass-user mailing list