PJ_lcc.c
2.86 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
#define PROJ_PARMS__ \
double phi1; \
double phi2; \
double n; \
double rho0; \
double c; \
int ellips;
#define PJ_LIB__
#include <projects.h>
PROJ_HEAD(lcc, "Lambert Conformal Conic")
"\n\tConic, Sph&Ell\n\tlat_1= and lat_2= or lat_0";
# define EPS10 1.e-10
FORWARD(e_forward); /* ellipsoid & spheroid */
double rho;
if (fabs(fabs(lp.phi) - HALFPI) < EPS10) {
if ((lp.phi * P->n) <= 0.) F_ERROR;
rho = 0.;
}
else
rho = P->c * (P->ellips ? pow(pj_tsfn(lp.phi, sin(lp.phi),
P->e), P->n) : pow(tan(FORTPI + .5 * lp.phi), -P->n));
xy.x = P->k0 * (rho * sin( lp.lam *= P->n ) );
xy.y = P->k0 * (P->rho0 - rho * cos(lp.lam) );
return (xy);
}
INVERSE(e_inverse); /* ellipsoid & spheroid */
double rho;
xy.x /= P->k0;
xy.y /= P->k0;
if( (rho = hypot(xy.x, xy.y = P->rho0 - xy.y)) != 0.0) {
if (P->n < 0.) {
rho = -rho;
xy.x = -xy.x;
xy.y = -xy.y;
}
if (P->ellips) {
if ((lp.phi = pj_phi2(pow(rho / P->c, 1./P->n), P->e))
== HUGE_VAL)
I_ERROR;
} else
lp.phi = 2. * atan(pow(P->c / rho, 1./P->n)) - HALFPI;
lp.lam = atan2(xy.x, xy.y) / P->n;
} else {
lp.lam = 0.;
lp.phi = P->n > 0. ? HALFPI : - HALFPI;
}
return (lp);
}
SPECIAL(fac) {
double rho;
if (fabs(fabs(lp.phi) - HALFPI) < EPS10) {
if ((lp.phi * P->n) <= 0.) return;
rho = 0.;
} else
rho = P->c * (P->ellips ? pow(pj_tsfn(lp.phi, sin(lp.phi),
P->e), P->n) : pow(tan(FORTPI + .5 * lp.phi), -P->n));
fac->code |= IS_ANAL_HK + IS_ANAL_CONV;
fac->k = fac->h = P->k0 * P->n * rho /
pj_msfn(sin(lp.phi), cos(lp.phi), P->es);
fac->conv = - P->n * lp.lam;
}
FREEUP; if (P) pj_dalloc(P); }
ENTRY0(lcc)
double cosphi, sinphi;
int secant;
P->phi1 = pj_param(P->params, "rlat_1").f;
if (pj_param(P->params, "tlat_2").i)
P->phi2 = pj_param(P->params, "rlat_2").f;
else {
P->phi2 = P->phi1;
if (!pj_param(P->params, "tlat_0").i)
P->phi0 = P->phi1;
}
if (fabs(P->phi1 + P->phi2) < EPS10) E_ERROR(-21);
P->n = sinphi = sin(P->phi1);
cosphi = cos(P->phi1);
secant = fabs(P->phi1 - P->phi2) >= EPS10;
if( (P->ellips = (P->es != 0.)) ) {
double ml1, m1;
P->e = sqrt(P->es);
m1 = pj_msfn(sinphi, cosphi, P->es);
ml1 = pj_tsfn(P->phi1, sinphi, P->e);
if (secant) { /* secant cone */
P->n = log(m1 /
pj_msfn(sinphi = sin(P->phi2), cos(P->phi2), P->es));
P->n /= log(ml1 / pj_tsfn(P->phi2, sinphi, P->e));
}
P->c = (P->rho0 = m1 * pow(ml1, -P->n) / P->n);
P->rho0 *= (fabs(fabs(P->phi0) - HALFPI) < EPS10) ? 0. :
pow(pj_tsfn(P->phi0, sin(P->phi0), P->e), P->n);
} else {
if (secant)
P->n = log(cosphi / cos(P->phi2)) /
log(tan(FORTPI + .5 * P->phi2) /
tan(FORTPI + .5 * P->phi1));
P->c = cosphi * pow(tan(FORTPI + .5 * P->phi1), P->n) / P->n;
P->rho0 = (fabs(fabs(P->phi0) - HALFPI) < EPS10) ? 0. :
P->c * pow(tan(FORTPI + .5 * P->phi0), -P->n);
}
P->inv = e_inverse;
P->fwd = e_forward;
P->spc = fac;
ENDENTRY(P)