00001 #include <string.h>
00002 #include <grass/gis.h>
00003 #include <grass/glocale.h>
00004
00005 static int lookup(const char *, const char *, char *, int);
00006 static int equal(const char *, const char *);
00007 static int lower(char);
00008
00009
00021 char *G_database_unit_name(int plural)
00022 {
00023 int n;
00024 static char name[256];
00025
00026 switch (n = G_projection()) {
00027 case PROJECTION_XY:
00028 case PROJECTION_UTM:
00029 case PROJECTION_LL:
00030 case PROJECTION_SP:
00031 return G__unit_name(G__projection_units(n), plural);
00032 }
00033
00034 if (!lookup(UNIT_FILE, plural ? "units" : "unit", name, sizeof(name)))
00035 strcpy(name, plural ? "units" : "unit");
00036 return name;
00037 }
00038
00039
00051 char *G_database_projection_name(void)
00052 {
00053 int n;
00054 static char name[256];
00055
00056 switch (n = G_projection()) {
00057 case PROJECTION_XY:
00058 case PROJECTION_UTM:
00059 case PROJECTION_LL:
00060 case PROJECTION_SP:
00061 return G__projection_name(n);
00062 }
00063 if (!lookup(PROJECTION_FILE, "name", name, sizeof(name)))
00064 strcpy(name, _("Unknown projection"));
00065 return name;
00066 }
00067
00068
00080 double G_database_units_to_meters_factor(void)
00081 {
00082 char *unit;
00083 double factor;
00084 char buf[256];
00085 int n;
00086
00087 static struct
00088 {
00089 char *unit;
00090 double factor;
00091 } table[] = {
00092 {"unit", 1.0},
00093 {"meter", 1.0},
00094 {"foot", .3048},
00095 {"inch", .0254},
00096 {NULL, 0.0}
00097 };
00098
00099 factor = 0.0;
00100 if (lookup(UNIT_FILE, "meters", buf, sizeof(buf)))
00101 sscanf(buf, "%lf", &factor);
00102 if (factor <= 0.0) {
00103 unit = G_database_unit_name(0);
00104 for (n = 0; table[n].unit; n++)
00105 if (equal(unit, table[n].unit)) {
00106 factor = table[n].factor;
00107 break;
00108 }
00109 }
00110 return factor;
00111 }
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00133 char *G_database_datum_name(void)
00134 {
00135 static char name[256], params[256];
00136 struct Key_Value *projinfo;
00137 int datumstatus;
00138
00139 if (lookup(PROJECTION_FILE, "datum", name, sizeof(name)))
00140 return name;
00141 else if ((projinfo = G_get_projinfo()) == NULL)
00142 return NULL;
00143 else
00144 datumstatus = G_get_datumparams_from_projinfo(projinfo, name, params);
00145
00146 G_free_key_value(projinfo);
00147 if (datumstatus == 2)
00148 return params;
00149 else
00150 return NULL;
00151 }
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 char *G_database_ellipse_name(void)
00163 {
00164 static char name[256];
00165
00166 if (!lookup(PROJECTION_FILE, "ellps", name, sizeof(name))) {
00167 double a, es;
00168
00169 G_get_ellipsoid_parameters(&a, &es);
00170 sprintf(name, "a=%.16g es=%.16g", a, es);
00171 }
00172
00173
00174 return name;
00175 }
00176
00177 static int lookup(const char *file, const char *key, char *value, int len)
00178 {
00179 char path[GPATH_MAX];
00180
00181
00182
00183
00184
00185
00186 G__file_name(path, "", file, "PERMANENT");
00187 return G_lookup_key_value_from_file(path, key, value, len) == 1;
00188 }
00189
00190 static int equal(const char *a, const char *b)
00191 {
00192 if (a == NULL || b == NULL)
00193 return a == b;
00194 while (*a && *b)
00195 if (lower(*a++) != lower(*b++))
00196 return 0;
00197 if (*a || *b)
00198 return 0;
00199 return 1;
00200 }
00201
00202 static int lower(char c)
00203 {
00204 if (c >= 'A' && c <= 'Z')
00205 c += 'a' - 'A';
00206 return c;
00207 }