#ifndef lint
static const char SCCSID[]="@(#)PJ_mod_ster.c 4.1 94/02/15 GIE REL";
#endif
/* based upon Snyder and Linck, USGS-NMD */
#define PROJ_PARMS__ \
COMPLEX *zcoeff; \
double cchio, schio; \
int n;
#define PJ_LIB__
#include <projects.h>
PROJ_HEAD(mil_os, "Miller Oblated Stereographic") "\n\tAzi(mod)";
PROJ_HEAD(lee_os, "Lee Oblated Stereographic") "\n\tAzi(mod)";
PROJ_HEAD(gs48, "Mod. Stererographics of 48 U.S.") "\n\tAzi(mod)";
PROJ_HEAD(alsk, "Mod. Stererographics of Alaska") "\n\tAzi(mod)";
PROJ_HEAD(gs50, "Mod. Stererographics of 50 U.S.") "\n\tAzi(mod)";
#define EPSLN 1e-10
FORWARD(e_forward); /* ellipsoid */
double sinlon, coslon, esphi, chi, schi, cchi, s;
COMPLEX p;
sinlon = sin(lp.lam);
coslon = cos(lp.lam);
esphi = P->e * sin(lp.phi);
chi = 2. * atan(tan((HALFPI + lp.phi) * .5) *
pow((1. - esphi) / (1. + esphi), P->e * .5)) - HALFPI;
schi = sin(chi);
cchi = cos(chi);
s = 2. / (1. + P->schio * schi + P->cchio * cchi * coslon);
p.r = s * cchi * sinlon;
p.i = s * (P->cchio * schi - P->schio * cchi * coslon);
p = pj_zpoly1(p, P->zcoeff, P->n);
xy.x = p.r;
xy.y = p.i;
return xy;
}
INVERSE(e_inverse); /* ellipsoid */
int nn;
COMPLEX p, fxy, fpxy, dp;
double den, rh, z, sinz, cosz, chi, phi, dphi, esphi;
p.r = xy.x;
p.i = xy.y;
for (nn = 20; nn ;--nn) {
fxy = pj_zpolyd1(p, P->zcoeff, P->n, &fpxy);
fxy.r -= xy.x;
fxy.i -= xy.y;
den = fpxy.r * fpxy.r + fpxy.i * fpxy.i;
dp.r = -(fxy.r * fpxy.r + fxy.i * fpxy.i) / den;
dp.i = -(fxy.i * fpxy.r - fxy.r * fpxy.i) / den;
p.r += dp.r;
p.i += dp.i;
if ((fabs(dp.r) + fabs(dp.i)) <= EPSLN)
break;
}
if (nn) {
rh = hypot(p.r, p.i);
z = 2. * atan(.5 * rh);
sinz = sin(z);
cosz = cos(z);
lp.lam = P->lam0;
if (fabs(rh) <= EPSLN) {
lp.phi = P->phi0;
return lp;
}
chi = aasin(cosz * P->schio + p.i * sinz * P->cchio / rh);
phi = chi;
for (nn = 20; nn ;--nn) {
esphi = P->e * sin(phi);
dphi = 2. * atan(tan((HALFPI + chi) * .5) *
pow((1. + esphi) / (1. - esphi), P->e * .5)) - HALFPI - phi;
phi += dphi;
if (fabs(dphi) <= EPSLN)
break;
}
}
if (nn) {
lp.phi = phi;
lp.lam = atan2(p.r * sinz, rh * P->cchio * cosz - p.i *
P->schio * sinz);
} else
lp.lam = lp.phi = HUGE_VAL;
return lp;
}
FREEUP; if (P) pj_dalloc(P); }
static PJ *
setup(PJ *P) { /* general initialization */
double esphi, chio;
if (P->es) {
esphi = P->e * sin(P->phi0);
chio = 2. * atan(tan((HALFPI + P->phi0) * .5) *
pow((1. - esphi) / (1. + esphi), P->e * .5)) - HALFPI;
} else
chio = P->phi0;
P->schio = sin(chio);
P->cchio = cos(chio);
P->inv = e_inverse; P->fwd = e_forward;
return P;
}
ENTRY0(mil_os)
static COMPLEX /* Miller Oblated Stereographic */
AB[] = {
{0.924500, 0.},
{0., 0.},
{0.019430, 0.}
};
P->n = 2;
P->lam0 = DEG_TO_RAD * 20.;
P->phi0 = DEG_TO_RAD * 18.;
P->zcoeff = AB;
P->es = 0.;
ENDENTRY(setup(P))
ENTRY0(lee_os)
static COMPLEX /* Lee Oblated Stereographic */
AB[] = {
{0.721316, 0.},
{0., 0.},
{-0.0088162, -0.00617325}
};
P->n = 2;
P->lam0 = DEG_TO_RAD * -165.;
P->phi0 = DEG_TO_RAD * -10.;
P->zcoeff = AB;
P->es = 0.;
ENDENTRY(setup(P))
ENTRY0(gs48)
static COMPLEX /* 48 United States */
AB[] = {
{0.98879, 0.},
{0., 0.},
{-0.050909, 0.},
{0., 0.},
{0.075528, 0.}
};
P->n = 4;
P->lam0 = DEG_TO_RAD * -96.;
P->phi0 = DEG_TO_RAD * -39.;
P->zcoeff = AB;
P->es = 0.;
P->a = 6370997.;
ENDENTRY(setup(P))
ENTRY0(alsk)
static COMPLEX
ABe[] = { /* Alaska ellipsoid */
{.9945303, 0.},
{.0052083, -.0027404},
{.0072721, .0048181},
{-.0151089, -.1932526},
{.0642675, -.1381226},
{.3582802, -.2884586}},
ABs[] = { /* Alaska sphere */
{.9972523, 0.},
{.0052513, -.0041175},
{.0074606, .0048125},
{-.0153783, -.1968253},
{.0636871, -.1408027},
{.3660976, -.2937382}
};
P->n = 5;
P->lam0 = DEG_TO_RAD * -152.;
P->phi0 = DEG_TO_RAD * 64.;
if (P->es) { /* fixed ellipsoid/sphere */
P->zcoeff = ABe;
P->a = 6378206.4;
P->e = sqrt(P->es = 0.00676866);
} else {
P->zcoeff = ABs;
P->a = 6370997.;
}
ENDENTRY(setup(P))
ENTRY0(gs50)
static COMPLEX
ABe[] = { /* GS50 ellipsoid */
{.9827497, 0.},
{.0210669, .0053804},
{-.1031415, -.0571664},
{-.0323337, -.0322847},
{.0502303, .1211983},
{.0251805, .0895678},
{-.0012315, -.1416121},
{.0072202, -.1317091},
{-.0194029, .0759677},
{-.0210072, .0834037}
},
ABs[] = { /* GS50 sphere */
{.9842990, 0.},
{.0211642, .0037608},
{-.1036018, -.0575102},
{-.0329095, -.0320119},
{.0499471, .1223335},
{.0260460, .0899805},
{.0007388, -.1435792},
{.0075848, -.1334108},
{-.0216473, .0776645},
{-.0225161, .0853673}
};
P->n = 9;
P->lam0 = DEG_TO_RAD * -120.;
P->phi0 = DEG_TO_RAD * 45.;
if (P->es) { /* fixed ellipsoid/sphere */
P->zcoeff = ABe;
P->a = 6378206.4;
P->e = sqrt(P->es = 0.00676866);
} else {
P->zcoeff = ABs;
P->a = 6370997.;
}
ENDENTRY(setup(P))
syntax highlighted by Code2HTML, v. 0.9.1