22 #include <grass/gis.h>
23 #include <grass/gprojects.h>
24 #include <grass/glocale.h>
29 #define FINDERFUNC set_proj_lib
30 #define PERMANENT "PERMANENT"
33 static void alloc_options(
char *);
62 struct Key_Value *in_units_keys)
68 char buffa[300], factbuff[50];
69 char proj_in[50], *datum, *params;
79 strcpy(factbuff, str);
80 if (strlen(factbuff) > 0)
81 sscanf(factbuff,
"%lf", &(info->meters));
85 sprintf(proj_in,
"%s", str);
89 sprintf(info->proj,
"%s", str);
91 if (strlen(info->proj) <= 0)
92 sprintf(info->proj,
"ll");
95 for (i = 0; i < in_proj_keys->nitems; i++) {
97 if (strcmp(in_proj_keys->key[i],
"name") == 0) {
102 else if (strcmp(in_proj_keys->key[i],
"zone") == 0) {
109 else if (strcmp(in_proj_keys->key[i],
"datum") == 0
110 || strcmp(in_proj_keys->key[i],
"dx") == 0
111 || strcmp(in_proj_keys->key[i],
"dy") == 0
112 || strcmp(in_proj_keys->key[i],
"dz") == 0
113 || strcmp(in_proj_keys->key[i],
"datumparams") == 0
114 || strcmp(in_proj_keys->key[i],
"nadgrids") == 0
115 || strcmp(in_proj_keys->key[i],
"towgs84") == 0
116 || strcmp(in_proj_keys->key[i],
"ellps") == 0
117 || strcmp(in_proj_keys->key[i],
"a") == 0
118 || strcmp(in_proj_keys->key[i],
"b") == 0
119 || strcmp(in_proj_keys->key[i],
"es") == 0
120 || strcmp(in_proj_keys->key[i],
"f") == 0
121 || strcmp(in_proj_keys->key[i],
"rf") == 0) {
127 else if (strcmp(in_proj_keys->key[i],
"proj") == 0) {
128 if (strcmp(in_proj_keys->value[i],
"ll") == 0)
129 sprintf(buffa,
"proj=longlat");
131 sprintf(buffa,
"proj=%s", in_proj_keys->value[i]);
137 else if (strcmp(in_proj_keys->value[i],
"defined") == 0)
138 sprintf(buffa, in_proj_keys->key[i]);
141 sprintf(buffa,
"%s=%s",
142 in_proj_keys->key[i], in_proj_keys->value[i]);
144 alloc_options(buffa);
149 if (sscanf(str,
"%d", &(info->zone)) != 1) {
152 if (info->zone < 0) {
155 info->zone = -info->zone;
158 sprintf(buffa,
"south");
159 alloc_options(buffa);
162 sprintf(buffa,
"zone=%d", info->zone);
163 alloc_options(buffa);
171 sprintf(buffa,
"ellps=%s", str);
172 alloc_options(buffa);
175 sprintf(buffa,
"a=%.16g", a);
176 alloc_options(buffa);
180 sprintf(buffa,
"b=%.16g", a);
182 sprintf(buffa,
"rf=%.16g", rf);
183 alloc_options(buffa);
189 sprintf(buffa,
"no_defs");
190 alloc_options(buffa);
195 sprintf(buffa, params);
196 alloc_options(buffa);
202 else if (datum !=
NULL) {
205 sprintf(buffa, params);
206 alloc_options(buffa);
214 sprintf(buffa,
"datum=%s", datum);
215 alloc_options(buffa);
228 if (!(pj = pj_init(nopt1, opt_in))) {
230 _(
"Unable to initialise PROJ.4 with the following parameter list:"));
231 for (i = 0; i < nopt1; i++) {
234 sprintf(err,
" +%s", opt_in[i]);
238 G_warning(_(
"The error message: %s"), pj_strerrno(pj_errno));
246 static void alloc_options(
char *buffa)
250 nsize = strlen(buffa);
251 opt_in[nopt1++] = (
char *)G_malloc(nsize + 1);
252 sprintf(opt_in[nopt1 - 1], buffa);
262 char zonebuff[50], buffa[300];
266 info->proj[0] =
'\0';
269 if ((str ==
NULL) || (str[0] ==
'\0')) {
273 sprintf(info->proj,
"ll");
274 sprintf(buffa,
"proj=latlong ellps=WGS84");
275 nsize = strlen(buffa);
276 opt_in[nopt] = (
char *)G_malloc(nsize + 1);
277 sprintf(opt_in[nopt++], buffa);
285 while (s = strtok(s,
" \t\n"), s) {
286 if (strncmp(s,
"+unfact=", 8) == 0) {
288 info->meters = atof(s);
291 if (strncmp(s,
"+", 1) == 0)
293 if (nsize = strlen(s), nsize) {
295 fprintf(stderr,
"nopt = %d, s=%s\n", nopt, str);
299 if (strncmp(
"zone=", s, 5) == 0) {
300 sprintf(zonebuff,
"%s", s + 5);
301 sscanf(zonebuff,
"%d", &(info->zone));
304 if (strncmp(
"proj=", s, 5) == 0) {
305 sprintf(info->proj,
"%s", s + 5);
306 if (strcmp(info->proj,
"ll") == 0)
307 sprintf(buffa,
"proj=latlong");
314 nsize = strlen(buffa);
315 opt_in[nopt] = (
char *)G_malloc(nsize + 1);
316 sprintf(opt_in[nopt++], buffa);
326 if (!(pj = pj_init(nopt, opt_in))) {
327 G_warning(_(
"Unable to initialize pj cause: %s"),
328 pj_strerrno(pj_errno));
356 sprintf(pjnew->proj,
"ll");
357 if ((pjnew->pj = pj_latlong_from_proj(pjold->pj)) ==
NULL)
369 static char *buf =
NULL;
370 static size_t buf_len;
371 size_t len = strlen(gisbase) +
sizeof(GRIDDIR) + strlen(name) + 1;
377 buf = G_malloc(buf_len);
380 sprintf(buf,
"%s%s/%s", gisbase, GRIDDIR, name);
401 str = pj_get_def(iproj->pj, 1);
403 fprintf(stderr,
"%s: %s\n", _(
"Input Projection Parameters"),
406 fprintf(stderr,
"%s: %.16g\n", _(
"Input Unit Factor"),
414 str = pj_get_def(oproj->pj, 1);
416 fprintf(stderr,
"%s: %s\n", _(
"Output Projection Parameters"),
419 fprintf(stderr,
"%s: %.16g\n", _(
"Output Unit Factor"),