5 /* For Albers formulas see Deetz and Adams "Elements of Map Projection", */
6 /* USGS Special Publication No. 68, GPO 1921 */
8 static double r0sq, r1sq, d2, n, den, sinb1, sinb2;
9 static struct coord plat1, plat2;
12 static double num(double s)
17 return(1+s*(2./3+s*(3./5+s*(4./7+s*5./9))));
20 /* Albers projection for a spheroid, good only when N pole is fixed */
23 Xspalbers(struct place *place, double *x, double *y)
25 double r = sqrt(r0sq-2*(1-d2)*place->nlat.s*num(place->nlat.s)/n);
26 double t = n*place->wlon.l;
36 /* lat1, lat2: std parallels; e2: squared eccentricity */
38 static proj albinit(double lat1, double lat2, double e2)
49 t = lat1; lat1 = lat2; lat2 = t;
53 return(azequalarea());
56 if(fabs(lat2+lat1) < 1)
57 return(cylequalarea(lat1));
62 sinb1 = plat1.s*num(plat1.s)/den;
63 sinb2 = plat2.s*num(plat2.s)/den;
64 n = (plat1.c*plat1.c/(1-e2*plat1.s*plat1.s) -
65 plat2.c*plat2.c/(1-e2*plat2.s*plat2.s)) /
66 (2*(1-e2)*den*(sinb2-sinb1));
67 r1 = plat1.c/(n*sqrt(1-e2*plat1.s*plat1.s));
69 r0sq = r1sq + 2*(1-e2)*den*sinb1/n;
70 southpole = lat1<0 && plat2.c>plat1.c;
75 sp_albers(double lat1, double lat2)
77 return(albinit(lat1,lat2,EC2));
81 albers(double lat1, double lat2)
83 return(albinit(lat1,lat2,0.));
86 static double scale = 1;
87 static double twist = 0;
90 albscale(double x, double y, double lat, double lon)
93 double alat, alon, x1,y1;
96 invalb(x,y,&alat,&alon);
98 deg2rad(lat,&place.nlat);
99 deg2rad(lon,&place.wlon);
100 Xspalbers(&place,&x1,&y1);
101 scale = sqrt((x1*x1+y1*y1)/(x*x+y*y));
105 invalb(double x, double y, double *lat, double *lon)
108 double sinb_den, sinp;
111 *lon = atan2(-x,fabs(y))/(RAD*n) + twist;
112 sinb_den = (r0sq - x*x - y*y)*n/(2*(1-d2));
115 sinp = sinb_den/num(sinp);
116 *lat = asin(sinp)/RAD;