#define _IN_GEOD_SET #include #include "projects.h" #include "geodesic.h" #include "emess.h" void geod_set(int argc, char **argv) { paralist *start = 0, *curr; double es; char *name; int i; /* put arguments into internal linked list */ if (argc <= 0) emess(1, "no arguments in initialization list"); for (i = 0; i < argc; ++i) if (i) curr = curr->next = pj_mkparam(argv[i]); else start = curr = pj_mkparam(argv[i]); /* set elliptical parameters */ if (pj_ell_set(start, &geod_a, &es)) emess(1,"ellipse setup failure"); /* set units */ if (name = pj_param(start, "sunits").s) { char *s; struct PJ_UNITS *unit_list = pj_get_units_ref(); for (i = 0; (s = unit_list[i].id) && strcmp(name, s) ; ++i) ; if (!s) emess(1,"%s unknown unit conversion id", name); fr_meter = 1. / (to_meter = atof(unit_list[i].to_meter)); } else to_meter = fr_meter = 1.; if (ellipse = es != 0.) { onef = sqrt(1. - es); geod_f = 1 - onef; f2 = geod_f/2; f4 = geod_f/4; f64 = geod_f*geod_f/64; } else { onef = 1.; geod_f = f2 = f4 = f64 = 0.; } /* check if line or arc mode */ if (pj_param(start, "tlat_1").i) { double del_S; #undef f phi1 = pj_param(start, "rlat_1").f; lam1 = pj_param(start, "rlon_1").f; if (pj_param(start, "tlat_2").i) { phi2 = pj_param(start, "rlat_2").f; lam2 = pj_param(start, "rlon_2").f; geod_inv(); geod_pre(); } else if (geod_S = pj_param(start, "dS").f) { al12 = pj_param(start, "rA").f; geod_pre(); geod_for(); } else emess(1,"incomplete geodesic/arc info"); if ((n_alpha = pj_param(start, "in_A").i) > 0) { if (!(del_alpha = pj_param(start, "rdel_A").f)) emess(1,"del azimuth == 0"); } else if (del_S = fabs(pj_param(start, "ddel_S").f)) { n_S = geod_S / del_S + .5; } else if ((n_S = pj_param(start, "in_S").i) <= 0) emess(1,"no interval divisor selected"); } /* free up linked list */ for ( ; start; start = curr) { curr = start->next; pj_dalloc(start); } }