diff options
Diffstat (limited to 'src/3rdparty/proj/geod_set.c')
-rw-r--r-- | src/3rdparty/proj/geod_set.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/3rdparty/proj/geod_set.c b/src/3rdparty/proj/geod_set.c new file mode 100644 index 00000000..88217277 --- /dev/null +++ b/src/3rdparty/proj/geod_set.c @@ -0,0 +1,74 @@ + +#define _IN_GEOD_SET + +#include <string.h> +#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); + } +} |