[GRASS-dev] g.proj to create a new location

Hamish hamish_nospam at yahoo.com
Tue Feb 13 04:42:52 EST 2007


Michael Barton wrote:
> 
> Actually, looking at this, maybe it is more correct to do the
> following...
> 
> # first run g.proj to see if there are more than the default
> # parameters to choose from
> set input [open "|g.proj epsg=$epsgcode epsgloc=$epsgloc datumtrans=-1"]
> set dtrans [read $input]
> close $input
> if {$dtrans==""} {
>     # I assume that $dtrans=="" if there is only one default parameter.
>     # so use the default parameter.
>     open "|g.proj epsg=$epsgcode epsgloc=$epsgloc datumtrans=1"
> else {
>     # do some kind of selection dialog here where the user
>     # picks the desired datum transformation from the list in
>     # dtrans and "set dtsel [integer of user datum trans selection]"
>     open "|g.proj epsg=$epsgcode epsgloc=$epsgloc datumtrans=$dtsel"
> }


(it's location= not "epsgloc=")

I have no idea about tcl and little idea about system calls, so I'll
just run through the logic and hope it is easy to translate into tcl.


First pass once the user selects an EPSG code is to find datum transform
parms. -c and location=$name are not needed at this point.

# e.g., an EPSG code with 3 options (and 0 = "none")

G63> g.proj epsg=27200 datumtrans=-1  2> /dev/null
---
1
Used in whole nzgd49 region
towgs84=54.400,-20.100,183.100
Default 3-Parameter Transformation (May not be optimum for older datums; use this only if no more appropriate options are available.)
---
2
Used in New Zealand
nadgrids=nzgd2kgrid0005.gsb
LINZ NZGD49 NTv2 Distortion Model, accuracy 10-30cm
---
3
Used in New Zealand
towgs84=59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993
Accuracy approx. 4m



The default will always come first.

Each record is 5 lines in stdout,
1 ---
2 #
3 text: where it's used
4 text: proj4 parms
5 text: comment

from general/g.proj/datumtrans.c:

fprintf(stdout, "---\n%d\nUsed in %s\n%s\n%s\n",
	list->count, list->where_used,
	list->params, list->comment);

That's what you have to parse.


Here is what that looks likes if there are no options:
 (ie the EPSG code already specified them)

G63> g.proj epsg=2193 datumtrans=-1
G63> echo $?
0

So if the first pass "g.proj epsg=#### datumtrans=-1" exits
successfully, but sends nothing to stdout, you can go straight to:

 g.proj -c location=$name epsg=####

and you're done.


If you put in a bad EPSG code you get this:

G63> g.proj epsg=99999 datumtrans=-1 
ERROR 6: EPSG PCS/GCS code 99999 not found in EPSG support files.  Is this a valid EPSG coordinate system?
ERROR: Can't parse PROJ.4-style parameter string
G63> echo $?
1

which you can pick up from the non-zero exit code.


Back to the case that needs to be parsed:
If there is option text you need to create a dialog window from the
options, as well as a "0: leave unspecified" option at the bottom.
Then once the user has selected something from that,
 g.proj -c location=$name epsg=#### datumtrans=$number

and you're done.


make sense?

Hamish




More information about the grass-dev mailing list