[GRASS-dev] G.proj requirements?

Glynn Clements glynn at gclements.plus.com
Sun Dec 17 10:00:02 EST 2006


Paul Kelly wrote:

> I've re-organised g.proj a bit so it doesn't read the region and 
> projection from the current location unless it has to. But the problem 
> remains, in three places:
> (a) G_gisint()
> (b) G_tempfile()
> (c) G__put_window()/G__fopen_new()
> 
> (a) All modules have to call G_gisinit() at the start, and among other 
> things it checks for a valid current location and mapset. However the case 
> we're discussing is a rare example of where that isn't needed. Most of the 
> rest of what G_gisinit() does (from a quick skimming over the code) seems 
> related to raster modules and might possibly be possibly avoided?

Note that there is also G_no_gisinit(), which doesn't check for a
valid location/mapset.

This is probably more appropriate for a module which needs to run
without a valid mapset.

I do wonder whether it's appropriate for this functionality to be
bundled into g.proj rather than being a separate module.

> (b) If the call to G_gisinit() is simply commented out, the next problem 
> is G_tempfile() [deep within GRASS gproj library] which tries to create a 
> tempfile in the current mapset as far as I remember - is this a good/bad 
> idea? Certainly bad if you don't have a current mapset.

G_tempfile() uses the current mapset so that "draft" output maps can
be moved (with either link()+remove() or rename()) into their final
location upon closure. This requires them to reside on the same
filesystem (partition) as the mapset directory (i.e. you can't use
/tmp or $TMPDIR).

I suggest:

1. Rename the existing G_tempfile() function.

2. Add a new G_tempfile() which uses the /tmp/grass6-<user>-<pid>
directory (or possibly $TMPDIR) instead.

3. Change close_new() (lib/gis/closecell.c, used by G_close_cell() and
G_unopen_cell()) to use the existing (renamed) function. Ditto for
anything else which creates temporary files with the intention of
moving them (if there is anything else).

> (c) Hard-coding the tempfile path in lib/proj/datum.c instead of calling 
> G_tempfile() gets as far as writing out the new WIND and DEFAULT_WIND. 
> This is done by a call to G__put_window() in G__make_location().
> 
> G__fopen_new(), which is called by G__put_window(), makes a call to 
> G__check_gisinit() which fails [because we haven't called G_gisinit()].

G_no_gisinit() will suffice to keep G__check_gisinit() happy.

Note that the only thing that G__check_gisinit() actually verifies is
that certain fields in the G__ structure have been initialised
(specifically: fp_type, fp_nbytes, auto_mask), and that the mask
buffer has been allocated.

Unlike G_gisinit(), G_no_gisinit() doesn't set the program name, which
is probably a (design) bug, as G_fatal_error() etc assume that this
has been set.

> This would need quite a bit of re-engineering to fix in an elegant way, 
> definitely worth thinking about though IMHO. For now, looks like a 
> complicated workaround is required. :(

The G_check_gisinit() issue is solved by G_no_gisinit().

> The default region is still an issue also, as Helena said. I know I should 
> copy some code from r.in.gdal and v.in.ogr to g.proj to handle this as far 
> as possible (i.e. match the default region in the new location to the 
> georeferenced file - better than doing nothing). When there's some more 
> time can maybe do that. And it will still be a problem with creating from 
> EPSG code as the user is not forced or even reminded to set the region.

Maybe lib/gis/gisinit.c needs another function which forces
initialisation, creating a temporary gisdbase/location/mapset,
including WIND and ../PERMANENT/DEFAULT_WIND files.

-- 
Glynn Clements <glynn at gclements.plus.com>




More information about the grass-dev mailing list