[GRASS-user] How to define the png image dimensions when using d.mon?

jean pierre huart jph at openjph.be
Wed Mar 9 09:01:14 PST 2016


Launching the two scripts directly in GRASS7 console using my 
location/mapset give the following results for just one width, height 
(1280,960):

Using d.mon (not ok)
viascript.png PNG 640x480 640x480+0+0 8-bit DirectClass 30.5KB 0.000u 
0:00.000

With GRASS_RENDER_IMMEDIATE (ok)
viascript2.png PNG 1280x960 1280x960+0+0 8-bit DirectClass 73.6KB 0.000u 
0:00.000

I will test it with the NC demo soon.
Jean Pierre

On 09/03/16 17:44, jean pierre huart wrote:
>
> I launch a script without starting GRASS explicitly on an existing 
> location, inspired by the solution proposed at 
> https://grasswiki.osgeo.org/wiki/Working_with_GRASS_without_starting_it_explicitly.
>
> I do not have any error in the logs, the image is created, but with 
> default size (640x480) and white background.
>
> I will try using the internal script console and give you a feed back 
> if it works or not on my location/mapset.
>
> Jean Pierre
>
> On 09/03/16 17:08, Moritz Lennert wrote:
>> On 09/03/16 16:55, jean pierre huart wrote:
>>> Bingo! Thanks Moritz,
>>>
>>> - the existing file... I didn't care about it, convinced that the
>>> --overwrite parameter will wipe it out.
>>
>> I agree that is a bit confusing (and could maybe be handled better), 
>> but --overwrite comes into action at the time of writing of the file, 
>> not at the time of reading the existing RENDER_FILE.
>>
>>> Launching this script in a cron, I've the feeling that the use of
>>> GRASS_RENDER_IMMEDIATE is more appropriate. By the way, the choice is
>>> simple, this solution works fine for me, but using d.mon does not.
>>
>> What does not work with d.mon ? Does my below script work for you (it 
>> uses the NC demo data set [1]) ?
>>
>> Moritz
>>
>> [1] https://grass.osgeo.org/download/sample-data/
>>
>>
>>>
>>> Ciao
>>>
>>> On 09/03/16 16:12, Moritz Lennert wrote:
>>>> On 09/03/16 15:39, jean pierre huart wrote:
>>>>> Thanks Vinay, for the suggestion but I get an error on the d.out.file
>>>>> instruction.
>>>>> By the way, I've investigated the problem a bit further and found 
>>>>> that I
>>>>> mixed up instructions from manuals of different versions.
>>>>> So coming back to GRASS v 7.0.x references I finally succeed in
>>>>> obtaining a solution but not 100% satisfactory.
>>>>>
>>>>> First trial create a unique image combining raster and vector, but 
>>>>> width
>>>>> and height remains at default and background is not transparent:
>>>>>
>>>>>       os.environ['GRASS_RENDER_TRANSPARENT'] = 'TRUE'
>>>>>       os.environ['GRASS_RENDER_WIDTH'] = str(1280)
>>>>>       os.environ['GRASS_RENDER_HEIGHT'] = str(960)
>>>>>       os.environ['GRASS_RENDER_FILE'] = filenameCombined.png
>>>>>
>>>>>       self.gscript.run_command('d.mon', overwrite=True, start='png',
>>>>> output=filename)
>>>>>       self.gscript.run_command('d.rast', map='{0}@{1}'.format(raster,
>>>>> currentmapset)
>>>>>       self.gscript.run_command('d.vect', map='{0}@{1}'.format(map,
>>>>> currentmapset), color='white', fill_color='none')
>>>>>       self.gscript.run_command('d.mon', stop="png")
>>>>>
>>>>>
>>>>> Second trial successfull for obtaining desired width, height and
>>>>> transparency of the background  but creating 2 images one for the 
>>>>> raster
>>>>> and the other for the vector, now I would like to combine them to 
>>>>> have
>>>>> only one image:
>>>>>
>>>>>       os.environ['GRASS_RENDER_IMMEDIATE'] = 'png'
>>>>>       os.environ['GRASS_RENDER_TRANSPARENT'] = 'TRUE'
>>>>>       os.environ['GRASS_RENDER_WIDTH'] = str(1280)
>>>>>       os.environ['GRASS_RENDER_HEIGHT'] = str(960)
>>>>>
>>>>>       os.environ['GRASS_RENDER_FILE'] = filenameOfRaster.png
>>>>>       self.gscript.run_command('d.rast', map='{0}@{1}'.format(raster,
>>>>> currentmapset))
>>>>>
>>>>>       os.environ['GRASS_RENDER_FILE'] = filenameOfVector.png
>>>>>       self.gscript.run_command('d.vect', map='{0}@{1}'.format(map,
>>>>> currentmapset), color='white', fill_color='none')
>>>>>
>>>>> Modifying this with the following
>>>>>
>>>>>       os.environ['GRASS_RENDER_FILE'] = filenameCombined.png
>>>>>       self.gscript.run_command('d.rast', map='{0}@{1}'.format(raster,
>>>>> currentmapset))
>>>>>       self.gscript.run_command('d.vect', map='{0}@{1}'.format(map,
>>>>> currentmapset), color='white', fill_color='none')
>>>>>
>>>>> ends with only the image of the vector.
>>>>>
>>>>> I've the feeling that using d.mon would be preferable, but it 
>>>>> seems that
>>>>> it does not take into account the environment variables (at the
>>>>> exception of GRASS_RENDER_FILE) that I propose.
>>>>
>>>> This script gives me differently sized png files with both maps
>>>> displayed and transparent background:
>>>>
>>>> import grass.script as gscript
>>>> import os
>>>>
>>>> os.environ['GRASS_RENDER_TRANSPARENT']='TRUE'
>>>>
>>>> for height in range(500,2000,500):
>>>>      for width in range(500,2000,500):
>>>>
>>>>          os.system('rm map.png')
>>>>          os.environ['GRASS_RENDER_HEIGHT']=str(height)
>>>>          os.environ['GRASS_RENDER_WIDTH']=str(width)
>>>>
>>>>          gscript.run_command('d.mon', overwrite=True, start='png',
>>>> output='map.png')
>>>>          gscript.run_command('d.rast', map_='elevation')
>>>>          gscript.run_command('d.vect', map_='roadsmajor')
>>>>          gscript.run_command('d.mon', stop="png")
>>>>
>>>>          os.system('identify map.png')
>>>>
>>>>
>>>> You can reach the same result with something like this:
>>>>
>>>> import grass.script as gscript
>>>> import os
>>>>
>>>> os.environ['GRASS_RENDER_TRANSPARENT']='TRUE'
>>>>
>>>> for height in range(500,2000,500):
>>>>      for width in range(500,2000,500):
>>>>
>>>>          os.system('rm map.png')
>>>>          os.environ['GRASS_RENDER_IMMEDIATE']='png'
>>>>          os.environ['GRASS_RENDER_FILE']='map.png'
>>>>          os.environ['GRASS_RENDER_FILE_READ']='TRUE'
>>>>          os.environ['GRASS_RENDER_HEIGHT']=str(height)
>>>>          os.environ['GRASS_RENDER_WIDTH']=str(width)
>>>>
>>>>          gscript.run_command('d.rast', map_='elevation')
>>>>          gscript.run_command('d.vect', map_='roadsmajor')
>>>>
>>>>          os.system('identify map.png')
>>>>
>>>>
>>>> You might have to watch out for existing files. If a file already
>>>> exists with the indicated name then GRASS cannot change its width and
>>>> height.
>>>>
>>>> Hope this helps,
>>>> Moritz
>>>
>>> _______________________________________________
>>> grass-user mailing list
>>> grass-user at lists.osgeo.org
>>> http://lists.osgeo.org/mailman/listinfo/grass-user
>>>
>>
>>
>> _______________________________________________
>> grass-user mailing list
>> grass-user at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/grass-user
>
> _______________________________________________
> grass-user mailing list
> grass-user at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/grass-user



More information about the grass-user mailing list