108 using namespace MSP::CCS;
 
  116 const double PI = 3.14159265358979323e0;  
 
  129    double ellipsoidSemiMajorAxis,
 
  130    double ellipsoidFlattening,
 
  131    double centralMeridian,
 
  132    double latitudeOfTrueScale,
 
  134    double falseNorthing,
 
  135    double scaleFactor ) :
 
  137   es2( 0.0066943799901413800 ),      
 
  138   es4( 4.4814723452405e-005 ),        
 
  139   es6( 3.0000678794350e-007 ),        
 
  140   es( .081819190842622 ),             
 
  142   qp( 1.9955310875028 ),
 
  143   One_MINUS_es2( .99330562000986 ),  
 
  144   One_OVER_2es( 6.1110357466348 ),    
 
  145   a0( .0022392088624809 ),     
 
  146   a1( 2.8830839728915e-006 ),         
 
  147   a2( 5.0331826636906e-009 ),         
 
  148   b0( .0025188265843907 ),            
 
  149   b1( 3.7009490356205e-006 ),        
 
  150   b2( 7.4478137675038e-009 ),         
 
  151   b3( 1.7035993238596e-011 ),         
 
  152   c0( .99832429845280 ),              
 
  153   c1( .0025146070605187 ),            
 
  154   c2( 2.6390465943377e-006 ),         
 
  155   c3( 3.4180460865959e-009 ),         
 
  156   Tcea_Origin_Long( 0.0 ),            
 
  157   Tcea_Origin_Lat( 0.0 ),             
 
  158   Tcea_False_Easting( 0.0 ),          
 
  159   Tcea_False_Northing( 0.0 ),         
 
  160   Tcea_Scale_Factor( 1.0 ),           
 
  161   Tcea_Min_Easting( -6398628.0 ),
 
  162   Tcea_Max_Easting( 6398628.0 ),
 
  163   Tcea_Min_Northing( -20003931.0 ),
 
  164   Tcea_Max_Northing( 20003931.0 )
 
  188   double x, j, three_es4;
 
  189   double Sqrt_One_MINUS_es2;
 
  190   double e1, e2, e3, e4;
 
  191   double lat, sin2lat, sin4lat, sin6lat;
 
  192   double temp, temp_northing;
 
  193   double inv_f = 1 / ellipsoidFlattening;
 
  195   if (ellipsoidSemiMajorAxis <= 0.0)
 
  199   if ((inv_f < 250) || (inv_f > 350))
 
  207   if ((centralMeridian < -
PI) || (centralMeridian > 
TWO_PI))
 
  219   Tcea_Origin_Lat = latitudeOfTrueScale;
 
  220   if (centralMeridian > 
PI)
 
  221     centralMeridian -= 
TWO_PI;
 
  222   Tcea_Origin_Long = centralMeridian;
 
  223   Tcea_False_Northing = falseNorthing;
 
  224   Tcea_False_Easting = falseEasting;
 
  225   Tcea_Scale_Factor = scaleFactor;
 
  229   One_MINUS_es2 = 1.0 - es2;
 
  230   Sqrt_One_MINUS_es2 = sqrt(One_MINUS_es2);
 
  231   One_OVER_2es = 1.0 / (2.0 * es);
 
  235   qp = TCEA_Q(sin_lat_90,x);
 
  237   a0 = es2 / 3.0 + 31.0 * es4 / 180.0 + 517.0 * es6 / 5040.0;
 
  238   a1 = 23.0 * es4 / 360.0 + 251.0 * es6 / 3780.0;
 
  239   a2 = 761.0 * es6 / 45360.0;
 
  241   e1 = (1.0 - Sqrt_One_MINUS_es2) / (1.0 + Sqrt_One_MINUS_es2);
 
  245   b0 = 3.0 * e1 / 2.0 - 27.0 * e3 / 32.0;
 
  246   b1 = 21.0 * e2 / 16.0 - 55.0 * e4 / 32.0;
 
  247   b2 = 151.0 * e3 / 96.0;
 
  248   b3 = 1097.0 * e4 / 512.0;
 
  250   j = 45.0 * es6 / 1024.0;
 
  251   three_es4 = 3.0 * es4;
 
  252   c0 = 1.0 - es2 / 4.0 - three_es4 / 64.0 - 5.0 * es6 / 256.0;
 
  253   c1 = 3.0 * es2 / 8.0 + three_es4 / 32.0 + j;
 
  254   c2 = 15.0 * es4 / 256.0 + j;
 
  255   c3 = 35.0 * es6 / 3072.0;
 
  256   lat = c0 * Tcea_Origin_Lat;
 
  257   sin2lat = TCEA_COEFF_TIMES_SIN(c1, 2.0, Tcea_Origin_Lat);
 
  258   sin4lat = TCEA_COEFF_TIMES_SIN(c2, 4.0, Tcea_Origin_Lat);
 
  259   sin6lat = TCEA_COEFF_TIMES_SIN(c3, 6.0, Tcea_Origin_Lat);
 
  260   M0 = TCEA_M(lat, sin2lat, sin4lat, sin6lat);
 
  264   temp = tempCoordinates->
easting();
 
  265   temp_northing = tempCoordinates->
northing();
 
  266   delete tempCoordinates;
 
  268   if (temp_northing > 0)
 
  270     Tcea_Min_Northing = temp_northing - 20003931.458986;
 
  271     Tcea_Max_Northing = temp_northing;
 
  273     if(Tcea_False_Northing)
 
  275       Tcea_Min_Northing -= Tcea_False_Northing;
 
  276       Tcea_Max_Northing -= Tcea_False_Northing;
 
  279   else if (temp_northing < 0)
 
  281     Tcea_Max_Northing = temp_northing + 20003931.458986;
 
  282     Tcea_Min_Northing = temp_northing;
 
  284     if(Tcea_False_Northing)
 
  286       Tcea_Min_Northing -= Tcea_False_Northing;
 
  287       Tcea_Max_Northing -= Tcea_False_Northing;
 
  304   One_MINUS_es2 = tcea.One_MINUS_es2; 
 
  305   One_OVER_2es = tcea.One_OVER_2es; 
 
  317   Tcea_Origin_Long = tcea.Tcea_Origin_Long; 
 
  318   Tcea_Origin_Lat = tcea.Tcea_Origin_Lat; 
 
  319   Tcea_False_Easting = tcea.Tcea_False_Easting; 
 
  320   Tcea_False_Northing = tcea.Tcea_False_Northing; 
 
  321   Tcea_Scale_Factor = tcea.Tcea_Scale_Factor; 
 
  322   Tcea_Min_Easting = tcea.Tcea_Min_Easting; 
 
  323   Tcea_Max_Easting = tcea.Tcea_Max_Easting; 
 
  324   Tcea_Min_Northing = tcea.Tcea_Min_Northing; 
 
  325   Tcea_Max_Northing = tcea.Tcea_Max_Northing; 
 
  346     One_MINUS_es2 = tcea.One_MINUS_es2; 
 
  347     One_OVER_2es = tcea.One_OVER_2es; 
 
  359     Tcea_Origin_Long = tcea.Tcea_Origin_Long; 
 
  360     Tcea_Origin_Lat = tcea.Tcea_Origin_Lat; 
 
  361     Tcea_False_Easting = tcea.Tcea_False_Easting; 
 
  362     Tcea_False_Northing = tcea.Tcea_False_Northing; 
 
  363     Tcea_Scale_Factor = tcea.Tcea_Scale_Factor; 
 
  364     Tcea_Min_Easting = tcea.Tcea_Min_Easting; 
 
  365     Tcea_Max_Easting = tcea.Tcea_Max_Easting; 
 
  366     Tcea_Min_Northing = tcea.Tcea_Min_Northing; 
 
  367     Tcea_Max_Northing = tcea.Tcea_Max_Northing; 
 
  416   double qq, qq_OVER_qp;
 
  418   double sin2betac, sin4betac, sin6betac;
 
  420   double phi, sin2phi, sin4phi, sin6phi;
 
  424   double longitude = geodeticCoordinates->
longitude();
 
  425   double latitude  = geodeticCoordinates->
latitude();
 
  426   double sin_lat   = sin(latitude);
 
  432   if ((longitude < -
PI) || (longitude > 
TWO_PI))
 
  437   dlam = longitude - Tcea_Origin_Long;
 
  441   if (fabs(dlam) >= (
PI / 2))
 
  462     qq = TCEA_Q(sin_lat, x);
 
  463     qq_OVER_qp = qq / qp;
 
  467   if (qq_OVER_qp > 1.0)
 
  469   else if (qq_OVER_qp < -1.0)
 
  472   beta = asin(qq_OVER_qp);
 
  473   betac = atan(tan(beta) / cos(dlam));
 
  479     sin2betac = TCEA_COEFF_TIMES_SIN(a0, 2.0, betac);
 
  480     sin4betac = TCEA_COEFF_TIMES_SIN(a1, 4.0, betac);
 
  481     sin6betac = TCEA_COEFF_TIMES_SIN(a2, 6.0, betac);
 
  482     PHIc = TCEA_L(betac, sin2betac, sin4betac, sin6betac);
 
  486   double easting = 
semiMajorAxis * cos(beta) * cos(PHIc) * sin(dlam) /
 
  487      (Tcea_Scale_Factor * cos(betac) * sqrt(1.0 - es2 *
 
  488         sinPHIc * sinPHIc)) + Tcea_False_Easting;
 
  491   sin2phi = TCEA_COEFF_TIMES_SIN(c1, 2.0, PHIc);
 
  492   sin4phi = TCEA_COEFF_TIMES_SIN(c2, 4.0, PHIc);
 
  493   sin6phi = TCEA_COEFF_TIMES_SIN(c3, 6.0, PHIc);
 
  494   Mc = TCEA_M(phi, sin2phi, sin4phi, sin6phi);
 
  496   double northing = Tcea_Scale_Factor * (Mc - M0) + Tcea_False_Northing;
 
  500      warning, easting, northing );
 
  526   double sin2mu, sin4mu, sin6mu, sin8mu;
 
  530   double beta, betac, beta_prime;
 
  531   double sin2beta, sin4beta, sin6beta;
 
  536   double easting  = mapProjectionCoordinates->
easting();
 
  537   double northing = mapProjectionCoordinates->
northing();
 
  539   if ((easting < (Tcea_False_Easting + Tcea_Min_Easting))
 
  540       || (easting > (Tcea_False_Easting + Tcea_Max_Easting)))
 
  544   if(   (northing < (Tcea_False_Northing + Tcea_Min_Northing))
 
  545      || (northing > (Tcea_False_Northing + Tcea_Max_Northing)))
 
  550   dy = northing - Tcea_False_Northing;
 
  551   dx = easting - Tcea_False_Easting;
 
  552   Mc = M0 + dy / Tcea_Scale_Factor;
 
  555   sin2mu = TCEA_COEFF_TIMES_SIN(b0, 2.0, MUc);
 
  556   sin4mu = TCEA_COEFF_TIMES_SIN(b1, 4.0, MUc);
 
  557   sin6mu = TCEA_COEFF_TIMES_SIN(b2, 6.0, MUc);
 
  558   sin8mu = TCEA_COEFF_TIMES_SIN(b3, 8.0, MUc);
 
  559   PHIc = MUc + sin2mu + sin4mu + sin6mu + sin8mu;
 
  563   Qc = TCEA_Q(sin_lat, x);
 
  564   Qc_OVER_qp = Qc / qp;
 
  566   if (Qc_OVER_qp < -1.0)
 
  568   else if (Qc_OVER_qp > 1.0)
 
  571   betac = asin(Qc_OVER_qp);
 
  572   cosbetac = cos(betac);
 
  573   temp = Tcea_Scale_Factor * dx * cosbetac * sqrt(1.0 -
 
  577   else if (temp < -1.0)
 
  579   beta_prime = -asin(temp);
 
  580   beta = asin(cos(beta_prime) * sin(betac));
 
  582   sin2beta = TCEA_COEFF_TIMES_SIN(a0, 2.0, beta);
 
  583   sin4beta = TCEA_COEFF_TIMES_SIN(a1, 4.0, beta);
 
  584   sin6beta = TCEA_COEFF_TIMES_SIN(a2, 6.0, beta);
 
  585   double latitude = TCEA_L(beta, sin2beta, sin4beta, sin6beta);
 
  587   double longitude = Tcea_Origin_Long - atan(tan(beta_prime) / cosbetac);
 
  601   else if (longitude < -
PI)
 
  609 double TransverseCylindricalEqualArea::TCEA_Q( 
double sinlat, 
double x )
 
  611   return One_MINUS_es2*(sinlat/(1.0-es2*sinlat*sinlat)-One_OVER_2es*log((1-x)/(1+x)));
 
  615 double TransverseCylindricalEqualArea::TCEA_COEFF_TIMES_SIN(
 
  616    double coeff, 
double x, 
double latit )         
 
  618   return coeff * sin(x*latit);
 
  622 double TransverseCylindricalEqualArea::TCEA_M(
 
  623    double c0lat, 
double c1lat, 
double c2lat, 
double c3lat )             
 
  629 double TransverseCylindricalEqualArea::TCEA_L(
 
  630    double Beta, 
double c0lat, 
double c1lat, 
double c2lat )              
 
  632   return Beta + c0lat + c1lat + c2lat;