OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimAlbersProjection.cpp
Go to the documentation of this file.
1 //*******************************************************************
2 // Copyright (C) 2000 ImageLinks Inc.
3 //
4 // License: See top LICENSE.txt file.
5 //
6 // Author: Garrett Potts
7 //
8 // Description:
9 //
10 // Calls Geotrans Albers projection code.
11 //*******************************************************************
12 // $Id: ossimAlbersProjection.cpp 23002 2014-11-24 17:11:17Z dburken $
13 
15 
17 
18 RTTI_DEF1(ossimAlbersProjection, "ossimAlbersProjection", ossimMapProjection)
19 
20 #ifdef PI_OVER_2
21 # undef PI_OVER_2
22 #endif
23 
24 #define ALBERS_NO_ERROR 0x0000
25 #define ALBERS_LAT_ERROR 0x0001
26 #define ALBERS_LON_ERROR 0x0002
27 #define ALBERS_EASTING_ERROR 0x0004
28 #define ALBERS_NORTHING_ERROR 0x0008
29 #define ALBERS_ORIGIN_LAT_ERROR 0x0010
30 #define ALBERS_CENT_MER_ERROR 0x0020
31 #define ALBERS_A_ERROR 0x0040
32 #define ALBERS_INV_F_ERROR 0x0080
33 #define ALBERS_FIRST_STDP_ERROR 0x0100
34 #define ALBERS_SECOND_STDP_ERROR 0x0200
35 #define ALBERS_FIRST_SECOND_ERROR 0x0400
36 #define ALBERS_HEMISPHERE_ERROR 0x0800
37 
38 #define PI_OVER_2 ( M_PI / 2.0)
39 #define ES_SIN(sinlat) (es * sinlat)
40 #define ONE_MINUS_SQR(x) (1.0 - x * x)
41 #define ALBERS_M(clat,oneminussqressin) (clat / sqrt(oneminussqressin))
42 #define ALBERS_Q(slat,oneminussqressin,essin) (one_MINUS_es2)*(slat / (oneminussqressin)- \
43  (1 / (two_es)) *log((1 - essin) / (1 + essin)))
44 
45 
47  const ossimGpt& origin)
48  :ossimMapProjection(ellipsoid, origin)
49 {
50  Albers_Delta_Northing = 40000000.0;
51  Albers_Delta_Easting = 40000000.0;
52  setDefaults();
53  update();
54 }
55 
57  const ossimGpt& origin,
58  double stdParallel1,
59  double stdParallel2,
60  double falseEasting,
61  double falseNorthing)
62  :ossimMapProjection(ellipsoid, origin)
63 {
64  Albers_Std_Parallel_1 = stdParallel1*RAD_PER_DEG;
65  Albers_Std_Parallel_2 = stdParallel2*RAD_PER_DEG;
66  Albers_Delta_Northing = 40000000.0;
67  Albers_Delta_Easting = 40000000.0;
68  Albers_False_Easting = falseEasting;
69  Albers_False_Northing = falseNorthing;
70 
71  update();
72 
73 }
74 
76 {
77  return new ossimAlbersProjection(*this);
78 }
79 
81 {
82 }
83 
85 {
88  theOrigin.latr(),
89  theOrigin.lonr(),
94 
97 
99 }
100 
101 
103 {
104  double lat, lon;
105 
106 
107  Convert_Albers_To_Geodetic(eastingNorthing.x,
108  eastingNorthing.y,
109  &lat,
110  &lon);
111 
112  return ossimGpt(lat*DEG_PER_RAD, lon*DEG_PER_RAD, 0, theDatum);
113 }
114 
116 {
117  double easting = 0.0;
118  double northing = 0.0;
119  ossimGpt gpt = latLon;
120 
121  if (theDatum)
122  {
123  if (theDatum->code() != latLon.datum()->code())
124  {
125  gpt.changeDatum(theDatum); // Shift to our datum.
126  }
127  }
128 
129 
131  gpt.lonr(),
132  &easting,
133  &northing);
134 
135  return ossimDpt(easting, northing);
136 }
137 
139 {
141  update();
142 }
143 
145 {
147  update();
148 }
149 
151  double parallel2Degree)
152 {
153  Albers_Std_Parallel_1 = parallel1Degree*RAD_PER_DEG;
154  Albers_Std_Parallel_2 = parallel2Degree*RAD_PER_DEG;
155  update();
156 
157 }
158 
159 void ossimAlbersProjection::setFalseEasting(double falseEasting)
160 {
161  Albers_False_Easting = falseEasting;
162  update();
163 }
164 
165 void ossimAlbersProjection::setFalseNorthing(double falseNorthing)
166 {
167  Albers_False_Northing = falseNorthing;
168  update();
169 }
170 
172  double falseNorthing)
173 {
174  Albers_False_Easting = falseEasting;
175  Albers_False_Northing = falseNorthing;
176  update();
177 }
178 
180  double parallel2,
181  double falseEasting,
182  double falseNorthing)
183 {
184  Albers_False_Easting = falseEasting;
185  Albers_False_Northing = falseNorthing;
188  update();
189 }
190 
192 {
194 }
195 
197 {
199 }
200 
202 {
203  // initialize to some default
206  Albers_False_Easting = 0.0;
207  Albers_False_Northing = 0.0;
208 }
209 
210 bool ossimAlbersProjection::saveState(ossimKeywordlist& kwl, const char* prefix) const
211 {
212  kwl.add(prefix,
215  true);
216 
217  kwl.add(prefix,
220  true);
221 
222  return ossimMapProjection::saveState(kwl, prefix);
223 }
224 
225 bool ossimAlbersProjection::loadState(const ossimKeywordlist& kwl, const char* prefix)
226 {
227  // Must do this first...
228  bool flag = ossimMapProjection::loadState(kwl, prefix);
229 
230  const char* type = kwl.find(prefix, ossimKeywordNames::TYPE_KW);
231 
232  const char* stdParallel1 = kwl.find(prefix, ossimKeywordNames::STD_PARALLEL_1_KW);
233  const char* stdParallel2 = kwl.find(prefix, ossimKeywordNames::STD_PARALLEL_2_KW);
234 
235 
237  {
240 
241  if(stdParallel1)
242  {
244  }
245  else
246  {
248  }
249  if(stdParallel2)
250  {
252  }
253  else
254  {
256  }
257  }
258 
259  update();
260 
261  return flag;
262 }
263 
264 
265 /***************************************************************************/
266 /*
267  * FUNCTIONS
268  */
270  double f,
271  double Origin_Latitude,
272  double Central_Meridian,
273  double Std_Parallel_1,
274  double Std_Parallel_2,
275  double False_Easting,
276  double False_Northing)
277 
278 {
279 /*
280  * The function Set_Albers_Parameters receives the ellipsoid parameters and
281  * projection parameters as inputs, and sets the corresponding state
282  * variables. If any errors occur, the error code(s) are returned by the function,
283  * otherwise ALBERS_NO_ERROR is returned.
284  *
285  * a : Semi-major axis of ellipsoid, in meters (input)
286  * f : Flattening of ellipsoid (input)
287  * Origin_Latitude : Latitude in radians at which the (input)
288  * point scale factor is 1.0
289  * Central_Meridian : Longitude in radians at the center of (input)
290  * the projection
291  * Std_Parallel_1 : First standard parallel (input)
292  * Std_Parallel_2 : Second standard parallel (input)
293  * False_Easting : A coordinate value in meters assigned to the
294  * central meridian of the projection. (input)
295  * False_Northing : A coordinate value in meters assigned to the
296  * origin latitude of the projection (input)
297  */
298 
299  double sin_lat, sin_lat_1, cos_lat;
300  double m1, m2, SQRm1;
301  double q0, q1, q2;
302  double es_sin, one_MINUS_SQRes_sin;
303  double nq0;
304  double inv_f = 1 / f;
305  long Error_Code = ALBERS_NO_ERROR;
306 
307  if (a <= 0.0)
308  { /* Semi-major axis must be greater than zero */
309  Error_Code |= ALBERS_A_ERROR;
310  }
311  if ((inv_f < 250) || (inv_f > 350))
312  { /* Inverse flattening must be between 250 and 350 */
313  Error_Code |= ALBERS_INV_F_ERROR;
314  }
315  if ((Origin_Latitude < -PI_OVER_2) || (Origin_Latitude > PI_OVER_2))
316  { /* origin latitude out of range */
317  Error_Code |= ALBERS_ORIGIN_LAT_ERROR;
318  }
319  if ((Central_Meridian < -M_PI) || (Central_Meridian > TWO_PI))
320  { /* origin longitude out of range */
321  Error_Code |= ALBERS_CENT_MER_ERROR;
322  }
323  if ((Std_Parallel_1 < -PI_OVER_2) || (Std_Parallel_1 > PI_OVER_2))
324  { /* First Standard Parallel out of range */
325  Error_Code |= ALBERS_FIRST_STDP_ERROR;
326  }
327  if ((Std_Parallel_2 < -PI_OVER_2) || (Std_Parallel_2 > PI_OVER_2))
328  { /* Second Standard Parallel out of range */
329  Error_Code |= ALBERS_SECOND_STDP_ERROR;
330  }
331  if ((Std_Parallel_1 == 0.0) && (Std_Parallel_2 == 0.0))
332  { /* First & Second Standard Parallels equal 0 */
333  Error_Code |= ALBERS_FIRST_SECOND_ERROR;
334  }
335  if (Std_Parallel_1 == -Std_Parallel_2)
336  { /* Parallels are opposite latitudes */
337  Error_Code |= ALBERS_HEMISPHERE_ERROR;
338  }
339 
340  if (!Error_Code)
341  { /* no errors */
342  Albers_a = a;
343  Albers_f = f;
344  Albers_Origin_Lat = Origin_Latitude;
345  Albers_Std_Parallel_1 = Std_Parallel_1;
346  Albers_Std_Parallel_2 = Std_Parallel_2;
347  if (Central_Meridian > M_PI)
348  Central_Meridian -= TWO_PI;
349  Albers_Origin_Long = Central_Meridian;
350  Albers_False_Easting = False_Easting;
351  Albers_False_Northing = False_Northing;
352 
353  es2 = 2 * Albers_f - Albers_f * Albers_f;
354  es = sqrt(es2);
355  one_MINUS_es2 = 1 - es2;
356  two_es = 2 * es;
357 
358  sin_lat = sin(Albers_Origin_Lat);
359  es_sin = ES_SIN(sin_lat);
360  one_MINUS_SQRes_sin = ONE_MINUS_SQR(es_sin);
361  q0 = ALBERS_Q(sin_lat, one_MINUS_SQRes_sin, es_sin);
362 
363  sin_lat_1 = sin(Albers_Std_Parallel_1);
364  cos_lat = cos(Albers_Std_Parallel_1);
365  es_sin = ES_SIN(sin_lat_1);
366  one_MINUS_SQRes_sin = ONE_MINUS_SQR(es_sin);
367  m1 = ALBERS_M(cos_lat, one_MINUS_SQRes_sin);
368  q1 = ALBERS_Q(sin_lat_1, one_MINUS_SQRes_sin, es_sin);
369 
370  SQRm1 = m1 * m1;
371  if (fabs(Albers_Std_Parallel_1 - Albers_Std_Parallel_2) > 1.0e-10)
372  {
373  sin_lat = sin(Albers_Std_Parallel_2);
374  cos_lat = cos(Albers_Std_Parallel_2);
375  es_sin = ES_SIN(sin_lat);
376  one_MINUS_SQRes_sin = ONE_MINUS_SQR(es_sin);
377  m2 = ALBERS_M(cos_lat, one_MINUS_SQRes_sin);
378  q2 = ALBERS_Q(sin_lat, one_MINUS_SQRes_sin, es_sin);
379  n = (SQRm1 - m2 * m2) / (q2 - q1);
380  }
381  else
382  n = sin_lat_1;
383 
384  C = SQRm1 + n * q1;
386  nq0 = n * q0;
387  if (C < nq0)
388  rho0 = 0;
389  else
390  rho0 = Albers_a_OVER_n * sqrt(C - nq0);
391 
392 
393  } /* END OF if(!Error_Code) */
394  return (Error_Code);
395 } /* END OF Set_Albers_Parameters */
396 
397 
399  double *f,
400  double *Origin_Latitude,
401  double *Central_Meridian,
402  double *Std_Parallel_1,
403  double *Std_Parallel_2,
404  double *False_Easting,
405  double *False_Northing)const
406 
407 { /* BEGIN Get_Albers_Parameters */
408 /*
409  * The function Get_Albers_Parameters returns the current ellipsoid
410  * parameters, and Albers projection parameters.
411  *
412  * a : Semi-major axis of ellipsoid, in meters (output)
413  * f : Flattening of ellipsoid (output)
414  * Origin_Latitude : Latitude in radians at which the (output)
415  * point scale factor is 1.0
416  * Origin_Longitude : Longitude in radians at the center of (output)
417  * the projection
418  * Std_Parallel_1 : First standard parallel (output)
419  * Std_Parallel_2 : Second standard parallel (output)
420  * False_Easting : A coordinate value in meters assigned to the
421  * central meridian of the projection. (output)
422  * False_Northing : A coordinate value in meters assigned to the
423  * origin latitude of the projection (output)
424  */
425 
426  *a = Albers_a;
427  *f = Albers_f;
428  *Origin_Latitude = Albers_Origin_Lat;
429  *Std_Parallel_1 = Albers_Std_Parallel_1;
430  *Std_Parallel_2 = Albers_Std_Parallel_2;
431  *Central_Meridian = Albers_Origin_Long;
432  *False_Easting = Albers_False_Easting;
433  *False_Northing = Albers_False_Northing;
434  return;
435 } /* END OF Get_Albers_Parameters */
436 
437 
439  double Longitude,
440  double *Easting,
441  double *Northing)const
442 
443 { /* BEGIN Convert_Geodetic_To_Albers */
444 /*
445  * The function Convert_Geodetic_To_Albers converts geodetic (latitude and
446  * longitude) coordinates to Albers projection (easting and northing)
447  * coordinates, according to the current ellipsoid and Albers projection
448  * parameters. If any errors occur, the error code(s) are returned by the
449  * function, otherwise ALBERS_NO_ERROR is returned.
450  *
451  * Latitude : Latitude (phi) in radians (input)
452  * Longitude : Longitude (lambda) in radians (input)
453  * Easting : Easting (X) in meters (output)
454  * Northing : Northing (Y) in meters (output)
455  */
456 
457  double dlam; /* Longitude - Central Meridan */
458  double sin_lat;
459  // double cos_lat;
460  double es_sin, one_MINUS_SQRes_sin;
461  double q;
462  double rho;
463  double theta;
464  double nq;
465  long Error_Code = ALBERS_NO_ERROR;
466 
467  if ((Latitude < -PI_OVER_2) || (Latitude > PI_OVER_2))
468  { /* Latitude out of range */
469  Error_Code |= ALBERS_LAT_ERROR;
470  }
471  if ((Longitude < -M_PI) || (Longitude > TWO_PI))
472  { /* Longitude out of range */
473  Error_Code|= ALBERS_LON_ERROR;
474  }
475 
476  if (!Error_Code)
477  { /* no errors */
478 
479  dlam = Longitude - Albers_Origin_Long;
480  if (dlam > M_PI)
481  {
482  dlam -= TWO_PI;
483  }
484  if (dlam < -M_PI)
485  {
486  dlam += TWO_PI;
487  }
488  sin_lat = sin(Latitude);
489  // cos_lat = cos(Latitude);
490  es_sin = ES_SIN(sin_lat);
491  one_MINUS_SQRes_sin = ONE_MINUS_SQR(es_sin);
492  q = ALBERS_Q(sin_lat, one_MINUS_SQRes_sin, es_sin);
493  nq = n * q;
494  if (C < nq)
495  rho = 0;
496  else
497  rho = Albers_a_OVER_n * sqrt(C - nq);
498 
499 
500  theta = n * dlam;
501  *Easting = rho * sin(theta) + Albers_False_Easting;
502  *Northing = rho0 - rho * cos(theta) + Albers_False_Northing;
503  }
504  return (Error_Code);
505 } /* END OF Convert_Geodetic_To_Albers */
506 
507 
509  double Northing,
510  double *Latitude,
511  double *Longitude)const
512 { /* BEGIN Convert_Albers_To_Geodetic */
513 /*
514  * The function Convert_Albers_To_Geodetic converts Albers projection
515  * (easting and northing) coordinates to geodetic (latitude and longitude)
516  * coordinates, according to the current ellipsoid and Albers projection
517  * coordinates. If any errors occur, the error code(s) are returned by the
518  * function, otherwise ALBERS_NO_ERROR is returned.
519  *
520  * Easting : Easting (X) in meters (input)
521  * Northing : Northing (Y) in meters (input)
522  * Latitude : Latitude (phi) in radians (output)
523  * Longitude : Longitude (lambda) in radians (output)
524  */
525 
526  double dy, dx;
527  double rho0_MINUS_dy;
528  double q, qconst, q_OVER_2;
529  double rho, rho_n;
530  double PHI, Delta_PHI = 1.0;
531  double sin_phi;
532  double es_sin, one_MINUS_SQRes_sin;
533  double theta = 0.0;
534  double tolerance = 4.85e-10; /* approximately 1/1000th of
535  an arc second or 1/10th meter */
536  long Error_Code = ALBERS_NO_ERROR;
537 
538  if ((Easting < (Albers_False_Easting - Albers_Delta_Easting))
540  { /* Easting out of range */
541  Error_Code |= ALBERS_EASTING_ERROR;
542  }
543  if ((Northing < (Albers_False_Northing - Albers_Delta_Northing))
545  { /* Northing out of range */
546  Error_Code |= ALBERS_NORTHING_ERROR;
547  }
548 
549  if (!Error_Code)
550  {
551  dy = Northing - Albers_False_Northing;
552  dx = Easting - Albers_False_Easting;
553  rho0_MINUS_dy = rho0 - dy;
554  rho = sqrt(dx * dx + rho0_MINUS_dy * rho0_MINUS_dy);
555 
556  if (n < 0)
557  {
558  rho *= -1.0;
559  dy *= -1.0;
560  dx *= -1.0;
561  rho0_MINUS_dy *= -1.0;
562  }
563 
564  if (rho != 0.0)
565  theta = atan2(dx, rho0_MINUS_dy);
566  rho_n = rho * n;
567  q = (C - (rho_n * rho_n) / (Albers_a * Albers_a)) / n;
568  qconst = 1 - ((one_MINUS_es2) / (two_es)) * log((1.0 - es) / (1.0 + es));
569  if (fabs(fabs(qconst) - fabs(q)) > 1.0e-6)
570  {
571  q_OVER_2 = q / 2.0;
572  if (q_OVER_2 > 1.0)
573  *Latitude = PI_OVER_2;
574  else if (q_OVER_2 < -1.0)
575  *Latitude = -PI_OVER_2;
576  else
577  {
578  PHI = asin(q_OVER_2);
579  if (es < 1.0e-10)
580  *Latitude = PHI;
581  else
582  {
583  while (fabs(Delta_PHI) > tolerance)
584  {
585  sin_phi = sin(PHI);
586  es_sin = ES_SIN(sin_phi);
587  one_MINUS_SQRes_sin = ONE_MINUS_SQR(es_sin);
588  Delta_PHI = (one_MINUS_SQRes_sin * one_MINUS_SQRes_sin) / (2.0 * cos(PHI)) *
589  (q / (one_MINUS_es2) - sin_phi / one_MINUS_SQRes_sin +
590  (log((1.0 - es_sin) / (1.0 + es_sin)) / (two_es)));
591  PHI += Delta_PHI;
592  }
593  *Latitude = PHI;
594  }
595 
596  if (*Latitude > PI_OVER_2) /* force distorted values to 90, -90 degrees */
597  *Latitude = PI_OVER_2;
598  else if (*Latitude < -PI_OVER_2)
599  *Latitude = -PI_OVER_2;
600 
601  }
602  }
603  else
604  {
605  if (q >= 0.0)
606  *Latitude = PI_OVER_2;
607  else
608  *Latitude = -PI_OVER_2;
609  }
610  *Longitude = Albers_Origin_Long + theta / n;
611 
612  if (*Longitude > M_PI)
613  *Longitude -= TWO_PI;
614  if (*Longitude < -M_PI)
615  *Longitude += TWO_PI;
616 
617  if (*Longitude > M_PI) /* force distorted values to 180, -180 degrees */
618  *Longitude = M_PI;
619  else if (*Longitude < -M_PI)
620  *Longitude = -M_PI;
621 
622  }
623  return (Error_Code);
624 } /* END OF Convert_Albers_To_Geodetic */
625 
626 //*************************************************************************************************
628 //*************************************************************************************************
630 {
631  if (!ossimMapProjection::operator==(proj)) return false;
632 
633  const ossimAlbersProjection* p = dynamic_cast<const ossimAlbersProjection*>(&proj);
634  if (!p) return false;
635 
640 
641  return true;
642 }
long Convert_Albers_To_Geodetic(double Easting, double Northing, double *Latitude, double *Longitude) const
#define ES_SIN(sinlat)
virtual double getStandardParallel1() const
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
Method to the load (recreate) the state of an object from a keyword list.
#define ALBERS_M(clat, oneminussqressin)
long Convert_Geodetic_To_Albers(double Latitude, double Longitude, double *Easting, double *Northing) const
#define ALBERS_NORTHING_ERROR
#define ALBERS_INV_F_ERROR
#define DEG_PER_RAD
Represents serializable keyword/value map.
#define ALBERS_NO_ERROR
virtual ossimGpt inverse(const ossimDpt &projectedPoint) const
Will take a point in meters and convert it to ground.
const char * find(const char *key) const
bool almostEqual(T x, T y, T tolerance=FLT_EPSILON)
Definition: ossimCommon.h:53
#define ALBERS_LAT_ERROR
double y
Definition: ossimDpt.h:165
virtual double getStandardParallel2() const
void setStandardParallels(double parallel1Degree, double prallel2Degree)
virtual const ossimString & code() const
Definition: ossimDatum.h:57
ossimAlbersProjection(const ossimEllipsoid &ellipsoid=ossimEllipsoid(), const ossimGpt &origin=ossimGpt())
#define ALBERS_A_ERROR
#define ONE_MINUS_SQR(x)
#define ALBERS_FIRST_STDP_ERROR
virtual bool operator==(const ossimProjection &projection) const
Returns TRUE if principal parameters are within epsilon tolerance.
static const char * TYPE_KW
#define ALBERS_HEMISPHERE_ERROR
void changeDatum(const ossimDatum *datum)
This will actually perform a shift.
Definition: ossimGpt.cpp:316
void setStandardParallel1(double degree)
#define STATIC_TYPE_NAME(T)
Definition: ossimRtti.h:325
const ossimDatum * datum() const
datum().
Definition: ossimGpt.h:196
#define ALBERS_EASTING_ERROR
void add(const char *prefix, const ossimKeywordlist &kwl, bool overwrite=true)
#define ALBERS_ORIGIN_LAT_ERROR
Albers Equal Area Conic Projection.
ossimObject * dup() const
#define M_PI
void setFalseNorthing(double falseNorthing)
const double & getA() const
double lonr() const
Returns the longitude in radian measure.
Definition: ossimGpt.h:76
double toDouble() const
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
Method to save the state of an object to a keyword list.
static const char * STD_PARALLEL_1_KW
virtual ossimDpt forward(const ossimGpt &worldPoint) const
All map projections will convert the world coordinate to an easting northing (Meters).
#define PI_OVER_2
#define ALBERS_CENT_MER_ERROR
void setFalseEastingNorthing(double falseEasting, double falseNorthing)
long Set_Albers_Parameters(double a, double f, double Origin_Latitude, double Central_Meridian, double Std_Parallel_1, double Std_Parallel_2, double False_Easting, double False_Northing)
#define ALBERS_LON_ERROR
void setFalseEasting(double falseEasting)
void setParameters(double parallel1, double parallel2, double falseEasting, double falseNorthing)
void setStandardParallel2(double degree)
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
double x
Definition: ossimDpt.h:164
#define TWO_PI
void Get_Albers_Parameters(double *a, double *f, double *Origin_Latitude, double *Central_Meridian, double *Std_Parallel_1, double *Std_Parallel_2, double *False_Easting, double *False_Northing) const
double latr() const
latr().
Definition: ossimGpt.h:66
const double & getFlattening() const
ossimEllipsoid theEllipsoid
This method verifies that the projection parameters match the current pcs code.
#define RTTI_DEF1(cls, name, b1)
Definition: ossimRtti.h:485
ossimDpt theFalseEastingNorthing
Hold the false easting northing.
static const char * STD_PARALLEL_2_KW
#define ALBERS_FIRST_SECOND_ERROR
#define ALBERS_SECOND_STDP_ERROR
#define RAD_PER_DEG
#define ALBERS_Q(slat, oneminussqressin, essin)
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
const ossimDatum * theDatum
This is only set if we want to have built in datum shifting.