OB.DAAC Logo
NASA Logo
Ocean Color Science Software

ocssw V2022
vandginv.c
Go to the documentation of this file.
1 /*******************************************************************************
2 NAME VAN DER GRINTEN
3 
4 PURPOSE: Transforms input Easting and Northing to longitude and
5  latitude for the Van der Grinten projection. The
6  Easting and Northing must be in meters. The longitude
7  and latitude values will be returned in radians.
8 
9 This function was adapted from the Van Der Grinten projection code
10 (FORTRAN) in the General Cartographic Transformation Package software
11 which is available from the U.S. Geological Survey National Mapping Division.
12 
13 ALGORITHM REFERENCES
14 
15 1. "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder,
16  The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.
17 
18 2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
19  Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
20  State Government Printing Office, Washington D.C., 1987.
21 
22 3. "Software Documentation for GCTP General Cartographic Transformation
23  Package", U.S. Geological Survey National Mapping Division, May 1982.
24 *******************************************************************************/
25 #include "oli_cproj.h"
26 #include "oli_local.h"
27 
28 /* Variables common to all subroutines in this code file
29  -----------------------------------------------------*/
30 static double lon_center; /* Center longitude (projection center) */
31 static double R; /* Radius of the earth (sphere) */
32 static double false_easting; /* x offset in meters */
33 static double false_northing; /* y offset in meters */
34 
35 /* Initialize the Van Der Grinten projection
36  ----------------------------------------*/
37 long vandginvint
38 (
39  double r, /* (I) Radius of the earth (sphere) */
40  double center_long, /* (I) Center longitude */
41  double false_east, /* x offset in meters */
42  double false_north /* y offset in meters */
43 )
44 {
45 /* Place parameters in static storage for common use
46  -------------------------------------------------*/
47 R = r;
48 lon_center = center_long;
49 false_easting = false_east;
50 false_northing = false_north;
51 
52 /* Report parameters to the user
53  -----------------------------*/
54 gctp_print_title("VAN DER GRINTEN");
56 gctp_print_cenlon(center_long);
58 return(OK);
59 }
60 
61 /* Van Der Grinten inverse equations--mapping x,y to lat/long
62  ---------------------------------------------------------*/
63 long vandginv
64 (
65  double x, /* (O) X projection coordinate */
66  double y, /* (O) Y projection coordinate */
67  double *lon, /* (I) Longitude */
68  double *lat /* (I) Latitude */
69 )
70 
71 {
72 double xx,yy,xys,c1,c2,c3;
73 double a1;
74 double m1;
75 double con;
76 double th1;
77 double d;
78 
79 /* inverse equations
80  -----------------*/
81 x -= false_easting;
82 y -= false_northing;
83 con = PI * R;
84 xx = x / con;
85 yy = y / con;
86 xys = xx * xx + yy * yy;
87 c1 = -fabs(yy) * (1.0 + xys);
88 c2 = c1 - 2.0 * yy * yy + xx * xx;
89 c3 = -2.0 * c1 + 1.0 + 2.0 * yy * yy + xys * xys;
90 d = yy * yy / c3 + (2.0 * c2 * c2 * c2 / c3 / c3 / c3 - 9.0 * c1 * c2 / c3 /c3)
91  / 27.0;
92 a1 = (c1 - c2 * c2 / 3.0 / c3) / c3;
93 m1 = 2.0 * sqrt( -a1 / 3.0);
94 con = ((3.0 * d) / a1) / m1;
95 if (fabs(con) > 1.0)
96  {
97  if (con >= 0.0)
98  con = 1.0;
99  else
100  con = -1.0;
101  }
102 th1 = acos(con) / 3.0;
103 if (y >= 0)
104  *lat = (-m1 * cos(th1 + PI / 3.0) - c2 / 3.0 / c3) * PI;
105 else
106  *lat = -(-m1 * cos(th1 + PI / 3.0) - c2 / 3.0 / c3) * PI;
107 
108 if (fabs(xx) < EPSLN)
109  {
110  *lon = lon_center;
111  return(OK);
112  }
113 *lon = adjust_lon(lon_center + PI * (xys - 1.0 + sqrt(1.0 + 2.0 *
114  (xx * xx - yy * yy) + xys * xys)) / 2.0 / xx);
115 
116 return(OK);
117 }
int r
Definition: decode_rs.h:73
void gctp_print_title(const char *proj_name)
Definition: gctp_report.c:14
void gctp_print_cenlon(double A)
Definition: gctp_report.c:40
float * lat
double adjust_lon(double x)
Definition: proj_cproj.c:349
#define PI
Definition: l3_get_org.c:6
double false_easting
Definition: tm.c:54
long vandginv(double x, double y, double *lon, double *lat)
Definition: vandginv.c:64
void gctp_print_offsetp(double A, double B)
Definition: gctp_report.c:91
double false_northing
Definition: tm.c:53
#define OK
Definition: ancil.h:30
#define fabs(a)
Definition: misc.h:93
double lon_center
Definition: tm.c:51
long vandginvint(double r, double center_long, double false_east, double false_north)
Definition: vandginv.c:38
float * lon
void gctp_print_radius(double radius)
Definition: gctp_report.c:22
#define R
Definition: make_L3_v1.1.c:96
#define EPSLN
Definition: proj_define.h:86