[GRASS-user] v.generalize and external boundaries
Daniel McInerney
daniel.o.mcinerney at gmail.com
Sat Aug 25 04:37:14 PDT 2018
Hi Markus, Micha,
Many thanks for your emails, the combined solution that you suggested
worked perfectly.
best regards,
Daniel.
On 25/08/18 11:03, Markus Metz wrote:
>
>
> On Sat, Aug 25, 2018 at 10:56 AM Micha Silver <tsvibar at gmail.com
> <mailto:tsvibar at gmail.com>> wrote:
> >
> > I think I have a series of steps that will allow you to separate the
> "inner" boundaries and generalize only those. The idea is based on
> using the v.to.db module, with the "sides" option to add the cat
> number of each area to the left and right of each boundary. Outer
> boundaries will have "-1" (nothing on that side) for the left or right
> sides. Then you can split out the inner boundaries with a v.extract
> using a "where" clause.
>
> nice approach, but it could be simplified because v.generalize has a
> where option, i.e. no need for v.extract:
> >
> > Somewhat convoluted, but here you are as regular grass command, not
> in python.
> >
> > (My example below is from the sample nc_basic_spm_grass7 location. I
> tested with the geology map.)
> >
> > # Make a copy and add cats to the boundaries in layer 2
> > GRASS 7.4.0 (nc_basic_spm_grass7):~ > g.copy vect=geology,my_geol
> > GRASS 7.4.0 (nc_basic_spm_grass7):~ > v.category my_geol layer=2
> type=boundary option=add output=my_geol2
> >
> > # Add attribute columns for the left and right sides in layer 2, and
> populate from the areas in *layer 1*
> > GRASS 7.4.0 (nc_basic_spm_grass7):~ > v.db.addtable my_geol2 layer=2
> column="left integer,right integer"
> > GRASS 7.4.0 (nc_basic_spm_grass7):~ > v.to.db my_geol2 layer=2
> option=sides column=left,right query_layer=1
>
> generalize inner boundaries
> GRASS 7.4.0 (nc_basic_spm_grass7):~ > v.generalize input=my_geol2
> method=douglas output=my_geol2_smooth thresh=1000 type=boundary
> layer=2 where="left > -1 and right > -1" --o
>
> done
>
> Markus M
>
> >
> > # Now use the left and right cat value to separate the inner and
> outer boundaries
> > GRASS 7.4.0 (nc_basic_spm_grass7):~ > v.extract my_geol2 layer=2
> out=inner_bndry type=boundary where="left<>-1 and right<>-1"
> > GRASS 7.4.0 (nc_basic_spm_grass7):~ > v.extract my_geol2 layer=2
> out=outer_bndry type=boundary where="left=-1 or right=-1"
> >
> > # Convert inner boundaries to lines for smoothing, and run generalize
> > GRASS 7.4.0 (nc_basic_spm_grass7):~ > v.type input=inner_bndry
> out=inner_lines layer=2 from=boundary to=line
> > GRASS 7.4.0 (nc_basic_spm_grass7):~ > v.generalize inner_lines
> method=douglas output=inner_lines_smooth thresh=1000 --o
> >
> > # Convert back to boundary and merge back with the outer boundary
> and recreate area centroids
> > GRASS 7.4.0 (nc_basic_spm_grass7):~ > v.type inner_lines_smooth
> out=inner_bndry_smooth from=line to=boundary layer=2 --o
> > GRASS 7.4.0 (nc_basic_spm_grass7):~ > v.patch
> input=outer_bndry,inner_bndry_smooth output=merge_smooth --o
> > GRASS 7.4.0 (nc_basic_spm_grass7):~ > v.centroids merge_smooth
> output=merged_areas layer=2 option=add
> >
> >
> > You probably will have to do some manual cleaning of the result,
> since the smoothed inner boundaries might no longer exactly intersect
> with the untouched outer boundary due to overshoots, etc.
> >
> > If you try this, let us know how it went.
> >
> > Regards, Micha
> >
> >
> >
> > On 08/24/2018 06:43 PM, Daniel McInerney wrote:
> >
> > Hi List,
> >
> > I'm using v.generalize in a script (excerpt included below) to smooth
> > the boundaries of a polygon vector dataset. In the attached example
> > (input_vector.png), I would like to *only* generalize the internal lines
> > (blue), and leave the external boundary (green line) unchanged. I
> > thought that the flag, '-l' might provide this functionality, but
> > unfortunately the resulting external boundary is changed significantly
> > (attached vgeneralize_output.png).
> >
> > Is this functionality available in v.generalize or is there another way
> > that this could be achieved in GRASS?
> >
> > Thanks in advance.
> >
> > Best regards,
> > Daniel.
> >
> > ##run generalisation (step: 1 - douglas)
> > gscript.run_command('v.generalize', flags='l', overwrite=True,
> > input='segments', output='segments_douglas', method='douglas',
> threshold=1)
> >
> > ##run generalisation (step: 2 - sliding average)
> > gscript.run_command('v.generalize', flags='l', overwrite=True,
> > input='segments_douglas', output='segments_douglas_slide',
> > method='sliding_averaging', threshold='2', look_ahead='9', slide='0.1',
> > iterations='3')
> >
> > ##run generalisation (step: 3 - snake)
> > gscript.run_command('v.generalize', flags='l', overwrite=True,
> > input='segments_douglas_slide', output='segments_douglas_slide_snake',
> > method='snake', threshold='3', alpha='1', beta='1')
> >
> >
> >
> >
> >
> > _______________________________________________
> > 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
> >
> >
> > --
> > Micha Silver
> > Ben Gurion Univ.
> > Sde Boker, Remote Sensing Lab
> > cell: +972-523-665918
> >
> > _______________________________________________
> > 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
More information about the grass-user
mailing list