[GRASS-user] Creating a png file with multiple vector maps
Moritz Lennert
mlennert at club.worldonline.be
Tue Feb 16 01:19:12 PST 2021
Hi Chris,
For me, the following works with the current stable GRASS GIS (7.8.5)
and using maps from the NC demo data set:
export GRASS_RENDER_IMMEDIATE=png
export GRASS_RENDER_WIDTH=640
export GRASS_RENDER_HEIGHT=480
export GRASS_RENDER_TRANSPARENT=true
export GRASS_RENDER_TRUECOLOR=true
export GRASS_RENDER_FILE_COMPRESSION=0
export GRASS_MESSAGE_FORMAT=plain
export GRASS_RENDER_FILE_READ=TRUE
g.region vect=census_wake2000
d.vect map=census_wake2000 at PERMANENT fill_color=none
d.vect map=roadsmajor at PERMANENT color=255:0:0:255
d.vect map=schools_wake at PERMANENT fill_color=0:128:0:255
icon=basic/circle size=10
I attach a small thumbnail of the resulting PNG file.
Moritz
On 11/02/21 18:54, Chris Bartolomei via grass-user wrote:
> Good morning Anna,
> It took quite a while of trial and error but I worked out a method that
> kindof works:
> First off - unless someone says otherwise, you can't use the PNG driver
> (d.mon) method to overlay more than one polygon vector. Sorry - it just
> doesn't work. You CAN use the ps.map method - that works really well
> generating the image however it by default assumes you are printing on
> an A4 piece of paper so there's all sorts of white space. The image is
> centered at the top of this fictional piece of paper. In your postscript
> rules file you can use the "maploc" command to position the image
> elsewhere on the page. This is necessary because the next trick changes
> the paper dimensions but it assumes the origin is the lower left corner
> and therefore clips anything that is above the new dimensions. Back to
> postscript commands in the rules file first though ... the ps.map maploc
> command uses inches (why?? it should be points) so an A4 page is 8.27" x
> 11.69" points are 1/72 of an inch thus 595p x 842p - it also has a
> default 36p margin (0.5 inch). You'll need those numbers later. maploc
> also lets you set the size of your image box: maploc {x offset from
> left edge} {y offset from top} {width of box} {height of box} Note: this
> is all done via a BASH script with GRASS 7.4 on Linux (RHEL 7), not
> python. This is my postscript rules file:
>
> maploc 0.1 6.815 6.5 4.875 #468p x 351p map box moved down towards the
> bottom of the page
> # note that if you push it too far down to where the box would run off
> the bottom, the image is
> # resized to fit on the page so do some testing to come up with the
> correct values
> # also I found the computational region controls the aspect ratio so
> although I say
> # 6.5 x 4.875 with the above maploc command, I got a 6.5 x 3.8 inch box.
> border y # add a border to the map frame (box)
> color 81:81:81 # shade of gray
> end # end the border controls
> vareas admin_area # top vector layer to display
> layer 1 # attribute table to use
> rgbcolumn area_color # name of column holding R:G:B values to fill
> the polygons
> color 153:153:153 #boundary color
> end # end the admin_area controls
> vareas Country # this is the bottom vectors to display
> color 210:210:210 #boundary color
> fcolor 153:153:153 #fill color for all polygons
> end # end the Country controls
>
> Here's the command to run to generate the postscript file:
>
> ps.map input=$HOME/ps_rules.txt out=$HOME/color_admin.ps --overwrite
>
> To convert the postscript to PNG I had to use ghostscript - there are
> other tools you can use though.
>
> gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -r300 -dTextAlphaBits=4
> -dGraphicsAlphaBits=4 -dDEVICEWIDTHPOINTS=473 -dDEVICEHEIGHTPOINTS=276
> -dFIXEDMEDIA -dPSFitPage -sOutputFile=$HOME/color_admin.png -c
> "<</PageOffset [-34 78]>> setpagedevice" -f $HOME/color_admin.ps
>
> So the above line needs some explaining
> (http://www.ghostscript.com/doc/9.27/Use.htm) but in a nutshell, the
> parameters to play with are first the Pageoffset [x y] values. They are
> in points not inches ... 1/72 inch = 1 point ... remember the 1/2"
> margins? the -34 gives me 2 points of white space to the left edge of
> the map frame, the 78 I had to play with to push the map frame down to
> the right spot.
> Next is the DEVICEWIDTHPOINTS and DEVICEHEIGHTPOINTS ... again in points
> ... this "trims" the paper to height and width ... set something then
> run it and view the results. Adjust and run again until you get it correct.
>
> It's a royal pain but it seems to work this way. It would sure be nice
> to create a GRASS workspace file and just say "convert this workspace to
> an image" with everything all laid out nicely - like Arc does exporting
> their mxd map files...
>
> I hope this helps someone !
> :)
> Chris
>
>
> On Wednesday, February 10, 2021, 11:08:00 PM EST, Anna Petrášová
> <kratochanna at gmail.com> wrote:
>
>
>
>
> On Tue, Feb 9, 2021 at 4:41 PM Chris Bartolomei <surfcjb at yahoo.com
> <mailto:surfcjb at yahoo.com>> wrote:
>
> Hi Anna - thank you for the suggestion - I tried it but alas, still
> it only outputs a single vector map (layer). I can get either the
> Country vector or the admin_areas vector, but not both overlaid.
> :(
> Chris
>
>
> I realized you are using both environmental variables and d.mon, that
> might cause some issues, you use one or the other. So try to remove the
> lines starting with d.mon.
>
> Hope that helps,
> Anna
>
>
> On Tuesday, February 9, 2021, 1:20:52 PM EST, Anna Petrášová
> <kratochanna at gmail.com <mailto:kratochanna at gmail.com>> wrote:
>
>
> Hi,
>
> On Tue, Feb 9, 2021 at 10:25 AM Chris Bartolomei via grass-user
> <grass-user at lists.osgeo.org <mailto:grass-user at lists.osgeo.org>> wrote:
>
> Good morning :)
> I'm using GRASS 7.4.1 on a Linux cluster so I only have
> command-line capability. I have two vector layers (a country
> boundary polygon and part of an administrative area map - also
> polygons). I am trying to automate creating a PNG file of the
> admin areas overlaying the country boundary therefore all work
> has to be command-line (in a bash script). I've tried this two
> ways - using the d.mon start=png method and also the ps.map
> method as described below. The d.mon method appears to generate
> the image with only one vector map (not both) and only colors
> the borders - it won't use the fill_color setting. The ps.map
> method seems to work but assumes the image is on a sheet of
> paper so there's a ton of extra white-space. I'd like to use
> d.mon but I can use ps.map if someone could please let me know
> how to export only the computational region without all the
> extra 'paper' in the image. Here's my code:
>
> g.region vector='Country'
> export GRASS_RENDER_IMMEDIATE=png
> export GRASS_RENDER_WIDTH=640
> export GRASS_RENDER_HEIGHT=480
> export GRASS_RENDER_TRANSPARENT=true
> export GRASS_RENDER_TRUECOLOR=true
> export GRASS_RENDER_FILE=$HOME/country_admin.png
> export GRASS_RENDER_FILE_COMPRESSION=0
> export GRASS_MESSAGE_FORMAT=plain
> d.mon start=png
> d.vect map=Country color=210:210:210 fill_color=153:153:153
> display=shape type=area
> d.vect map=admin_area color=153:153:153 rgb_column=area_color
> display=shape type=area
> d.mon stop=png
>
> This only produces a png with the last vector listed and only
> the borders are colored with the rgb_column values.
>
>
> I think you are missing GRASS_RENDER_FILE_READ=TRUE:
> https://grass.osgeo.org/grass78/manuals/pngdriver.html
> <https://grass.osgeo.org/grass78/manuals/pngdriver.html>
>
> Regarding rgb_column, I am not sure, didn't have time to test.
>
> Anna
>
>
> If I do this without the d.mon start/stop lines ... i.e. relying
> on the GRASS_RENDER_IMMEDIATE=png only, then only one vector map
> is converted to png however it DOES do the color fill properly.
> With either above method the png is the correct size.
>
> Now using ps.map (same env variable set as above):
>
> g.region vector='Country'
> ps.map input=$HOME/ps_rules.txt out=$HOME/country_admin.ps
> --overwrite
> where ps_rules.txt is:
> border y
> color 81:81:81
> end
> vareas admin_area
> layer 1
> rgbcolumn area_color
> color 153:153:153
> end
> vareas Country
> color 210:210:210
> fcolor 153:153:153
> end
>
> We don't have pstopng but we do have ghostscript:
>
> gs-dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -dTextAlphaBits=4
> -dGraphicsAlphaBits=4 -r300 -sOutputFile=$HOME/country_admin.png
> $HOME/country_admin.ps
>
> This creates the correct image (color fills, etc) but has white
> margins and a lot of white space below the image likeit is
> printed at the top of a piece of paper.
>
> does anyone have any idea how to create a png with multiple
> vector maps overlaying each other (and not have the extra
> whitespace too)?
>
> v/r
> Chris
>
> _______________________________________________
> 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>
>
>
> _______________________________________________
> grass-user mailing list
> grass-user at lists.osgeo.org
> https://lists.osgeo.org/mailman/listinfo/grass-user
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: test_small.png
Type: image/png
Size: 48666 bytes
Desc: not available
URL: <http://lists.osgeo.org/pipermail/grass-user/attachments/20210216/0eb0cf57/attachment-0001.png>
More information about the grass-user
mailing list