[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