OB.DAAC Logo
NASA Logo
Ocean Color Science Software

ocssw V2022
tm.c
Go to the documentation of this file.
1 /*******************************************************************************
2 Name: TRANSVERSE MERCATOR and UNIVERSAL TRANSVERSE MERCATOR
3 
4 Purpose: Provides the transformations between Easting/Northing and longitude/
5  latitude for both the Universal Transverse Mercator and Transverse Mercator
6  projections since the UTM projection is just a special case of the TM
7  projection. The Easting and Northing are in meters. The longitude and
8  latitude are in radians.
9 
10 Algorithm References:
11 
12 1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological
13  Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United
14  State Government Printing Office, Washington D.C., 1987.
15 
16 2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections",
17  U.S. Geological Survey Professional Paper 1453 , United State Government
18  Printing Office, Washington D.C., 1989.
19 *******************************************************************************/
20 #include <stdlib.h>
21 #include <math.h>
22 #include "oli_cproj.h"
23 #include "gctp.h"
24 #include "oli_local.h"
25 
26 
27 /* structure to hold the setup data relevant to this projection */
28 struct tm_proj
29 {
30  double r_major; /* major axis */
31  double r_minor; /* minor axis */
32  double scale_factor; /* scale factor */
33  double lon_center; /* Center longitude (projection center) */
34  double lat_origin; /* center latitude */
35  double false_northing; /* y offset in meters */
36  double false_easting; /* x offset in meters */
37  double e0; /* eccentricity constants */
38  double e1;
39  double e2;
40  double e3;
41  double es;
42  double esp;
43  double ml0; /* small value m */
44  int is_sphere; /* sphere flag value */
45 };
46 
47 
48 /*****************************************************************************
49 Name: utm_print_info
50 
51 Purpose: Prints a summary of information about the UTM projection.
52 
53 Returns:
54  nothing
55 
56 *****************************************************************************/
57 static void utm_print_info
58 (
59  const TRANSFORMATION *trans
60 )
61 {
62  struct tm_proj *cache_ptr = (struct tm_proj *)trans->cache;
63 
64  gctp_print_title("UNIVERSAL TRANSVERSE MERCATOR (UTM)");
65  gctp_print_genrpt_long(trans->proj.zone, "Zone: ");
66  gctp_print_radius2(cache_ptr->r_major, cache_ptr->r_minor);
68  "Scale Factor at C. Meridian: ");
69  gctp_print_cenlonmer(cache_ptr->lon_center);
70 }
71 
72 /*****************************************************************************
73 Name: tm_print_info
74 
75 Purpose: Prints a summary of information about the TM projection.
76 
77 Returns:
78  nothing
79 
80 *****************************************************************************/
81 static void tm_print_info
82 (
83  const TRANSFORMATION *trans
84 )
85 {
86  struct tm_proj *cache_ptr = (struct tm_proj *)trans->cache;
87 
88  gctp_print_title("TRANSVERSE MERCATOR (TM)");
89  gctp_print_radius2(cache_ptr->r_major, cache_ptr->r_minor);
91  "Scale Factor at C. Meridian: ");
92  gctp_print_cenlonmer(cache_ptr->lon_center);
93  gctp_print_origin(cache_ptr->lat_origin);
94  gctp_print_offsetp(cache_ptr->false_easting, cache_ptr->false_northing);
95 }
96 
97 /*******************************************************************************
98 Name: common_init
99 
100 Purpose: Initialization routine for initializing the projection information
101  that is common to both the TM/UTM forward and inverse transformations.
102 
103 Returns:
104  GCTP_SUCCESS or GCTP_ERROR
105 
106 *******************************************************************************/
107 static int common_init
108 (
109  TRANSFORMATION *trans,
110  double r_major,
111  double r_minor,
112  double scale_factor,
113  double center_long,
114  double lat_origin,
115  double false_easting,
116  double false_northing
117 )
118 {
119  struct tm_proj *cache = NULL;
120  double temp;
121 
122  /* Allocate a structure for the cached info */
123  cache = malloc(sizeof(*cache));
124  if (!cache)
125  {
126  GCTP_PRINT_ERROR("Error allocating memory for cache buffer");
127  return GCTP_ERROR;
128  }
129  trans->cache = cache;
130 
131  /* Save the information to the cache */
132  cache->r_major = r_major;
133  cache->r_minor = r_minor;
134  cache->scale_factor = scale_factor;
135  cache->lat_origin = lat_origin;
136  cache->lon_center = center_long;
137 
138  cache->false_easting = false_easting;
139  cache->false_northing = false_northing;
140 
141  temp = r_minor / r_major;
142  cache->es = 1.0 - SQUARE(temp);
143  cache->e0 = gctp_calc_e0(cache->es);
144  cache->e1 = gctp_calc_e1(cache->es);
145  cache->e2 = gctp_calc_e2(cache->es);
146  cache->e3 = gctp_calc_e3(cache->es);
148  cache->e2, cache->e3, cache->lat_origin);
149  cache->esp = cache->es / (1.0 - cache->es);
150 
151  /* Set the flag indicating the transformation can use the spherical form
152  if the eccentricity is small enough */
153  if (cache->es < .00001)
154  cache->is_sphere = 1;
155  else
156  cache->is_sphere = 0;
157 
158  return GCTP_SUCCESS;
159 }
160 
161 /*******************************************************************************
162 Name: tm_common_init
163 
164 Purpose: Initialization routine for initializing the TM projection information
165  that is common to both the forward and inverse transformations.
166 
167 Returns:
168  GCTP_SUCCESS or GCTP_ERROR
169 
170 *******************************************************************************/
171 static int tm_common_init
172 (
173  TRANSFORMATION *trans /* I/O: transformation to initialize */
174 )
175 {
176  double r_major; /* major axis */
177  double r_minor; /* minor axis */
178  double radius; /* earth radius */
179  double scale_factor; /* scale factor */
180  double center_long;
181  double lat_origin;
182  double false_easting;
183  double false_northing;
184  const GCTP_PROJECTION *proj = &trans->proj;
185  int spheroid = proj->spheroid;
186 
187  /* Get the parameters from the input parameters */
188  scale_factor = proj->parameters[2];
189  false_easting = proj->parameters[6];
190  false_northing = proj->parameters[7];
191  gctp_get_spheroid(spheroid, proj->parameters, &r_major, &r_minor, &radius);
192 
193  if (gctp_dms2degrees(proj->parameters[4], &center_long) != GCTP_SUCCESS)
194  {
195  GCTP_PRINT_ERROR("Error converting longitude in parameter 4 from "
196  "DMS to degrees: %f", proj->parameters[4]);
197  return GCTP_ERROR;
198  }
199  center_long *= 3600 * S2R;
200 
201  if (gctp_dms2degrees(proj->parameters[5], &lat_origin) != GCTP_SUCCESS)
202  {
203  GCTP_PRINT_ERROR("Error converting latitude in parameter 5 from "
204  "DMS to degrees: %f", proj->parameters[5]);
205  return GCTP_ERROR;
206  }
207  lat_origin *= 3600 * S2R;
208 
209  trans->print_info = tm_print_info;
210 
211  return common_init(trans, r_major, r_minor, scale_factor, center_long,
213 }
214 
215 /*******************************************************************************
216 Name: utm_common_init
217 
218 Purpose: Initialization routine for initializing the UTM projection information
219  that is common to both the forward and inverse transformations.
220 
221 Returns:
222  GCTP_SUCCESS or GCTP_ERROR
223 
224 *******************************************************************************/
225 static int utm_common_init
226 (
227  TRANSFORMATION *trans /* I/O: transformation to initialize */
228 )
229 {
230  double r_major; /* major axis */
231  double r_minor; /* minor axis */
232  double radius; /* earth radius */
233  double scale_factor; /* scale factor */
234  double center_long;
235  double lat_origin;
236  double false_easting;
237  double false_northing;
238  int zone; /* zone number */
239  const GCTP_PROJECTION *proj = &trans->proj;
240  int spheroid = proj->spheroid;
241 
242 
243  /* set Clarke 1866 spheroid if negative spheroid code */
244  if (spheroid < 0)
245  spheroid = 0;
246 
247  gctp_get_spheroid(spheroid, proj->parameters, &r_major, &r_minor, &radius);
248 
249  zone = proj->zone;
250  if (zone == 0)
251  {
252  /* The zone is zero, so calculate it from the first two projection
253  parameters */
254  double lon1;
255  double lat1;
256 
257  /* Convert the longitude and latitude from DMS to degrees */
258  if (gctp_dms2degrees(proj->parameters[0], &lon1) != GCTP_SUCCESS)
259  {
260  GCTP_PRINT_ERROR("Error converting longitude in parameter 0 from "
261  "DMS to degrees: %f", proj->parameters[0]);
262  return GCTP_ERROR;
263  }
264  lon1 *= 3600 * S2R;
265 
266  if (gctp_dms2degrees(proj->parameters[1], &lat1) != GCTP_SUCCESS)
267  {
268  GCTP_PRINT_ERROR("Error converting latitude in parameter 1 from "
269  "DMS to degrees: %f", proj->parameters[1]);
270  return GCTP_ERROR;
271  }
272  lat1 *= 3600 * S2R;
273 
274  /* Calculate the zone from the longitude */
275  zone = gctp_calc_utm_zone(lon1 * R2D);
276 
277  /* Use the convention of a negative zone for the southern hemisphere */
278  if (lat1 < 0)
279  zone = -zone;
280  }
281  scale_factor = .9996;
282 
283  /* Verify the zone is a legal value */
284  if ((abs(zone) < 1) || (abs(zone) > 60))
285  {
286  GCTP_PRINT_ERROR("Illegal zone number: %d", zone);
287  return GCTP_ERROR;
288  }
289 
290  lat_origin = 0.0;
291  center_long = ((6 * abs(zone)) - 183) * D2R;
292  false_easting = 500000.0;
293  false_northing = (zone < 0) ? 10000000.0 : 0.0;
294 
295  trans->print_info = utm_print_info;
296 
297  return common_init(trans, r_major, r_minor, scale_factor, center_long,
299 }
300 
301 /*****************************************************************************
302 Name: inverse_transform
303 
304 Purpose: Transforms UTM/TM X,Y to lat,long
305 
306 Returns:
307  GCTP_SUCCESS or GCTP_ERROR
308 
309 *****************************************************************************/
310 static int inverse_transform
311 (
312  const TRANSFORMATION *trans, /* I: transformation information */
313  double x, /* I: X projection coordinate */
314  double y, /* I: Y projection coordinate */
315  double *lon, /* O: Longitude */
316  double *lat /* O: Latitude */
317 )
318 {
319  struct tm_proj *cache_ptr = (struct tm_proj *)trans->cache;
320  double con,phi; /* temporary angles */
321  double delta_phi; /* difference between longitudes */
322  long i; /* counter variable */
323  double sin_phi, cos_phi, tan_phi; /* sin cos and tangent values */
324  double c, cs, t, ts, n, r, d, ds; /* temporary variables */
325  double f, h, g, temp; /* temporary variables */
326  long max_iter = 6; /* maximun number of iterations */
327 
328  /* Use the spherical form if possible */
329  if (cache_ptr->is_sphere)
330  {
331  f = exp(x / (cache_ptr->r_major * cache_ptr->scale_factor));
332  g = 0.5 * (f - 1.0/f);
333  temp = cache_ptr->lat_origin + y
334  /(cache_ptr->r_major * cache_ptr->scale_factor);
335  h = cos(temp);
336  con = sqrt((1.0 - h * h)/(1.0 + g * g));
337  *lat = asinz(con);
338  if (temp < 0)
339  *lat = -*lat;
340  if ((g == 0) && (h == 0))
341  {
342  *lon = cache_ptr->lon_center;
343  return GCTP_SUCCESS;
344  }
345  else
346  {
347  *lon = adjust_lon(atan2(g,h) + cache_ptr->lon_center);
348  return GCTP_SUCCESS;
349  }
350  }
351 
352  /* Inverse equations */
353  x = x - cache_ptr->false_easting;
354  y = y - cache_ptr->false_northing;
355 
356  con = (cache_ptr->ml0 + y / cache_ptr->scale_factor) / cache_ptr->r_major;
357  phi = con;
358  for (i = 0; ;i++)
359  {
360  delta_phi = ((con + cache_ptr->e1 * sin(2.0*phi) - cache_ptr->e2
361  * sin(4.0*phi) + cache_ptr->e3 * sin(6.0*phi))
362  / cache_ptr->e0) - phi;
363  phi += delta_phi;
364  if (fabs(delta_phi) <= EPSLN)
365  break;
366  if (i >= max_iter)
367  {
368  GCTP_PRINT_ERROR("Latitude failed to converge in inverse "
369  "transform");
370  return GCTP_ERROR;
371  }
372  }
373  if (fabs(phi) < HALF_PI)
374  {
375  sincos(phi, &sin_phi, &cos_phi);
376  tan_phi = tan(phi);
377  c = cache_ptr->esp * SQUARE(cos_phi);
378  cs = SQUARE(c);
379  t = SQUARE(tan_phi);
380  ts = SQUARE(t);
381  con = 1.0 - cache_ptr->es * SQUARE(sin_phi);
382  n = cache_ptr->r_major / sqrt(con);
383  r = n * (1.0 - cache_ptr->es) / con;
384  d = x / (n * cache_ptr->scale_factor);
385  ds = SQUARE(d);
386  *lat = phi - (n * tan_phi * ds / r) * (0.5 - ds / 24.0 * (5.0 + 3.0
387  * t + 10.0 * c - 4.0 * cs - 9.0 * cache_ptr->esp - ds / 30.0
388  * (61.0 + 90.0 * t + 298.0 * c + 45.0 * ts - 252.0
389  * cache_ptr->esp - 3.0 * cs)));
390  *lon = adjust_lon(cache_ptr->lon_center + (d * (1.0 - ds / 6.0
391  * (1.0 + 2.0 * t + c - ds / 20.0 * (5.0 - 2.0 * c + 28.0
392  * t - 3.0 * cs + 8.0 * cache_ptr->esp + 24.0 * ts)))
393  / cos_phi));
394  }
395  else
396  {
397  *lat = HALF_PI * gctp_get_sign(y);
398  *lon = cache_ptr->lon_center;
399  }
400  return GCTP_SUCCESS;
401 }
402 
403 /*****************************************************************************
404 Name: forward_transform
405 
406 Purpose: Transforms lat,long to UTM/TM X,Y
407 
408 Returns:
409  GCTP_SUCCESS or GCTP_ERROR
410 
411 *****************************************************************************/
412 static int forward_transform
413 (
414  const TRANSFORMATION *trans, /* I: transformation information */
415  double lon, /* I: Longitude */
416  double lat, /* I: Latitude */
417  double *x, /* O: X projection coordinate */
418  double *y /* O: Y projection coordinate */
419 )
420 {
421  struct tm_proj *cache_ptr = (struct tm_proj *)trans->cache;
422  double delta_lon; /* Delta longitude (Given longitude - center) */
423  double sin_phi, cos_phi;/* sin and cos value */
424  double al, als; /* temporary values */
425  double b; /* temporary values */
426  double c, t, tq; /* temporary values */
427  double con, n, ml; /* cone constant, small m */
428 
429  /* Forward equations */
430  delta_lon = adjust_lon(lon - cache_ptr->lon_center);
431  sincos(lat, &sin_phi, &cos_phi);
432 
433  /* Use the spherical form if possible */
434  if (cache_ptr->is_sphere)
435  {
436  b = cos_phi * sin(delta_lon);
437  if ((fabs(fabs(b) - 1.0)) < .0000000001)
438  {
439  GCTP_PRINT_ERROR("Point projects into infinity");
440  return GCTP_ERROR;
441  }
442  else
443  {
444  *x = 0.5 * cache_ptr->r_major * cache_ptr->scale_factor
445  * log((1.0 + b)/(1.0 - b));
446  con = acos(cos_phi * cos(delta_lon)/sqrt(1.0 - b*b));
447  if (lat < 0.0)
448  con = - con;
449  *y = cache_ptr->r_major * cache_ptr->scale_factor
450  * (con - cache_ptr->lat_origin);
451  return GCTP_SUCCESS;
452  }
453  }
454 
455  al = cos_phi * delta_lon;
456  als = SQUARE(al);
457  c = cache_ptr->esp * SQUARE(cos_phi);
458  tq = tan(lat);
459  t = SQUARE(tq);
460  con = 1.0 - cache_ptr->es * SQUARE(sin_phi);
461  n = cache_ptr->r_major / sqrt(con);
462  ml = cache_ptr->r_major * gctp_calc_dist_from_equator(cache_ptr->e0,
463  cache_ptr->e1, cache_ptr->e2, cache_ptr->e3, lat);
464 
465  *x = cache_ptr->scale_factor * n * al * (1.0 + als / 6.0
466  * (1.0 - t + c + als / 20.0 * (5.0 - 18.0 * t + SQUARE(t) + 72.0
467  * c - 58.0 * cache_ptr->esp))) + cache_ptr->false_easting;
468 
469  *y = cache_ptr->scale_factor * (ml - cache_ptr->ml0 + n * tq * (als
470  * (0.5 + als / 24.0 * (5.0 - t + 9.0 * c + 4.0 * SQUARE(c) + als
471  / 30.0 * (61.0 - 58.0 * t + SQUARE(t) + 600.0 * c - 330.0
472  * cache_ptr->esp))))) + cache_ptr->false_northing;
473 
474  return GCTP_SUCCESS;
475 }
476 
477 /*****************************************************************************
478 Name: gctp_utm_inverse_init
479 
480 Purpose: Initializes the inverse UTM transformation
481 
482 Returns:
483  GCTP_SUCCESS or GCTP_ERROR
484 
485 *****************************************************************************/
487 (
488  TRANSFORMATION *trans
489 )
490 {
491  /* Call the common routine used for the forward and inverse init */
492  if (utm_common_init(trans) != GCTP_SUCCESS)
493  {
494  GCTP_PRINT_ERROR("Error initializing UTM inverse projection");
495  return GCTP_ERROR;
496  }
497 
498  trans->transform = inverse_transform;
499 
500  return GCTP_SUCCESS;
501 }
502 
503 /*****************************************************************************
504 Name: gctp_utm_forward_init
505 
506 Purpose: Initializes the forward UTM transformation
507 
508 Returns:
509  GCTP_SUCCESS or GCTP_ERROR
510 
511 *****************************************************************************/
513 (
514  TRANSFORMATION *trans
515 )
516 {
517  /* Call the common routine used for the forward and inverse init */
518  if (utm_common_init(trans) != GCTP_SUCCESS)
519  {
520  GCTP_PRINT_ERROR("Error initializing UTM forward projection");
521  return GCTP_ERROR;
522  }
523 
524  trans->transform = forward_transform;
525 
526  return GCTP_SUCCESS;
527 }
528 
529 /*****************************************************************************
530 Name: gctp_tm_inverse_init
531 
532 Purpose: Initializes the inverse TM transformation
533 
534 Returns:
535  GCTP_SUCCESS or GCTP_ERROR
536 
537 *****************************************************************************/
539 (
540  TRANSFORMATION *trans
541 )
542 {
543  /* Call the common routine used for the forward and inverse init */
544  if (tm_common_init(trans) != GCTP_SUCCESS)
545  {
546  GCTP_PRINT_ERROR("Error initializing TM inverse projection");
547  return GCTP_ERROR;
548  }
549 
550  trans->transform = inverse_transform;
551 
552  return GCTP_SUCCESS;
553 }
554 
555 /*****************************************************************************
556 Name: gctp_tm_forward_init
557 
558 Purpose: Initializes the forward TM transformation
559 
560 Returns:
561  GCTP_SUCCESS or GCTP_ERROR
562 
563 *****************************************************************************/
565 (
566  TRANSFORMATION *trans
567 )
568 {
569  /* Call the common routine used for the forward and inverse init */
570  if (tm_common_init(trans) != GCTP_SUCCESS)
571  {
572  GCTP_PRINT_ERROR("Error initializing TM forward projection");
573  return GCTP_ERROR;
574  }
575 
576  trans->transform = forward_transform;
577 
578  return GCTP_SUCCESS;
579 }
int max_iter
double lat_origin
Definition: tm.c:52
int gctp_utm_forward_init(TRANSFORMATION *trans)
Definition: tm.c:513
#define SQUARE(x)
Definition: proj_define.h:99
int gctp_tm_inverse_init(TRANSFORMATION *trans)
Definition: tm.c:539
int r
Definition: decode_rs.h:73
void gctp_print_origin(double A)
Definition: gctp_report.c:65
data_t t[NROOTS+1]
Definition: decode_rs.h:77
void gctp_print_title(const char *proj_name)
Definition: gctp_report.c:14
double gctp_calc_e2(double x)
Definition: gctp_utility.c:139
double es
Definition: tm.c:59
#define GCTP_ERROR
Definition: gctp.h:81
#define NULL
Definition: decode_rs.h:63
double scale_factor
Definition: tm.c:50
#define GCTP_PRINT_ERROR(format,...)
Definition: oli_local.h:81
int gctp_get_sign(double x)
Definition: gctp_utility.c:103
void gctp_print_genrpt_long(long A, const char *S)
Definition: gctp_report.c:126
float h[MODELMAX]
Definition: atrem_corl1.h:131
float * lat
character(len=1000) if
Definition: names.f90:13
double adjust_lon(double x)
Definition: proj_cproj.c:349
int gctp_utm_inverse_init(TRANSFORMATION *trans)
Definition: tm.c:487
double e3
Definition: tm.c:58
double false_easting
Definition: tm.c:54
double precision function f(R1)
Definition: tmd.lp.f:1454
def cache(filename, recache=False)
Definition: utils.py:145
#define HALF_PI
Definition: proj_define.h:84
double gctp_calc_e0(double x)
Definition: gctp_utility.c:125
#define D2R
Definition: proj_define.h:91
int is_sphere
Definition: tm.c:62
int gctp_calc_utm_zone(double lon)
Definition: gctp_utility.c:85
void gctp_print_offsetp(double A, double B)
Definition: gctp_report.c:91
double false_northing
Definition: tm.c:53
double e0
Definition: tm.c:55
#define GCTP_SUCCESS
Definition: gctp.h:82
double gctp_calc_e3(double x)
Definition: gctp_utility.c:146
int gctp_tm_forward_init(TRANSFORMATION *trans)
Definition: tm.c:565
int gctp_dms2degrees(double angle, double *degrees)
void gctp_print_genrpt(double A, const char *S)
Definition: gctp_report.c:117
double gctp_calc_e1(double x)
Definition: gctp_utility.c:132
#define gctp_get_spheroid
Definition: oli_local.h:7
#define sincos
Definition: proj_define.h:108
data_t b[NROOTS+1]
Definition: decode_rs.h:77
void gctp_print_radius2(double radius1, double radius2)
Definition: gctp_report.c:30
void gctp_print_cenlonmer(double A)
Definition: gctp_report.c:48
#define fabs(a)
Definition: misc.h:93
double lon_center
Definition: tm.c:51
#define S2R
Definition: proj_define.h:92
#define R2D
Definition: proj_define.h:87
double esp
Definition: tm.c:60
float * lon
Definition: tm.c:28
double e1
Definition: tm.c:56
for(i=0;i< NROOTS;i++) s[i]
Definition: decode_rs.h:85
no change in intended resolving MODur00064 Corrected handling of bad ephemeris attitude resolving resolving GSFcd00179 Corrected handling of fill values for[Sensor|Solar][Zenith|Azimuth] resolving MODxl01751 Changed to validate LUT version against a value retrieved from the resolving MODxl02056 Changed to calculate Solar Diffuser angles without adjustment for estimated post launch changes in the MODIS orientation relative to incidentally resolving defects MODxl01766 Also resolves MODxl01947 Changed to ignore fill values in SCI_ABNORM and SCI_STATE rather than treating them as resolving MODxl01780 Changed to use spacecraft ancillary data to recognise when the mirror encoder data is being set by side A or side B and to change calculations accordingly This removes the need for seperate LUTs for Side A and Side B data it makes the new LUTs incompatible with older versions of the and vice versa Also resolves MODxl01685 A more robust GRing algorithm is being which will create a non default GRing anytime there s even a single geolocated pixel in a granule Removed obsolete messages from seed as required for compatibility with version of the SDP toolkit Corrected test output file names to end in per delivery and then split off a new MYD_PR03 pcf file for Aqua Added AssociatedPlatformInstrumentSensor to the inventory metadata in MOD01 mcf and MOD03 mcf Created new versions named MYD01 mcf and MYD03 where AssociatedPlatformShortName is rather than Terra The program itself has been changed to read the Satellite Instrument validate it against the input L1A and LUT and to use it determine the correct files to retrieve the ephemeris and attitude data from Changed to produce a LocalGranuleID starting with MYD03 if run on Aqua data Added the Scan Type file attribute to the Geolocation copied from the L1A and attitude_angels to radians rather than degrees The accumulation of Cumulated gflags was moved from GEO_validate_earth_location c to GEO_locate_one_scan c
Definition: HISTORY.txt:464
void radius(double A)
Definition: proj_report.c:132
double ml0
Definition: tm.c:61
#define abs(a)
Definition: misc.h:90
int i
Definition: decode_rs.h:71
double e2
Definition: tm.c:57
double asinz(double con)
Definition: proj_cproj.c:67
double r_minor
Definition: tm.c:49
double gctp_calc_dist_from_equator(double e0, double e1, double e2, double e3, double phi)
Definition: gctp_utility.c:187
double r_major
Definition: tm.c:48
#define EPSLN
Definition: proj_define.h:86