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@PERMANENT fill_color=none
d.vect map=roadsmajor@PERMANENT color=255:0:0:255
d.vect map=schools_wake@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á <kratocha...@gmail.com> wrote:




On Tue, Feb 9, 2021 at 4:41 PM Chris Bartolomei <surf...@yahoo.com <mailto:surf...@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á
    <kratocha...@gmail.com <mailto:kratocha...@gmail.com>> wrote:


    Hi,

    On Tue, Feb 9, 2021 at 10:25 AM Chris Bartolomei via grass-user
    <grass-user@lists.osgeo.org <mailto:grass-user@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@lists.osgeo.org <mailto:grass-user@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@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/grass-user


_______________________________________________
grass-user mailing list
grass-user@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/grass-user

Reply via email to