60int pj_get_kv(
struct pj_info *info,
const struct Key_Value *in_proj_keys,
61 const struct Key_Value *in_units_keys)
67 char buffa[300], factbuff[50];
69 char proj_in[250], *datum, *params;
86 if (strlen(factbuff) > 0)
87 sscanf(factbuff,
"%lf", &(info->meters));
91 snprintf(proj_in,
sizeof(proj_in),
"%s", str);
95 snprintf(info->proj,
sizeof(info->proj),
"%s", str);
97 if (strlen(info->proj) <= 0)
98 snprintf(info->proj,
sizeof(info->proj),
"ll");
105 for (i = 0; i < in_proj_keys->nitems; i++) {
107 if (strcmp(in_proj_keys->key[i],
"name") == 0) {
112 else if (strcmp(in_proj_keys->key[i],
"init") == 0) {
117 else if (strcmp(in_proj_keys->key[i],
"zone") == 0) {
123 else if (strcmp(in_proj_keys->key[i],
"datum") == 0 ||
124 strcmp(in_proj_keys->key[i],
"dx") == 0 ||
125 strcmp(in_proj_keys->key[i],
"dy") == 0 ||
126 strcmp(in_proj_keys->key[i],
"dz") == 0 ||
127 strcmp(in_proj_keys->key[i],
"datumparams") == 0 ||
128 strcmp(in_proj_keys->key[i],
"nadgrids") == 0 ||
129 strcmp(in_proj_keys->key[i],
"towgs84") == 0 ||
130 strcmp(in_proj_keys->key[i],
"ellps") == 0 ||
131 strcmp(in_proj_keys->key[i],
"a") == 0 ||
132 strcmp(in_proj_keys->key[i],
"b") == 0 ||
133 strcmp(in_proj_keys->key[i],
"es") == 0 ||
134 strcmp(in_proj_keys->key[i],
"f") == 0 ||
135 strcmp(in_proj_keys->key[i],
"rf") == 0) {
140 else if (strcmp(in_proj_keys->key[i],
"proj") == 0) {
141 if (strcmp(in_proj_keys->value[i],
"ll") == 0)
142 snprintf(buffa,
sizeof(buffa),
"proj=longlat");
144 snprintf(buffa,
sizeof(buffa),
"proj=%s",
145 in_proj_keys->value[i]);
151 else if (strcmp(in_proj_keys->value[i],
"defined") == 0)
152 snprintf(buffa,
sizeof(buffa),
"%s", in_proj_keys->key[i]);
155 snprintf(buffa,
sizeof(buffa),
"%s=%s", in_proj_keys->key[i],
156 in_proj_keys->value[i]);
158 alloc_options(buffa);
163 if (sscanf(str,
"%d", &(info->zone)) != 1) {
166 if (info->zone < 0) {
169 info->zone = -info->zone;
172 snprintf(buffa,
sizeof(buffa),
"south");
173 alloc_options(buffa);
176 snprintf(buffa,
sizeof(buffa),
"zone=%d", info->zone);
177 alloc_options(buffa);
185 snprintf(buffa,
sizeof(buffa),
"ellps=%s", str);
186 alloc_options(buffa);
189 snprintf(buffa,
sizeof(buffa),
"a=%.16g", a);
190 alloc_options(buffa);
194 snprintf(buffa,
sizeof(buffa),
"b=%.16g", a);
196 snprintf(buffa,
sizeof(buffa),
"rf=%.16g", rf);
197 alloc_options(buffa);
202 snprintf(buffa,
sizeof(buffa),
"no_defs");
203 alloc_options(buffa);
208 snprintf(buffa,
sizeof(buffa),
"%s", params);
209 alloc_options(buffa);
215 else if (datum !=
NULL) {
218 snprintf(buffa,
sizeof(buffa),
"%s", params);
219 alloc_options(buffa);
227 snprintf(buffa,
sizeof(buffa),
"datum=%s", datum);
228 alloc_options(buffa);
241 alloc_options(
"type=crs");
242 pjc = proj_context_create();
243 if (!(pj = proj_create_argv(pjc, nopt, opt_in))) {
246 _(
"Unable to initialise PROJ with the following parameter list:"));
247 for (i = 0; i < nopt; i++) {
250 snprintf(
err,
sizeof(
err),
" +%s", opt_in[i]);
257 int perr = proj_errno(pj);
262 if (proj_get_type(pj) == PJ_TYPE_BOUND_CRS) {
263 PJ *source_crs = proj_get_source_crs(pjc, pj);
273 for (i = 0; i < nopt; i++)
274 deflen += strlen(opt_in[i]) + 2;
276 info->def = G_malloc(deflen + 1);
278 snprintf(buffa,
sizeof(buffa),
"+%s ", opt_in[0]);
282 for (i = 1; i < nopt; i++) {
283 snprintf(buffa,
sizeof(buffa),
"+%s ", opt_in[i]);
284 strcat(info->def, buffa);
323 char zonebuff[50], buffa[300];
330 info->proj[0] =
'\0';
338 if ((str ==
NULL) || (str[0] ==
'\0')) {
342 snprintf(info->proj,
sizeof(info->proj),
"ll");
343 snprintf(buffa,
sizeof(buffa),
"proj=latlong ellps=WGS84");
344 alloc_options(buffa);
352 while (s = strtok(s,
" \t\n"), s) {
353 if (strncmp(s,
"+unfact=", 8) == 0) {
355 info->meters = atof(s);
358 if (strncmp(s,
"+", 1) == 0)
360 if (nsize = strlen(s), nsize) {
362 fprintf(stderr,
"nopt = %d, s=%s\n", nopt, str);
364 _(
"Option input overflowed option table"));
367 if (strncmp(
"zone=", s, 5) == 0) {
368 snprintf(zonebuff,
sizeof(zonebuff),
"%s", s + 5);
369 sscanf(zonebuff,
"%d", &(info->zone));
372 if (strncmp(s,
"init=", 5) == 0) {
376 if (strncmp(
"proj=", s, 5) == 0) {
377 snprintf(info->proj,
sizeof(info->proj),
"%s", s + 5);
378 if (strcmp(info->proj,
"ll") == 0)
379 snprintf(buffa,
sizeof(buffa),
"proj=latlong");
381 snprintf(buffa,
sizeof(buffa),
"%s", s);
384 snprintf(buffa,
sizeof(buffa),
"%s", s);
386 alloc_options(buffa);
396 alloc_options(
"type=crs");
397 pjc = proj_context_create();
398 if (!(pj = proj_create_argv(pjc, nopt, opt_in))) {
399 G_warning(_(
"Unable to initialize pj cause: %s"),
400 proj_errno_string(proj_context_errno(pjc)));
404 if (proj_get_type(pj) == PJ_TYPE_BOUND_CRS) {
405 PJ *source_crs = proj_get_source_crs(pjc, pj);
414 for (i = 0; i < nopt; i++)
415 deflen += strlen(opt_in[i]) + 2;
417 info->def = G_malloc(deflen + 1);
419 snprintf(buffa,
sizeof(buffa),
"+%s ", opt_in[0]);
423 for (i = 1; i < nopt; i++) {
424 snprintf(buffa,
sizeof(buffa),
"+%s ", opt_in[i]);
425 strcat(info->def, buffa);
int pj_get_kv(struct pj_info *info, const struct Key_Value *in_proj_keys, const struct Key_Value *in_units_keys)
Create a pj_info struct Co-ordinate System definition from a set of PROJ_INFO / PROJ_UNITS-style key-...