Menu

[r6263]: / trunk / toolkits / basemap / src / geod_set.c  Maximize  Restore  History

Download this file

138 lines (120 with data), 3.6 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#ifndef lint
static const char SCCSID[]="@(#)geod_set.c 4.8 95/09/23 GIE REL";
#endif
#define _IN_GEOD_SET
#include <stdlib.h>
#include <string.h>
#include "projects.h"
#include "geodesic.h"
#include "emess.h"
GEODESIC_T *
GEOD_init(int argc, char **argv, GEODESIC_T *GEODESIC)
{
paralist *start = 0, *curr = 0;
double es;
char *name;
int i;
if(0 == GEODESIC)
{
GEODESIC = malloc(sizeof(GEODESIC_T));
}
memset(GEODESIC, 0, sizeof(GEODESIC_T));
/* 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, &GEODESIC->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);
GEODESIC->FR_METER = 1. / (GEODESIC->TO_METER = atof(unit_list[i].to_meter));
} else
GEODESIC->TO_METER = GEODESIC->FR_METER = 1.;
if ((GEODESIC->ELLIPSE = (es != 0.))) {
GEODESIC->ONEF = sqrt(1. - es);
GEODESIC->FLAT = 1 - GEODESIC->ONEF;
GEODESIC->FLAT2 = GEODESIC->FLAT/2;
GEODESIC->FLAT4 = GEODESIC->FLAT/4;
GEODESIC->FLAT64 = GEODESIC->FLAT*GEODESIC->FLAT/64;
} else {
GEODESIC->ONEF = 1.;
GEODESIC->FLAT = GEODESIC->FLAT2 = GEODESIC->FLAT4 = GEODESIC->FLAT64 = 0.;
}
/* check if line or arc mode */
if (pj_param(start, "tlat_1").i) {
double del_S;
#undef f
GEODESIC->p1.u = pj_param(start, "rlat_1").f;
GEODESIC->p1.v = pj_param(start, "rlon_1").f;
if (pj_param(start, "tlat_2").i) {
GEODESIC->p2.u = pj_param(start, "rlat_2").f;
GEODESIC->p2.v = pj_param(start, "rlon_2").f;
geod_inv(GEODESIC);
geod_pre(GEODESIC);
} else if ((GEODESIC->DIST = pj_param(start, "dS").f)) {
GEODESIC->ALPHA12 = pj_param(start, "rA").f;
geod_pre(GEODESIC);
geod_for(GEODESIC);
} else emess(1,"incomplete geodesic/arc info");
if ((GEODESIC->n_alpha = pj_param(start, "in_A").i) > 0) {
if (!(GEODESIC->del_alpha = pj_param(start, "rdel_A").f))
emess(1,"del azimuth == 0");
} else if ((del_S = fabs(pj_param(start, "ddel_S").f))) {
GEODESIC->n_S = GEODESIC->DIST / del_S + .5;
} else if ((GEODESIC->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);
}
return GEODESIC;
}
GEODESIC_T *GEOD_init_plus(const char *definition, GEODESIC_T *geod)
{
#define MAX_ARG 200
char *argv[MAX_ARG];
char *defn_copy;
int argc = 0, i;
/* make a copy that we can manipulate */
defn_copy = strdup(definition);
/* split into arguments based on '+' and trim white space */
for( i = 0; defn_copy[i] != '\0'; i++ )
{
switch( defn_copy[i] )
{
case '+':
if( i == 0 || defn_copy[i-1] == '\0' )
{
if( argc+1 == MAX_ARG )
{
//pj_errno = -44;
return NULL;
}
argv[argc++] = defn_copy + i + 1;
}
break;
case ' ':
case '\t':
case '\n':
defn_copy[i] = '\0';
break;
default:
/* do nothing */;
}
}
/* perform actual initialization */
GEODESIC_T *ret_geod = GEOD_init(argc, argv, geod);
free( defn_copy );
return ret_geod;
}
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.