Пример #1
0
PJ *PROJECTION(rhealpix) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    Q->north_square = pj_param(P->ctx, P->params,"inorth_square").i;
    Q->south_square = pj_param(P->ctx, P->params,"isouth_square").i;

    /* Check for valid north_square and south_square inputs. */
    if (Q->north_square < 0 || Q->north_square > 3) {
        E_ERROR(-47);
    }
    if (Q->south_square < 0 || Q->south_square > 3) {
        E_ERROR(-47);
    }
    if (P->es) {
        Q->apa = pj_authset(P->es); /* For auth_lat(). */
        Q->qp = pj_qsfn(1.0, P->e, P->one_es); /* For auth_lat(). */
        P->a = P->a*sqrt(0.5*Q->qp); /* Set P->a to authalic radius. */
        P->ra = 1.0/P->a;
        P->fwd = e_rhealpix_forward;
        P->inv = e_rhealpix_inverse;
    } else {
        P->fwd = s_rhealpix_forward;
        P->inv = s_rhealpix_inverse;
    }

    return P;
}
Пример #2
0
PJ *PROJECTION(qua_aut) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;
    return setup(P, 2., 2., 0);
}
Пример #3
0
PJ *PROJECTION(bonne) {
	double c;
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

	Q->phi1 = pj_param(P->ctx, P->params, "rlat_1").f;
	if (fabs(Q->phi1) < EPS10) E_ERROR(-23);
	if (P->es) {
		Q->en = pj_enfn(P->es);
		Q->m1 = pj_mlfn(Q->phi1, Q->am1 = sin(Q->phi1),
			c = cos(Q->phi1), Q->en);
		Q->am1 = c / (sqrt(1. - P->es * Q->am1 * Q->am1) * Q->am1);
		P->inv = e_inverse;
		P->fwd = e_forward;
	} else {
		if (fabs(Q->phi1) + EPS10 >= M_HALFPI)
			Q->cphi1 = 0.;
		else
			Q->cphi1 = 1. / tan(Q->phi1);
		P->inv = s_inverse;
		P->fwd = s_forward;
	}
    return P;
}
Пример #4
0
PJ *PROJECTION(mbt_s) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;
    return setup(P, 1.48875, 1.36509, 0);
}
Пример #5
0
PJ *PROJECTION(labrd) {
    double Az, sinp, R, N, t;
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    Q->rot  = pj_param(P->ctx, P->params, "bno_rot").i == 0;
    Az = pj_param(P->ctx, P->params, "razi").f;
    sinp = sin(P->phi0);
    t = 1. - P->es * sinp * sinp;
    N = 1. / sqrt(t);
    R = P->one_es * N / t;
    Q->kRg = P->k0 * sqrt( N * R );
    Q->p0s = atan( sqrt(R / N) * tan(P->phi0) );
    Q->A = sinp / sin(Q->p0s);
    t = P->e * sinp;
    Q->C = .5 * P->e * Q->A * log((1. + t)/(1. - t)) +
          - Q->A * log( tan(M_FORTPI + .5 * P->phi0))
          + log( tan(M_FORTPI + .5 * Q->p0s));
    t = Az + Az;
    Q->Ca = (1. - cos(t)) * ( Q->Cb = 1. / (12. * Q->kRg * Q->kRg) );
    Q->Cb *= sin(t);
    Q->Cc = 3. * (Q->Ca * Q->Ca - Q->Cb * Q->Cb);
    Q->Cd = 6. * Q->Ca * Q->Cb;

    P->inv = e_inverse;
    P->fwd = e_forward;

    return P;
}
Пример #6
0
PJ *PROJECTION(qsc) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    P->inv = e_inverse;
    P->fwd = e_forward;
    /* Determine the cube face from the center of projection. */
    if (P->phi0 >= HALFPI - FORTPI / 2.0) {
        Q->face = FACE_TOP;
    } else if (P->phi0 <= -(HALFPI - FORTPI / 2.0)) {
        Q->face = FACE_BOTTOM;
    } else if (fabs(P->lam0) <= FORTPI) {
        Q->face = FACE_FRONT;
    } else if (fabs(P->lam0) <= HALFPI + FORTPI) {
        Q->face = (P->lam0 > 0.0 ? FACE_RIGHT : FACE_LEFT);
    } else {
        Q->face = FACE_BACK;
    }
    /* Fill in useful values for the ellipsoid <-> sphere shift
     * described in [LK12]. */
    if (P->es) {
        Q->a_squared = P->a * P->a;
        Q->b = P->a * sqrt(1.0 - P->es);
        Q->one_minus_f = 1.0 - (P->a - Q->b) / P->a;
        Q->one_minus_f_squared = Q->one_minus_f * Q->one_minus_f;
    }

    return P;
}
Пример #7
0
PJ *PROJECTION(etmerc) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;
   return setup (P);
}
Пример #8
0
PJ *PROJECTION(utm) {
	int zone;
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

	if (!P->es)
        E_ERROR(-34);
	P->y0 = pj_param (P->ctx, P->params, "bsouth").i ? 10000000. : 0.;
	P->x0 = 500000.;
	if (pj_param (P->ctx, P->params, "tzone").i) /* zone input ? */
		if ((zone = pj_param(P->ctx, P->params, "izone").i) > 0 && zone <= 60)
			--zone;
		else
			E_ERROR(-35)
	else /* nearest central meridian input */
		if ((zone = (int)(floor ((adjlon (P->lam0) + M_PI) * 30. / M_PI))) < 0)
			zone = 0;
		else if (zone >= 60)
			zone = 59;
	P->lam0 = (zone + .5) * M_PI / 30. - M_PI;
	P->k0 = 0.9996;
	P->phi0 = 0.;

    return setup (P);
}
Пример #9
0
PJ *PROJECTION(kav5) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    return setup(P, 1.50488, 1.35439, 0);
}
Пример #10
0
PJ *PROJECTION(nsper) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    Q->tilt = 0;

   return setup(P);
}
Пример #11
0
PJ *PROJECTION(laea) {
    double t;
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    t = fabs(P->phi0);
    if (fabs(t - HALFPI) < EPS10)
        Q->mode = P->phi0 < 0. ? S_POLE : N_POLE;
    else if (fabs(t) < EPS10)
        Q->mode = EQUIT;
    else
        Q->mode = OBLIQ;
    if (P->es) {
        double sinphi;

        P->e = sqrt(P->es);
        Q->qp = pj_qsfn(1., P->e, P->one_es);
        Q->mmf = .5 / (1. - P->es);
        Q->apa = pj_authset(P->es);
        switch (Q->mode) {
        case N_POLE:
        case S_POLE:
            Q->dd = 1.;
            break;
        case EQUIT:
            Q->dd = 1. / (Q->rq = sqrt(.5 * Q->qp));
            Q->xmf = 1.;
            Q->ymf = .5 * Q->qp;
            break;
        case OBLIQ:
            Q->rq = sqrt(.5 * Q->qp);
            sinphi = sin(P->phi0);
            Q->sinb1 = pj_qsfn(sinphi, P->e, P->one_es) / Q->qp;
            Q->cosb1 = sqrt(1. - Q->sinb1 * Q->sinb1);
            Q->dd = cos(P->phi0) / (sqrt(1. - P->es * sinphi * sinphi) *
               Q->rq * Q->cosb1);
            Q->ymf = (Q->xmf = Q->rq) / Q->dd;
            Q->xmf *= Q->dd;
            break;
        }
        P->inv = e_inverse;
        P->fwd = e_forward;
    } else {
        if (Q->mode == OBLIQ) {
            Q->sinb1 = sin(P->phi0);
            Q->cosb1 = cos(P->phi0);
        }
        P->inv = s_inverse;
        P->fwd = s_forward;
    }

    return P;
}
Пример #12
0
PJ *PROJECTION(stere) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    Q->phits = pj_param (P->ctx, P->params, "tlat_ts").i ?
               pj_param (P->ctx, P->params, "rlat_ts").f : HALFPI;

    return setup(P);
}
Пример #13
0
PJ *PROJECTION(vandg2) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    Q->vdg3 = 0;
    P->fwd = s_forward;

    return P;
}
Пример #14
0
PJ *PROJECTION(wink1) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

	P->opaque->cosphi1 = cos (pj_param(P->ctx, P->params, "rlat_ts").f);
	P->es = 0.;
    P->inv = s_inverse;
    P->fwd = s_forward;

    return P;
}
Пример #15
0
PJ *PROJECTION(putp3p) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    Q->A = 2. * RPISQ;

    P->es = 0.;
    P->inv = s_inverse;
    P->fwd = s_forward;

    return P;
}
Пример #16
0
PJ *PROJECTION(cass) {

    /* Spheroidal? */
    if (0==P->es) {
        P->inv = s_inverse;
        P->fwd = s_forward;
        return P;
    }

    /* otherwise it's ellipsoidal */
    P->opaque = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==P->opaque)
        return freeup_new (P);

    P->opaque->en = pj_enfn (P->es);
    if (0==P->opaque->en)
        return freeup_new (P);

    P->opaque->m0 = pj_mlfn (P->phi0,  sin (P->phi0),  cos (P->phi0),  P->opaque->en);
    P->inv = e_inverse;
    P->fwd = e_forward;

    return P;
}
Пример #17
0
PJ *PROJECTION(tpers) {
    double omega, gamma;

    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    omega = pj_param(P->ctx, P->params, "dtilt").f * DEG_TO_RAD;
    gamma = pj_param(P->ctx, P->params, "dazi").f * DEG_TO_RAD;
    Q->tilt = 1;
    Q->cg = cos(gamma); Q->sg = sin(gamma);
    Q->cw = cos(omega); Q->sw = sin(omega);

    return setup(P);
}
Пример #18
0
PJ *PROJECTION(ups) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

	/* International Ellipsoid */
	P->phi0 = pj_param(P->ctx, P->params, "bsouth").i ? - HALFPI: HALFPI;
	if (!P->es) E_ERROR(-34);
	P->k0 = .994;
	P->x0 = 2000000.;
	P->y0 = 2000000.;
	Q->phits = HALFPI;
	P->lam0 = 0.;

    return setup(P);
}
Пример #19
0
PJ *PROJECTION(tpeqd) {
	double lam_1, lam_2, phi_1, phi_2, A12, pp;
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;


	/* get control point locations */
	phi_1 = pj_param(P->ctx, P->params, "rlat_1").f;
	lam_1 = pj_param(P->ctx, P->params, "rlon_1").f;
	phi_2 = pj_param(P->ctx, P->params, "rlat_2").f;
	lam_2 = pj_param(P->ctx, P->params, "rlon_2").f;

	if (phi_1 == phi_2 && lam_1 == lam_2)
        E_ERROR(-25);
	P->lam0  = adjlon (0.5 * (lam_1 + lam_2));
	Q->dlam2 = adjlon (lam_2 - lam_1);

	Q->cp1 = cos (phi_1);
	Q->cp2 = cos (phi_2);
	Q->sp1 = sin (phi_1);
	Q->sp2 = sin (phi_2);
	Q->cs = Q->cp1 * Q->sp2;
	Q->sc = Q->sp1 * Q->cp2;
	Q->ccs = Q->cp1 * Q->cp2 * sin(Q->dlam2);
	Q->z02 = aacos(P->ctx, Q->sp1 * Q->sp2 + Q->cp1 * Q->cp2 * cos (Q->dlam2));
	Q->hz0 = .5 * Q->z02;
	A12 = atan2(Q->cp2 * sin (Q->dlam2),
		Q->cp1 * Q->sp2 - Q->sp1 * Q->cp2 * cos (Q->dlam2));
	Q->ca = cos(pp = aasin(P->ctx, Q->cp1 * sin(A12)));
	Q->sa = sin(pp);
	Q->lp = adjlon ( atan2 (Q->cp1 * cos(A12), Q->sp1) - Q->hz0);
	Q->dlam2 *= .5;
	Q->lamc = M_HALFPI - atan2(sin(A12) * Q->sp1, cos(A12)) - Q->dlam2;
	Q->thz0 = tan (Q->hz0);
	Q->rhshz0 = .5 / sin (Q->hz0);
	Q->r2z0 = 0.5 / Q->z02;
	Q->z02 *= Q->z02;

    P->inv = s_inverse;
    P->fwd = s_forward;
	P->es = 0.;

    return P;
}
Пример #20
0
PJ *PROJECTION(ocea) {
    double phi_0=0.0, phi_1, phi_2, lam_1, lam_2, lonz, alpha;

    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    Q->rok = P->a / P->k0;
    Q->rtk = P->a * P->k0;
    /*If the keyword "alpha" is found in the sentence then use 1point+1azimuth*/
    if ( pj_param(P->ctx, P->params, "talpha").i) {
        /*Define Pole of oblique transformation from 1 point & 1 azimuth*/
        alpha   = pj_param(P->ctx, P->params, "ralpha").f;
        lonz = pj_param(P->ctx, P->params, "rlonc").f;
        /*Equation 9-8 page 80 (http://pubs.usgs.gov/pp/1395/report.pdf)*/
        Q->singam = atan(-cos(alpha)/(-sin(phi_0) * sin(alpha))) + lonz;
        /*Equation 9-7 page 80 (http://pubs.usgs.gov/pp/1395/report.pdf)*/
        Q->sinphi = asin(cos(phi_0) * sin(alpha));
    /*If the keyword "alpha" is NOT found in the sentence then use 2points*/
    } else {
        /*Define Pole of oblique transformation from 2 points*/
        phi_1 = pj_param(P->ctx, P->params, "rlat_1").f;
        phi_2 = pj_param(P->ctx, P->params, "rlat_2").f;
        lam_1 = pj_param(P->ctx, P->params, "rlon_1").f;
        lam_2 = pj_param(P->ctx, P->params, "rlon_2").f;
        /*Equation 9-1 page 80 (http://pubs.usgs.gov/pp/1395/report.pdf)*/
        Q->singam = atan2(cos(phi_1) * sin(phi_2) * cos(lam_1) -
            sin(phi_1) * cos(phi_2) * cos(lam_2),
            sin(phi_1) * cos(phi_2) * sin(lam_2) -
            cos(phi_1) * sin(phi_2) * sin(lam_1) );
        /*Equation 9-2 page 80 (http://pubs.usgs.gov/pp/1395/report.pdf)*/
        Q->sinphi = atan(-cos(Q->singam - lam_1) / tan(phi_1));
    }
    P->lam0 = Q->singam + HALFPI;
    Q->cosphi = cos(Q->sinphi);
    Q->sinphi = sin(Q->sinphi);
    Q->cosgam = cos(Q->singam);
    Q->singam = sin(Q->singam);
    P->inv = s_inverse;
    P->fwd = s_forward;
    P->es = 0.;

    return P;
}
Пример #21
0
PJ *PROJECTION(putp6) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    Q->C_x = 1.01346;
    Q->C_y = 0.91910;
    Q->A   = 4.;
    Q->B   = 2.1471437182129378784;
    Q->D   = 2.;

    P->es = 0.;
    P->inv = s_inverse;
    P->fwd = s_forward;

    return P;
}
Пример #22
0
PJ *PROJECTION(putp6p) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    Q->C_x = 0.44329;
    Q->C_y = 0.80404;
    Q->A   = 6.;
    Q->B   = 5.61125;
    Q->D   = 3.;

    P->es = 0.;
    P->inv = s_inverse;
    P->fwd = s_forward;

    return P;
}
Пример #23
0
PJ *PROJECTION(krovak) {
    double u0, n0, g;
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    /* we want Bessel as fixed ellipsoid */
    P->a = 6377397.155;
    P->e = sqrt(P->es = 0.006674372230614);

    /* if latitude of projection center is not set, use 49d30'N */
    if (!pj_param(P->ctx, P->params, "tlat_0").i)
            P->phi0 = 0.863937979737193;

    /* if center long is not set use 42d30'E of Ferro - 17d40' for Ferro */
    /* that will correspond to using longitudes relative to greenwich    */
    /* as input and output, instead of lat/long relative to Ferro */
    if (!pj_param(P->ctx, P->params, "tlon_0").i)
            P->lam0 = 0.7417649320975901 - 0.308341501185665;

    /* if scale not set default to 0.9999 */
    if (!pj_param(P->ctx, P->params, "tk").i)
            P->k0 = 0.9999;

    Q->czech = 1;
    if( !pj_param(P->ctx, P->params, "tczech").i )
        Q->czech = -1;

    /* Set up shared parameters between forward and inverse */
    Q->alpha = sqrt(1. + (P->es * pow(cos(P->phi0), 4)) / (1. - P->es));
    u0 = asin(sin(P->phi0) / Q->alpha);
    g = pow( (1. + P->e * sin(P->phi0)) / (1. - P->e * sin(P->phi0)) , Q->alpha * P->e / 2. );
    Q->k = tan( u0 / 2. + S45) / pow  (tan(P->phi0 / 2. + S45) , Q->alpha) * g;
    n0 = sqrt(1. - P->es) / (1. - P->es * pow(sin(P->phi0), 2));
    Q->n = sin(S0);
    Q->rho0 = P->k0 * n0 / tan(S0);
    Q->ad = S90 - UQ;

    P->inv = e_inverse;
    P->fwd = e_forward;

    return P;
}
Пример #24
0
PJ *PROJECTION(poly) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

	if (P->es) {
		if (!(Q->en = pj_enfn(P->es))) E_ERROR_0;
		Q->ml0 = pj_mlfn(P->phi0, sin(P->phi0), cos(P->phi0), Q->en);
		P->inv = e_inverse;
		P->fwd = e_forward;
	} else {
		Q->ml0 = -P->phi0;
		P->inv = s_inverse;
		P->fwd = s_forward;
	}

    return P;
}
Пример #25
0
PJ *PROJECTION(loxim) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    Q->phi1 = pj_param(P->ctx, P->params, "rlat_1").f;
    Q->cosphi1 = cos(Q->phi1);
    if (Q->cosphi1 < EPS)
        E_ERROR(-22);

    Q->tanphi1 = tan(M_FORTPI + 0.5 * Q->phi1);

    P->inv = s_inverse;
    P->fwd = s_forward;
    P->es = 0.;

   return P;
}
Пример #26
0
PJ *PROJECTION(healpix) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    if (P->es) {
        Q->apa = pj_authset(P->es); /* For auth_lat(). */
        Q->qp = pj_qsfn(1.0, P->e, P->one_es); /* For auth_lat(). */
        P->a = P->a*sqrt(0.5*Q->qp); /* Set P->a to authalic radius. */
        P->ra = 1.0/P->a;
        P->fwd = e_healpix_forward;
        P->inv = e_healpix_inverse;
    } else {
        P->fwd = s_healpix_forward;
        P->inv = s_healpix_inverse;
    }

    return P;
}
Пример #27
0
PJ *PROJECTION(ortho) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

	if (fabs(fabs(P->phi0) - HALFPI) <= EPS10)
		Q->mode = P->phi0 < 0. ? S_POLE : N_POLE;
	else if (fabs(P->phi0) > EPS10) {
		Q->mode = OBLIQ;
		Q->sinph0 = sin(P->phi0);
		Q->cosph0 = cos(P->phi0);
	} else
		Q->mode = EQUIT;
	P->inv = s_inverse;
	P->fwd = s_forward;
	P->es = 0.;

    return P;
}
Пример #28
0
PJ *PROJECTION(gstmerc) {
    struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
    if (0==Q)
        return freeup_new (P);
    P->opaque = Q;

    Q->lamc = P->lam0;
    Q->n1 = sqrt(1.0 + P->es * pow(cos(P->phi0), 4.0) / (1.0 - P->es));
    Q->phic = asin(sin(P->phi0) / Q->n1);
    Q->c = log(pj_tsfn(-1.0 * Q->phic, 0.0, 0.0))
         - Q->n1 * log(pj_tsfn(-1.0 * P->phi0, -1.0 * sin(P->phi0), P->e));
    Q->n2 = P->k0 * P->a * sqrt(1.0 - P->es) / (1.0 - P->es * sin(P->phi0) * sin(P->phi0));
    Q->XS = 0;
    Q->YS = -1.0 * Q->n2 * Q->phic;

    P->inv = s_inverse;
    P->fwd = s_forward;

    return P;
}
Пример #29
0
static void freeup (PJ *P) {
    freeup_new (P);
    return;
}
Пример #30
0
static void freeup(PJ *P) {                             /* Destructor */
    freeup_new (P);
    return;
}