00001
00002
00003
00004
00005
00006
00007
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
00022
00023
00024
00025
00026
00027
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
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
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
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
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
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
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 }