get_datum.c

Go to the documentation of this file.
00001 /***********************************************************************
00002  * GRASS 5.0 gis library
00003  * get_datum.c, get datum parameters from location database
00004  *
00005  * Andreas Lange, andreas.lange@rhein-main.de
00006  * version 0.9
00007  * modified Jul 13 2000 
00008  *
00009  ***********************************************************************/
00010 
00011 #include "gis.h"
00012 #include "glocale.h"
00013 #include <unistd.h>
00014 #include <ctype.h>
00015 #include <string.h>
00016 #include <stdlib.h>
00017 
00018 static int getvalue(const char *, double *);
00019 static char *PERMANENT = "PERMANENT";
00020 
00021 /* G_get_datum_parameters
00022  *
00023  * This routine returns the datum parameters from the database.
00024  * If the PROJECTION_FILE exists in the PERMANENT mapset, read info from
00025  * that file, otherwise return WGS 84 values.
00026  *
00027  * Returns: 1 ok, 0 default values used, -1 on internal error.
00028  */
00029 
00053 int 
00054 G_get_datum_parameters (double *a, double *e2, double *f, 
00055                         double *dx, double *dy, double *dz)
00056 {
00057   int in_stat, get_parms = 0;
00058   char *str, *dat, *ellps, err[1024], ipath[1024];
00059   struct Key_Value *proj_keys;
00060 
00061 
00062   G__file_name (ipath, "", PROJECTION_FILE, PERMANENT);
00063   
00064   /* no PROJ_INFO file existing, return default wgs84 values */
00065   if (access(ipath,0) !=0) 
00066     {
00067       *a  = 6378137.0 ;
00068       *e2 = .006694385 ;
00069       *f  = 298.257223563;
00070       *dx = 0.0;
00071       *dy = 0.0;
00072       *dz = 0.0;
00073       return 0;
00074     }
00075   
00076   /* read in key values */
00077   proj_keys = G_read_key_value_file(ipath, &in_stat); 
00078   if (in_stat !=0)
00079     {
00080       sprintf (err, _("Unable to open file %s in %s"),PROJECTION_FILE,PERMANENT);
00081       G_fatal_error (err);
00082     }
00083   
00084   /* if datum key is existing, process values */
00085   if ((dat = G_find_key_value("datum",proj_keys))!=NULL) {
00086     
00087     str = G_find_key_value("a",proj_keys); 
00088     get_parms += getvalue(str, a);
00089       
00090     str = G_find_key_value("es",proj_keys);
00091     get_parms += getvalue(str, e2);
00092       
00093     str = G_find_key_value("f",proj_keys);
00094     get_parms += getvalue(str, f);
00095     
00096     str = G_find_key_value("dx",proj_keys);
00097     get_parms += getvalue(str, dx);
00098     
00099     str = G_find_key_value("dy",proj_keys);
00100     get_parms += getvalue(str, dy);
00101     
00102     str = G_find_key_value("dz",proj_keys);
00103     get_parms += getvalue(str, dz);
00104   
00105     if (get_parms) {
00106       if (G_datum_shift(G_get_datum_by_name(dat), dx, dy, dz) == 0) {
00107         sprintf(err, _("Error reading datum shift parameters for %s from table"), dat);
00108         G_fatal_error(err);
00109         return -1;
00110       }
00111       /* get ellipsoid parameters from PROJ_INFO */
00112       ellps = G_find_key_value("ellps",proj_keys);
00113       if (ellps!=NULL) {
00114         if (G_get_spheroid_by_name(ellps, a, e2, f) == 0) {
00115           sprintf(err, _("Error reading ellipsoid parameters for %s from table"), ellps);
00116           G_fatal_error(err);
00117           return -1;
00118         }
00119       } else {
00120         sprintf(err, _("No ellipsoid field %s in file %s in %s"), ellps, PROJECTION_FILE,PERMANENT);
00121         G_fatal_error (err);
00122         return -1;
00123       }
00124     }
00125     return 1;
00126   } else {
00127     /* no datum key in PROJ_INFO, supply wgs84 params */
00128     *a  = 6378137.0 ;
00129     *e2 = .006694385 ;
00130     *f  = 298.257223563;
00131     *dx = 0.0;
00132     *dy = 0.0;
00133     *dz = 0.0;
00134     return 0;
00135   }
00136 }
00137 
00138 /* placeholder, not yet implemented */
00139 
00159 int
00160 G_get_datum_parameters7(double *a, double *e2, double *f, 
00161                         double *dx, double *dy, double *dz, 
00162                         double *rx, double *ry, double *rz, double *m)
00163 {
00164   return -1;
00165 }
00166 
00167 static int 
00168 getvalue (const char *key, double *value)
00169 {
00170   char err[512];
00171 
00172   if (key!=NULL) {
00173     if(sscanf(key,"%lf",value)!=1) {
00174         sprintf (err, _("invalid value: field %s in file %s in %s")
00175                  ,key,PROJECTION_FILE,PERMANENT);
00176         G_fatal_error (err);
00177     } else {
00178       return 0;
00179     }
00180   }
00181   return 1;
00182 }

Generated on Mon Jan 1 19:49:25 2007 for GRASS by  doxygen 1.5.1