[GRASS-dev] v.what and spatial index

Trevor Wiens twiens at interbaun.com
Wed Sep 13 09:50:24 EDT 2006


On Wed, 13 Sep 2006 15:32:00 +0200
Moritz Lennert wrote:

> Glynn Clements wrote:
> > Moritz Lennert wrote:
> > 
> >>>> How would this change from the first approach (if v.what could easily be 
> >>>> made to accept multiple coordinates) ? This would again mean 'blindly' 
> >>>> collecting points before seeing the results, or having to call v.what 
> >>>> multiple times.
> >>> v.what would read one coordinate pair, perform the lookup, write out
> >>> the result(s), repeat until EOF.
> >>>
> >>> gis.m would start one v.what process; each time you click the mouse
> >>> button, it would send the coordinates to the v.what process, read the
> >>> result, then display it. It would need to restart v.what if the set of
> >>> maps changed, but could use a single process to look up multiple
> >>> points.
> >> Here's my attempt at applying what you suggest. It's not very 
> >> complicated, and seems to work fine here, but I'd appreciate if someone 
> >> could check that I didn't do anything wrong before committing.
> > 
> > One issue which won't show up when running it directly from the shell,
> > but will if you run it via pipes: you need to explicitly set stdin and
> > stdout to line-buffered operation with e.g.:
> > 
> > 	setvbuf(stdin,  NULL, _IOLBF, 0);
> > 	setvbuf(stdout, NULL, _IOLBF, 0);
> 
> I assume this can be done anywhere as long as its before the call to stdin ?
> 
> > 
> >> Now we will have to change the query function in the gis manager (from 
> >> line 1474 of gui/tcltk/gis.m/mapcanvas.tcl) to use v.what with the -s 
> >> flag and to provide continuous flow of coordinates and an EOF at the 
> >> end. Michael, can you do this ? Or could someone tell me in rough lines 
> >> how this can be done ?
> > 
> > Ah. Tcl's "open" function doesn't directly support using pipes for
> > both stdin and stdout; you can choose read (stdout is a pipe, stdin is
> > inherited) or write (stdin is a pipe, stdout is inherited), but not
> > both.
> > 
> > You will need to create a named pipe (with mkfifo) then explicitly
> > redirect one of the ends to it, e.g.
> > 
> > 	set fifo $tmpdir/$tmpname
> > 	exec mkfifo $fifo
> > 	set rfh [open "|v.what map=$maplist <$fifo" r]
> > 	fconfigure $rfh -buffering line
> > 	set wfh [open $fifo w]
> > 	fconfigure $wfh -buffering line
> 
> Ok, I understand the principle of this, but don't know how and where to 
> apply it in mapcanvas.tcl. Don't have the time to dig into it right now. 
> Michael ?
> 
> Another question is whether it is worth doing all this (don't know how 
> much work it is to apply Glynn's solution) if we are going to change GUI 
> in a foreseeable future...
> 
Moritz,

Thanks for doing this. This change will also be useful for future GUI's.

T
-- 
Trevor Wiens 
twiens at interbaun.com

The significant problems that we face cannot be solved at the same 
level of thinking we were at when we created them. 
(Albert Einstein)




More information about the grass-dev mailing list