[GRASS5] datum transforms...

Paul Kelly paul-grass at stjohnspoint.co.uk
Sun Jan 12 16:03:31 EST 2003


Hello Eric

On Fri, 29 Nov 2002, Eric G. Miller wrote:

> After some prodding by Markus, I began looking at the datum transform

I've had a look at this also and seem to have it got it working too.
Only realised how important it was when I downloaded an ASTER 30m DEM.
It was in UTM / WGS84 and I needed to re-project it to Irish Grid, when
I found it was off by 30 to 50 metres everywhere. Hadn't realised how
vital datum transform functionality is to the [rsv].proj programs before
that. As well as getting datum transformation working I have also
implemented support for the Ireland 1965 datum in GRASS.

> problem again.  And, I see pj_transform() seems to already do what we
> need (inverse project, datum shift, forward project) with any part
> possibly being not applicable.  Does anyone know of a good reason not to
> use it?

Seems obvious to me also.

>
> After a little hacking, I have a modified s.proj that seems to work
> well (not heavily tested).

I have got [rsv].proj all working; I didn't need to make any changes to
those programs at all, only to files in the src/libes/proj directory (a
diff file is attached). Here is a summary:

src/libes/gis/datum.table, src/libes/proj/pj_datums.c:
Added a line for Ireland 1965 datum. gis/datum.table only has
3-parameter datum shift parameters, however if a 7-parameter
transformation is available it is more accurate and supported by the
proj library. I added the 3-parameter shift to this file and the
7-parameter (as supplied by Ordnance Survey of Northern Ireland and
Ordnance Survey Ireland) to the proj list in pj_datums.c.

src/libes/proj/ellipse.table:
Not sure what this file is used for but corrected missing underscores in
some of the ellipse names anyway.

src/libes/proj/pj_datums.c, pj_ellps.c:
Corrected for more missing underscores in datum and ellipse names and
filenames. In the standalone proj library versions of these files all
the descriptive names have underscores instead of spaces: it looks like
someone substituted all the underscores for spaces without checking. I
suppose the problem didn't manifest itself before as GRASS passed raw
ellipsoid parameters instead of names to proj wherever possible, but I
have changed this behaviour now (see below, get_proj.c)
Also added a definition for sphere to pj_ellps.c; this is also in the
standalone proj library distribution now.

src/libes/proj/get_proj.c:
Implemented Eric's suggestions to enable pj_transform() to be used:

>    pj_get_kv()
>      * don't just return 1 on strncmp(proj_in,"Lat",3) == 0 ||
>                             strcmp(info->proj,"ll") == 0
>      * when in_proj_keys->key[i] = "proj"
>             && in_proj_keys->value[i] = "ll"
>           set buffa = "proj=latlong"
>        (libproj uses "latlong" or "longlat" vs. GRASS's "ll")

Also some gratuitous changes: :) 
1. Don't pass the 'f' ellipsoid parameter from the PROJ_INFO file onto
proj as I don't know what it is and proj doesn't seem to need it

2. Change the logic for passing (a) datum names, (b) ellipsoid names and
(c) ellipsoid parameters.
(a) implies (b) implies (c), so just pass on the highest level that we
have available, i.e. if there is an ellipsoid name in the PROJ_INFO file
don't pass on the parameters, and if there is a datum name don't pass on
the ellipsoid name. This means the values in pj_datums.c and pj_ellps.c
will be used and are the definitive ones.

3. If a datum is specified don't pass on the dx dy dz transformation
parameters; proj will get these from pj_datums.c If a datum name isn't
specified but dx dy dz are, form these into a proper proj argument
'towgs84=dx,dy,dz' and pass that on.

src/libes/proj/do_proj.c:
Implemented Eric's ideas:

> do_proj.c:
>    * LL<->LL is no longer a no-op.
>    * change all variations of pj_fwd and pj_inv to one call to
>      pj_transform

Had a bit of a problem with this part:

>
> Before using pj_transform(), set the environment variable PROJ_LIB to
> $GISBASE/etc/nad
>
> #define GRIDDIR "/etc/nad"
>
> static void set_proj_lib_env (void)
> {
>     const char *gisbase = G_gisbase();
>     char *value = NULL;
>     size_t len = strlen(gisbase) * sizeof(GRIDDIR) + 1;
>     value = G_malloc (len);
>     sprintf (value, "%s%s", gisbase, GRIDDIR);
>     if (setenv ("PROJ_LIB", value, 1) == 0)
>         fprintf(stderr, "set PROJ_LIB='%s'\n", value);
>     else
>         fprintf(stderr, "failed to set PROJ_LIB='%s'\n", value);
>
>     free (value);
> }
>

I have put that in but you will see in the diff file it is currently
commented out. 'setenv' doesn't appear to be a function on my (IRIX 6.2)
system; I'm not sure what library might be needed or if there's a better
way of doing this? Perhaps the path to the conversion tables could be
added to the nadgrids line in pj_datums.c? I don't really have any
American data so I can't really test this without a lot of effort.
However the NAD27 and NAD83 datum conversions are currently still
handled via the set_datumshift() / pj_do_proj_nad() hack so this still
works.

And that's it! After recompiling [rsv].proj to link in the new library
they now all appear to be doing datum conversions properly. It seems
amazing to me that all the code to do WGS84 datum conversions was
already in GRASS and the pj_transform() function was just waiting to be
called.

>
> Since pj_transform operates on arrays and has height values (required),

(I had to use a dummy variable for the height value.)

> a slightly different interface from do_proj might be appropriate (to
> take advantage of transforming arrays in one "pass").

Yes, and perhaps the height conversion could be useful too, maybe for
taking in GPS data in ellipsoidal height format and converting it to
orthometric height. But there could well be more to it than that; I
don't really understand it but it might be useful for s.proj at least.
I wouldn't mind looking at implementing one-pass array transforms as
well when I have time.

>
> Anyway, comments?
>

Likewise. I feel that this is nearly ready to go into GRASS now but
needs a bit of polishing and some checking from other people. But really
I would like to remove the current NAD27 / NAD83 hack and have the
American datum transformations handled the same as all the other ones,
by pj_transform() alone. Need some help from somebody who can do that
and has some test data though.

Paul
-------------- next part --------------
? grass/src/libes/proj/OBJ.mips-sgi-irix6.2
Index: grass/src/libes/gis/datum.table
===================================================================
RCS file: /home/grass/grassrepository/grass/src/libes/gis/datum.table,v
retrieving revision 1.3
diff -u -r1.3 datum.table
--- grass/src/libes/gis/datum.table	6 Sep 2002 12:32:44 -0000	1.3
+++ grass/src/libes/gis/datum.table	12 Jan 2003 19:44:53 -0000
@@ -63,3 +60,6 @@
 carthage "Carthage 1934 Tunisia"	  	  clark80	dx=-263.0	dy=6.0	dz=431.0
 # Hermannskogel
 hermannskogel "Hermannskogel"		  bessel	dx=653	    dy=-212     dz=449
+# Ireland 1965 - From NIMA document - but more accurate 7-parameter transform
+# from Ordnance Survey Ireland is specified in src/libes/proj/pj_datums.c
+ire65    "Ireland 1965"                   modif_airy    dx=506      dy=-122     dz=611
Index: grass/src/libes/proj/do_proj.c
===================================================================
RCS file: /home/grass/grassrepository/grass/src/libes/proj/do_proj.c,v
retrieving revision 1.3
diff -u -r1.3 do_proj.c
--- grass/src/libes/proj/do_proj.c	20 Apr 2002 19:13:44 -0000	1.3
+++ grass/src/libes/proj/do_proj.c	12 Jan 2003 19:29:35 -0000
@@ -6,52 +6,71 @@
 
 /********************* PARMS FOR PROJ **********************/ 
 
-#define STP_FT 	0.30480060960121920243
+#define GRIDDIR "/etc/nad"
 
-static double STP = 1.0;
 static double METERS_in = 1.0, METERS_out = 1.0;
 
-/* typedef struct { double u, v; }		UV; */
+/* static void set_proj_lib_env (void); */
 
 int pj_do_proj(x,y,info_in,info_out)
   double *x,*y;
   struct pj_info *info_in,*info_out;
 {
-        int inverse; 
-        projUV  data;
-
+        /* pj_transform() can also convert between ellipsoidal and orthometric
+	 * heights but we're not using this facility at present PK */
+        double dummyz = 0;   
+      
         METERS_in = info_in->meters;
         METERS_out = info_out->meters;
-
+   
         if (strncmp(info_in->proj,"ll",2) == 0 ) {
-          if (strncmp(info_out->proj,"ll",2) == 0 )
-	    /* LL->LL is a no-op */ ;
-          else  {
-            data.u = (*x) / RAD_TO_DEG;
-            data.v = (*y) / RAD_TO_DEG;
-            data = pj_fwd(data,info_out->pj);
-            *x = data.u / METERS_out;
-            *y = data.v / METERS_out;
-          }
+            *x = (*x) / RAD_TO_DEG;
+            *y = (*y) / RAD_TO_DEG;
         } 
         else {
-          if (strncmp(info_out->proj,"ll",2) == 0 ) {
-            data.u = *x * METERS_in;
-            data.v = *y * METERS_in;
-            data = pj_inv(data,info_in->pj);
-            *x = data.u * RAD_TO_DEG;
-            *y = data.v * RAD_TO_DEG;
-          }
-          else {
-            data.u = *x * METERS_in;
-            data.v = *y * METERS_in;
-            data = pj_inv(data,info_in->pj);
-            data = pj_fwd(data,info_out->pj);
-            *x = data.u / METERS_out;
-            *y = data.v / METERS_out;
-          }
-       }
-       return 1;
+            *x = *x * METERS_in;
+            *y = *y * METERS_in;
+        }
+
+        /* Set environment variable to let proj lib know where 
+	 * conversion tables are kept PK */
+/*        set_proj_lib_env(); */
+
+        /* 3rd and 4th arguments are respectively the number of points to be 
+	 * transformed (only one at a time here) and (redundant in this 
+	 * example) the step size (offset) in doubles between each 
+	 * set of points PK */
+        pj_transform(info_in->pj, info_out->pj, 1, 1, x, y, &dummyz);
+
+        if (strncmp(info_out->proj,"ll",2) == 0 ) {
+            *x = *x * RAD_TO_DEG;
+            *y = *y * RAD_TO_DEG;
+        }
+        else {
+            *x = *x / METERS_out;
+            *y = *y / METERS_out;
+        }
+   
+   
+        return 1;
+}
+
+/* By Eric Miller 
+ * see http://grass.itc.it/pipermail/grass5/2002-November/004419.html */
+
+/*
+static void set_proj_lib_env (void)
+{
+       const char *gisbase = G_gisbase();
+       char *value = NULL;
+       size_t len = strlen(gisbase) * sizeof(GRIDDIR) + 1;
+       value = G_malloc (len);
+       sprintf (value, "%s%s", gisbase, GRIDDIR);
+       if (setenv ("PROJ_LIB", value, 1) == 0)
+             fprintf(stderr, "set PROJ_LIB='%s'\n", value);
+       else
+             fprintf(stderr, "failed to set PROJ_LIB='%s'\n", value);
+   
+       free (value);
 }
- 
-       
+*/
Index: grass/src/libes/proj/ellipse.table
===================================================================
RCS file: /home/grass/grassrepository/grass/src/libes/proj/ellipse.table,v
retrieving revision 1.1
diff -u -r1.1 ellipse.table
--- grass/src/libes/proj/ellipse.table	20 Apr 2002 19:13:44 -0000	1.1
+++ grass/src/libes/proj/ellipse.table	12 Jan 2003 19:29:35 -0000
@@ -1,7 +1,7 @@
 "airy",	"a=6377563.396",	"rf=299.3249646",	"Airy 1830"
 "australian",	"a=6378160.000",	"rf=298.25",	"Australian National"
 "bessel",	"a=6377397.155",	"rf=299.1528128",	"Bessel 1841"
-"bess nam",	"a=6377483.865",	"rf=299.1528128",	"Bessel 1841, Namibia"
+"bess_nam",	"a=6377483.865",	"rf=299.1528128",	"Bessel 1841, Namibia"
 "clark66",	"a=6378206.400",	"rf=294.9786982",	"Clarke 1866"
 "clark80",	"a=6378249.145",	"rf=293.465",	"Clarke 1880"
 "everest",	"a=6377276.345",	"rf=300.8017",	"Everest 1830, India"
@@ -16,7 +16,7 @@
 "indonesian",	"a=6378160.000",	"rf=298.247",	"Indonesian 1974"
 "international",	"a=6378388.000",	"rf=297.0",	"International 1924"
 "krassovsky",	"a=6378245.000",	"rf=298.3",	"Krassovsky 1940"
-"modif airy",	"a=6377340.189",	"rf=299.3249646",	"Airy 1830 Modified"
+"modif_airy",	"a=6377340.189",	"rf=299.3249646",	"Airy 1830 Modified"
 "sam69",	"a=6378160.000",	"rf=298.25",	"South American 1969"
 "SAD-69",	"a=6378160.000",	"rf=298.25",	"South American 1969"
 "wgs72",	"a=6378135.000",	"rf=298.26",	"World Geodetic System 1972"
@@ -24,7 +24,7 @@
 "grs75",	"a=6378140.000",	"b=6356755.288",	"GRS75"
 "hayford",	"a=6378388.000",	"rf=297.000",	"Hayford"
 "apl4.9",	"a=6378137.0",	"rf=298.25",	"Appl. Phys. 1965"
-"aust sa",	"a=6378160.000",	"rf=298.25",	"Australian Natl & S. Amer. 1969"
+"aust_sa",	"a=6378160.000",	"rf=298.25",	"Australian Natl & S. Amer. 1969"
 "andrae",	"a=6377104.43",	"rf=300.0",	"Andrae 1876"
 "cpm",	"a=6375738.7",	"rf=334.29",	"Comm. des Poids et Mesures 1799"
 "delmbr",	"a=6376428.0",	"rf=311.5",	"Delambre 1810"
@@ -39,7 +39,7 @@
 "lerch",	"a=6378139.0",	"rf=298.257",	"Lerch 1976"
 "mprts",	"a=6397300.0",	"rf=191.0",	"Maupertius 1738"
 "merit",	"a=6378137.000",	"rf=298.257",	"MERIT 1983"
-"new intl",	"a=6378157.500",	"b=6356772.2",	"New International 1967"
+"new_intl",	"a=6378157.500",	"b=6356772.2",	"New International 1967"
 "nwl9d",	"a=6378145.000",	"rf=298.25",	"Naval Weapons Lab., 1965"
 "plessis",	"a=6376523.0",	"b=6355863.0",	"Plessis 1817"
 "seasia",	"a=6378155.000",	"b=6356773.3205",	"South East Asia"
@@ -47,5 +47,5 @@
 "walbeck",	"a=6376896.000",	"b=6355834.8467",	"Walbeck"
 "wgs60",	"a=6378165.000",	"rf=298.3",	"WGS60"
 "wgs66",	"a=6378145.000",	"rf=298.25",	"WGS66"
-"everest m",	"a=6377304.063",	"rf=300.8017",	"Modified Everest"
-"everest p",	"a=6377309.613",	"rf=300.8017",	"Everest (Pakistan)"
+"everest_m",	"a=6377304.063",	"rf=300.8017",	"Modified Everest"
+"everest_p",	"a=6377309.613",	"rf=300.8017",	"Everest (Pakistan)"
Index: grass/src/libes/proj/get_proj.c
===================================================================
RCS file: /home/grass/grassrepository/grass/src/libes/proj/get_proj.c,v
retrieving revision 1.3
diff -u -r1.3 get_proj.c
--- grass/src/libes/proj/get_proj.c	20 Apr 2002 19:13:44 -0000	1.3
+++ grass/src/libes/proj/get_proj.c	12 Jan 2003 19:29:35 -0000
@@ -53,30 +53,64 @@
 	if (strlen(info->proj) <= 0)
 		sprintf(info->proj, "ll");
 
-	if (strncmp(proj_in, "Lat", 3) == 0 
-            || strcmp(info->proj,"ll") == 0) {
-		return 1;
-	}
-	nopt1 = 0;
+        nopt1 = 0;
 	south = 0;
+   
 	/* if zone is negative, write abs(zone) and define south */
 	for (i = 0; i < in_proj_keys->nitems; i++) {
-                /* the name parameter is just for grasses use */
+
+	   /* the name parameter is just for grasses use */
                 if( strncmp(in_proj_keys->key[i],"name",4) == 0 ) {
                     continue;
 
-		/* Don't pass through any ellps= settings if we have the
-                   underlying parameters.  */
+		/* proj lib doesn't seem to need f for anything PK */
+
+		} else if( strncmp(in_proj_keys->key[i], "f", 1) == 0 ) {
+		    continue;
+		   
+		/* Don't need dx dy dz if datum= is specified; proj lib will 
+		 * get these from pj_datums.c file; otherwise dx dy dz
+		 * taken care off after end of this loop PK */
+
+                } else if( strncmp(in_proj_keys->key[i], "dx", 2) == 0
+			   || strncmp(in_proj_keys->key[i], "dy", 2) == 0
+		           || strncmp(in_proj_keys->key[i], "dz", 2) == 0 ) {
+		    continue;
+		
+		   
+                /* Don't pass through underlying parameters if we have ellps=
+		 * settings; don't pass through ellps= settings if we have
+		 * datum= settings. Changed from old logic by PK to use only
+		 * top-level data sources if possible (i.e. within proj lib.) */
+
+                } else if( strncmp(in_proj_keys->key[i], "a", 1) == 0
+			   || strncmp(in_proj_keys->key[i], "b", 1) == 0
+			   || strncmp(in_proj_keys->key[i], "es", 2) == 0
+		           || strncmp(in_proj_keys->key[i], "rf", 2) == 0 ) {
+		    if( G_find_key_value("ellps", in_proj_keys) != NULL
+		        || G_find_key_value("datum", in_proj_keys) != NULL)
+		        continue;
+                    else
+                        sprintf(buffa, "%s=%s", 
+                                in_proj_keys->key[i], in_proj_keys->value[i]);             	       		
 
 		} else if( strncmp(in_proj_keys->key[i], "ellps", 5) == 0 ) {
-                    if( G_find_key_value("a", in_proj_keys) != NULL
-                        && (G_find_key_value("b", in_proj_keys) != NULL
-                            || G_find_key_value("es", in_proj_keys) != NULL
-                            || G_find_key_value("rf", in_proj_keys) != NULL))
+                    if( G_find_key_value("datum", in_proj_keys) != NULL)
                         continue;
                     else
                         sprintf(buffa, "%s=%s", 
                                 in_proj_keys->key[i], in_proj_keys->value[i]);
+
+		/* proj lib uses latlong instead of ll as 'projection name';
+		 * probably less dangerous to make the change here PK    */
+		   
+		} else if( strncmp(in_proj_keys->key[i], "proj", 4) == 0 ) {
+		    if( strncmp(G_find_key_value("proj", in_proj_keys), "ll", 2) == 0)
+                        sprintf(buffa, "%s=latlong", in_proj_keys->key[i]);
+		    else
+                        sprintf(buffa, "%s=%s", 
+                                in_proj_keys->key[i], in_proj_keys->value[i]);
+		     		   		   
                 } else if (strncmp(in_proj_keys->key[i], "south", 5) == 0) {
 			sprintf(buffa, "south");
 			south = 1;
@@ -111,7 +145,8 @@
 
 		else if (strncmp(in_proj_keys->key[i], "no_defs", 7) == 0)
 			sprintf(buffa, "no_defs");
-		/* workaround because pj_ellps.c does not include sphere as valid ellipsoid */
+
+	   /* workaround because pj_ellps.c does not include sphere as valid ellipsoid */
 		else 
 			sprintf(buffa, "%s=%s", 
                                 in_proj_keys->key[i], in_proj_keys->value[i]);
@@ -122,13 +157,29 @@
                 sprintf(opt_in[nopt1-1], buffa);
 	}
 
+        /* If datum= is not specified but dx dy dz are, we can use them to
+	 * form the towgs84 parameter for datum shift PK */
+        if( G_find_key_value("datum", in_proj_keys) == NULL
+	    && G_find_key_value("dx", in_proj_keys) != NULL
+	    && G_find_key_value("dy", in_proj_keys) != NULL
+	    && G_find_key_value("dz", in_proj_keys) != NULL ) {
+	        sprintf(buffa, "towgs84=%s,%s,%s",
+			G_find_key_value("dx", in_proj_keys),
+			G_find_key_value("dy", in_proj_keys),
+			G_find_key_value("dz", in_proj_keys) );      
+                nsize = strlen(buffa);
+                if (!(opt_in[nopt1++] = (char *) malloc(nsize + 1)))
+                    G_fatal_error("cannot allocate options\n");
+                sprintf(opt_in[nopt1-1], buffa);
+        }
+
         if (!(pj = pj_init(nopt1, opt_in))) {
             fprintf(stderr, "cannot initialize pj\ncause: ");
             fprintf(stderr,"%s\n",pj_strerrno(pj_errno));
             return -1;
         }
         info->pj = pj;
-
+	
 	return 1;
 }
 
Index: grass/src/libes/proj/pj_datums.c
===================================================================
RCS file: /home/grass/grassrepository/grass/src/libes/proj/pj_datums.c,v
retrieving revision 1.2
diff -u -r1.2 pj_datums.c
--- grass/src/libes/proj/pj_datums.c	29 May 2002 10:21:22 -0000	1.2
+++ grass/src/libes/proj/pj_datums.c	12 Jan 2003 19:29:37 -0000
@@ -56,7 +62,7 @@
 /* id       definition                               ellipse  comments */
 /* --       ----------                               -------  -------- */
 "ggrs87",   "towgs84=-199.87,74.79,246.62",          "grs80", "Greek Geodetic Reference System 1987",
-"nad27",    "nadgrids=conus,ntv1 can.dat",           "clark66", "North American Datum 1927",
+"nad27",    "nadgrids=conus,ntv1_can.dat",           "clark66", "North American Datum 1927",
 "wgs84",  "towgs84=0.0,0.0,0.0",  "wgs84",  "World Geodetic System 1984",
 "wgs72",  "towgs84=0.0,0.0,5.0",  "wgs72",  "World Geodetic System 1972",
 "nad83",  "towgs84=0.0,0.0,0.0",  "grs80",  "North American 1983",
@@ -79,5 +85,6 @@
 "potsdam",  "towgs84=606.0,23.0,413.0",  "bessel",  "Potsdam Rauenberg 1950 DHDN",
 "carthage",  "towgs84=-263.0,6.0,431.0",  "clark80",  "Carthage 1934 Tunisia",
 "hermannskogel", "towgs84=653.0,-212.0,449.0",  "bessel",  "Hermannskogel",
+"ire65",  "towgs84=482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",  "modif_airy", "Ireland 1965",
 NULL,       NULL,                                    NULL,    NULL ,
 };
Index: grass/src/libes/proj/pj_ellps.c
===================================================================
RCS file: /home/grass/grassrepository/grass/src/libes/proj/pj_ellps.c,v
retrieving revision 1.2
diff -u -r1.2 pj_ellps.c
--- grass/src/libes/proj/pj_ellps.c	20 Apr 2002 19:13:44 -0000	1.2
+++ grass/src/libes/proj/pj_ellps.c	12 Jan 2003 19:29:37 -0000
@@ -9,7 +9,7 @@
 "airy",	"a=6377563.396",	"rf=299.3249646",	"Airy 1830",
 "australian",	"a=6378160.000",	"rf=298.25",	"Australian National",
 "bessel",	"a=6377397.155",	"rf=299.1528128",	"Bessel 1841",
-"bess nam",	"a=6377483.865",	"rf=299.1528128",	"Bessel 1841, Namibia",
+"bess_nam",	"a=6377483.865",	"rf=299.1528128",	"Bessel 1841, Namibia",
 "clark66",	"a=6378206.400",	"rf=294.9786982",	"Clarke 1866",
 "clark80",	"a=6378249.145",	"rf=293.465",	"Clarke 1880",
 "everest",	"a=6377276.345",	"rf=300.8017",	"Everest 1830, India",
@@ -24,7 +24,7 @@
 "indonesian",	"a=6378160.000",	"rf=298.247",	"Indonesian 1974",
 "international",	"a=6378388.000",	"rf=297.0",	"International 1924",
 "krassovsky",	"a=6378245.000",	"rf=298.3",	"Krassovsky 1940",
-"modif airy",	"a=6377340.189",	"rf=299.3249646",	"Airy 1830 Modified",
+"modif_airy",	"a=6377340.189",	"rf=299.3249646",	"Airy 1830 Modified",
 "sam69",	"a=6378160.000",	"rf=298.25",	"South American 1969",
 "SAD-69",	"a=6378160.000",	"rf=298.25",	"South American 1969",
 "wgs72",	"a=6378135.000",	"rf=298.26",	"World Geodetic System 1972",
@@ -32,7 +32,7 @@
 "grs75",	"a=6378140.000",	"b=6356755.288",	"GRS75",
 "hayford",	"a=6378388.000",	"rf=297.000",	"Hayford",
 "apl4.9",	"a=6378137.0",	"rf=298.25",	"Appl. Phys. 1965",
-"aust sa",	"a=6378160.000",	"rf=298.25",	"Australian Natl & S. Amer. 1969",
+"aust_sa",	"a=6378160.000",	"rf=298.25",	"Australian Natl & S. Amer. 1969",
 "andrae",	"a=6377104.43",	"rf=300.0",	"Andrae 1876",
 "cpm",	"a=6375738.7",	"rf=334.29",	"Comm. des Poids et Mesures 1799",
 "delmbr",	"a=6376428.0",	"rf=311.5",	"Delambre 1810",
@@ -47,7 +47,7 @@
 "lerch",	"a=6378139.0",	"rf=298.257",	"Lerch 1976",
 "mprts",	"a=6397300.0",	"rf=191.0",	"Maupertius 1738",
 "merit",	"a=6378137.000",	"rf=298.257",	"MERIT 1983",
-"new intl",	"a=6378157.500",	"b=6356772.2",	"New International 1967",
+"new_intl",	"a=6378157.500",	"b=6356772.2",	"New International 1967",
 "nwl9d",	"a=6378145.000",	"rf=298.25",	"Naval Weapons Lab., 1965",
 "plessis",	"a=6376523.0",	"b=6355863.0",	"Plessis 1817",
 "seasia",	"a=6378155.000",	"b=6356773.3205",	"South East Asia",
@@ -55,7 +55,8 @@
 "walbeck",	"a=6376896.000",	"b=6355834.8467",	"Walbeck",
 "wgs60",	"a=6378165.000",	"rf=298.3",	"WGS60",
 "wgs66",	"a=6378145.000",	"rf=298.25",	"WGS66",
-"everest m",	"a=6377304.063",	"rf=300.8017",	"Modified Everest",
-"everest p",	"a=6377309.613",	"rf=300.8017",	"Everest (Pakistan)",
+"everest_m",	"a=6377304.063",	"rf=300.8017",	"Modified Everest",
+"everest_p",	"a=6377309.613",	"rf=300.8017",	"Everest (Pakistan)",
+"sphere",   "a=6370997.0",  "b=6370997.0", "Normal Sphere (r=6370997)",   
 0,0,0,0
 };


More information about the grass-dev mailing list