[STATSGRASS] gmeta6() returns empty string

Tilmann Steinmetz tilmann.steinmetz at geo.uni-halle.de
Wed Feb 28 04:50:55 EST 2007


Thanks Roger and Hamish,

I tried g.gisenv (good) and made an attempt with debug(gmeta6()) 
(unsuccessful)- output below. I am not aware of FreeBSD doing anything weird 
in exporting paths or environment variables in general. My shell is sh but I 
tried using bash too (same thing)

However, these 2 things came to my mind:

1.) using g.region -d from within Grass (be it grass62 -text or the tcl-gui) 
I get an empty string- this is wrong if I understand right? should (and can) 
that be remediated? is this the cause of all this trouble?

2.) if LD_LIBRARY_PATH (or the lack thereof) is to be blamed, then is there 
a way to force the R environment to "inherit" from its parent environment 
using something like > system("source .bashrc") within  R? but then that 
again could probably only get the "grass g.region -d" empty string. 

(why is g.region -d used in the first place, if g.region -g could be used? - 
that was my first try: replace gmeta6() with a function thats identical to 
it, but calls "g.region -g3", which failed because somewhere in the process 
some function call goes to g.region -d again..)

g.gisenv seems Ok:
**********************************************************************
Welcome to GRASS 6.2.1 (2006)
GRASS homepage:                          http://grass.itc.it/
This version running thru:               Bourne Shell (/bin/sh)
Help is available with the command:      g.manual -i
See the licence terms with:              g.version -c
Start the graphical user interface with: gis.m &
When ready to quit enter:                exit

Mapset <user1> in Location <spearfish60>
GRASS-GRID > g.gisenv
LOCATION_NAME=spearfish60
MAPSET=user1
DIGITIZER=none
GISDBASE=/usr/home/tilmann/GIS_data
MONITOR=x0
GRASS_GUI=text

Mapset <user1> in Location <spearfish60>
GRASS-GRID > eval `g.gisenv`

Mapset <user1> in Location <spearfish60>
GRASS-GRID > cat "$GISDBASE/$LOCATION_NAME"/PERMANENT/DEFAULT_WIND
proj:       1
zone:       13
north:      4928010
south:      4913700
east:       609000
west:       589980
cols:       634
rows:       477
e-w resol:  30
n-s resol:  30
top:        1
bottom:     0
cols3:      634
rows3:      477
depths:     1
e-w resol3: 30
n-s resol3: 30
t-b resol:  1

Mapset <user1> in Location <spearfish60>
GRASS-GRID >     

**********************************************************************
whereas debugging shows that gmeta6() stops right away at the first 
evaluation of the "g.region -g3" expression:
**********************************************************************

> debug(gmeta6())
debugging in: gmeta6()
debug: {
    tull <- ifelse(.Platform$OS.type == "windows", tx <- 
system("g.region -g3",
        intern = TRUE), tx <- system("g.region -g3", intern = TRUE,
        ignore.stderr = ignore.stderr))
    tx <- gsub("=", ":", tx)
    con <- textConnection(tx)
    res <- read.dcf(con)
    close(con)
    lres <- as.list(res)
    names(lres) <- colnames(res)
    lres$n <- as.double(lres$n)
    lres$s <- as.double(lres$s)
    lres$w <- as.double(lres$w)
    lres$e <- as.double(lres$e)
    lres$t <- as.double(lres$t)
    lres$b <- as.double(lres$b)
    lres$nsres <- as.double(lres$nsres)
    lres$nsres3 <- as.double(lres$nsres3)
    lres$ewres <- as.double(lres$ewres)
    lres$ewres3 <- as.double(lres$ewres3)
    lres$tbres <- as.double(lres$tbres)
    if (length(lres$rows) == 0)
        lres$rows <- abs(as.integer((lres$n - lres$s)/lres$nsres))
    else lres$rows <- as.integer(lres$rows)
    if (length(lres$rows3) == 0)
        lres$rows3 <- lres$rows
    else lres$rows3 <- as.integer(lres$rows3)
    if (length(lres$cols) == 0)
        lres$cols <- abs(as.integer((lres$e - lres$w)/lres$ewres))
    else lres$cols <- as.integer(lres$cols)
    if (length(lres$cols3) == 0)
        lres$cols3 <- lres$cols
    else lres$cols3 <- as.integer(lres$cols3)
    if (length(lres$depths) == 0)
        lres$depths <- abs(as.integer((lres$t - lres$b)/lres$tbres))
    else lres$depths <- as.integer(lres$depths)
    lres$proj4 <- getLocationProj()
    tull <- ifelse(.Platform$OS.type == "windows", gisenv <- 
system("g.gisenv",
        intern = TRUE), gisenv <- system("g.gisenv", intern = TRUE,
        ignore.stderr = ignore.stderr))
    gisenv <- gsub("[';]", "", gisenv)
    gisenv <- strsplit(gisenv, "=")
    glist <- as.list(sapply(gisenv, function(x) x[2]))
    names(glist) <- sapply(gisenv, function(x) x[1])
    lres <- c(glist, lres)
    class(lres) <- "gmeta6"
    lres
}
Browse[1]>
debug: tull <- ifelse(.Platform$OS.type == "windows", tx <- 
system("g.region -g3",
    intern = TRUE), tx <- system("g.region -g3", intern = TRUE,
    ignore.stderr = ignore.stderr))
Browse[1]>
ERROR: default region is invalid
       line 11: <top: 1>
debug: tx <- gsub("=", ":", tx)
Browse[1]>
debug: con <- textConnection(tx)
Browse[1]>
debug: res <- read.dcf(con)
Browse[1]>
debug: close(con)
Browse[1]>
debug: lres <- as.list(res)
Browse[1]>
debug: names(lres) <- colnames(res)
Browse[1]>
debug: lres$n <- as.double(lres$n)
Browse[1]>
debug: lres$s <- as.double(lres$s)
Browse[1]>
debug: lres$w <- as.double(lres$w)
Browse[1]>
debug: lres$e <- as.double(lres$e)
Browse[1]>
debug: lres$t <- as.double(lres$t)
Browse[1]>
debug: lres$b <- as.double(lres$b)
Browse[1]>
debug: lres$nsres <- as.double(lres$nsres)
Browse[1]>
debug: lres$nsres3 <- as.double(lres$nsres3)
Browse[1]>
debug: lres$ewres <- as.double(lres$ewres)
Browse[1]>
debug: lres$ewres3 <- as.double(lres$ewres3)
Browse[1]>
debug: lres$tbres <- as.double(lres$tbres)
Browse[1]>
debug: if (length(lres$rows) == 0) lres$rows <- abs(as.integer((lres$n -
    lres$s)/lres$nsres)) else lres$rows <- as.integer(lres$rows)
Browse[1]>
debug: if (length(lres$rows3) == 0) lres$rows3 <- lres$rows else lres$rows3 
<- as.integer(lres$rows3)
Browse[1]>
debug: if (length(lres$cols) == 0) lres$cols <- abs(as.integer((lres$e -
    lres$w)/lres$ewres)) else lres$cols <- as.integer(lres$cols)
Browse[1]>
debug: if (length(lres$cols3) == 0) lres$cols3 <- lres$cols else lres$cols3 
<- as.integer(lres$cols3)
Browse[1]>
debug: if (length(lres$depths) == 0) lres$depths <- abs(as.integer((lres$t -
    lres$b)/lres$tbres)) else lres$depths <- as.integer(lres$depths)
Browse[1]>
debug: lres$proj4 <- getLocationProj()
Browse[1]>
/libexec/ld-elf.so.1: g.proj: Undefined symbol "G_gettext"
Error in if (is.na(projstr)) uprojargs <- projstr else uprojargs <- 
paste(unique(unlist(strsplit(projstr,  :
        argument is of length zero
>
**********************************************************************
I'm at a loss here. As I said I could live with "manually" assigning the 
correct projection and/or environment from within R- just don't get it done. 
I faintly remember seeing something like it being used at a time before 
gmeta() was there- or am I wrong?

Thanks,
Tilmann

**************************************************************************

Am Dienstag 27 Februar 2007 22:26 schrieb Roger Bivand:
> Yesterday 22:26:14
>    
>
> On Tue, 27 Feb 2007, Tilmann Steinmetz wrote:
> > Am Dienstag 27 Februar 2007 21:07 schrieb Roger Bivand:
> > > On Tue, 27 Feb 2007, Tilmann Steinmetz wrote:
> > > > Hi,
> > > >
> > > > I am having difficulties getting the region environment settings 
from
> > > > grass into R using gmeta6() (see output below).
> > >
> > > If your LOCATION is spearfish*, the examples should work. I am not
> > > aware of any reason why FreeBSD should not work normally. Do you
> > > actually need gmeta6(), it is pretty deprecated now? Do readVECT6() or
> > > readRAST6() work?
> >
> > oh, I see!
> >
> > > It looks like a PATH/GRASSRC issue of some kind, where debugging at a
> > > distance is not an option. What does:
> > >
> > > Sys.getenv("GISRC")
> > >
> > > say?
> >
> > it's just the same with those:
> > > system("v.info bugsites")
> >
> >         /libexec/ld-elf.so.1: v.info: Undefined symbol "G_gettext"
>
> This is saying that when you try to run v.info, the underlying GRASS
> module is failing. There is *no* compiled code in spgrass6, so anything
> passed through system() should just work. Yours doesn't, you have a pretty
> non-standard system, so you have to work out why the GRASS shared
> libraries are not being seen by GRASS compiled modules when run from with
> R, but can apparently be seen when you leave R in the same shell.
>
> So:
>
> you open a terminal; you start GRASS -text in the terminal in your
> location; g.region -g works; you start R at the GRASS shell prompt
> in that terminal; system("g.region -g") does not work; q(); and g.region
> -g works again. This is FreeBSD shell layering of some kind, or
> LD_LIBRARY_* not being exported across shell instances. Are you running
> bash or sh or csh?
>
> To understand debug, ?debug
>
> Roger




More information about the grass-stats mailing list