[GRASS-user] Copy and concatenate a vector attribute between layers
Peter Tittmann
ptittmann at gmail.com
Thu Dec 7 14:00:59 PST 2017
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 at gmail.com> wrote:
>
>
>
> On Thu, Dec 7, 2017 at 3:20 PM, Moritz Lennert <mlennert at club.worldonline.be <mailto:mlennert at club.worldonline.be>> wrote:
> >
> >
> >
> > Am 7. Dezember 2017 14:42:38 MEZ schrieb Markus Metz <markus.metz.giswork at gmail.com <mailto:markus.metz.giswork at gmail.com>>:
> > >On Thu, Dec 7, 2017 at 9:21 AM, Moritz Lennert
> > ><mlennert at club.worldonline.be <mailto:mlennert at club.worldonline.be>>
> > >wrote:
> > >>
> > >>
> > >>
> > >> Am 6. Dezember 2017 19:45:49 MEZ schrieb Peter Tittmann <
> > >ptittmann at gmail.com <mailto: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:
> > >
> > >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 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
>
> --> 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 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 <mailto: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> <mailto: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 <mailto: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>>
> > >> ><mailto: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>>
> > >> >>> <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 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>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/grass-user/attachments/20171207/92bf4a67/attachment-0001.html>
More information about the grass-user
mailing list