⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pj_mod_ster.c

📁 开源投影系统 Cartographic Projections library originally written by Gerald Evenden then of the USGS. The
💻 C
字号:
#ifndef lintstatic 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-10FORWARD(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 COMPLEXABe[] = { /* 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 COMPLEXABe[] = { /* 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))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -