106 using namespace MSP::CCS;
 
  114 const double PI = 3.14159265358979323e0;       
 
  122   return coeff * (sin (x * latit));
 
  131 Polyconic::Polyconic( 
double ellipsoidSemiMajorAxis, 
double ellipsoidFlattening, 
double centralMeridian, 
double originLatitude, 
double falseEasting, 
double falseNorthing ) :
 
  133   es2( 0.0066943799901413800 ),
 
  134   es4( 4.4814723452405e-005 ),
 
  135   es6( 3.0000678794350e-007 ),
 
  137   c0( .99832429845280 ),
 
  138   c1( .0025146070605187 ),
 
  139   c2( 2.6390465943377e-006 ),
 
  140   c3( 3.4180460865959e-009 ),
 
  141   Poly_Origin_Long( 0.0 ),
 
  142   Poly_Origin_Lat( 0.0 ),
 
  143   Poly_False_Easting( 0.0 ),                
 
  144   Poly_False_Northing( 0.0 ),
 
  145   Poly_Max_Easting( 20037509.0 ),
 
  146   Poly_Max_Northing( 15348215.0 ),
 
  147   Poly_Min_Easting( -20037509.0 ),
 
  148   Poly_Min_Northing( -15348215.0 )
 
  169   double lat, sin2lat, sin4lat, sin6lat;
 
  170   double inv_f = 1 / ellipsoidFlattening;
 
  172   if (ellipsoidSemiMajorAxis <= 0.0)
 
  176   if ((inv_f < 250) || (inv_f > 350))
 
  184   if ((centralMeridian < -
PI) || (centralMeridian > 
TWO_PI))
 
  192   Poly_Origin_Lat = originLatitude;
 
  193   if (centralMeridian > 
PI)
 
  194     centralMeridian -= 
TWO_PI;
 
  195   Poly_Origin_Long = centralMeridian;
 
  196   Poly_False_Northing = falseNorthing;
 
  197   Poly_False_Easting = falseEasting;
 
  202   j = 45.0 * es6 / 1024.0;
 
  203   three_es4 = 3.0 * es4;
 
  204   c0 = 1.0 - es2 / 4.0 - three_es4 / 64.0 - 5.0 * es6 / 256.0;
 
  205   c1 = 3.0 * es2 / 8.0 + three_es4 / 32.0 + j;
 
  206   c2 = 15.0 * es4 / 256.0 + j;
 
  207   c3 = 35.0 * es6 / 3072.0;
 
  209   lat = c0 * Poly_Origin_Lat;
 
  213   M0 = polyM(lat, sin2lat, sin4lat, sin6lat);
 
  215   if (Poly_Origin_Long > 0)
 
  219     Poly_Max_Northing = tempCoordinates->
northing();
 
  220     delete tempCoordinates;
 
  224     Poly_Min_Northing = tempCoordinates->
northing();
 
  225     delete tempCoordinates;
 
  227     Poly_Max_Easting = 19926189.0;
 
  228     Poly_Min_Easting = -20037509.0;
 
  230   else if (Poly_Origin_Long < 0)
 
  234     Poly_Max_Northing = tempCoordinates->
northing();
 
  235     delete tempCoordinates;
 
  239     Poly_Min_Northing = tempCoordinates->
northing();
 
  240     delete tempCoordinates;
 
  242     Poly_Max_Easting = 20037509.0;
 
  243     Poly_Min_Easting = -19926189.0;
 
  249     Poly_Max_Northing = tempCoordinates->
northing();
 
  250     delete tempCoordinates;
 
  254     delete tempCoordinates;
 
  256     Poly_Max_Easting = 20037509.0;
 
  257     Poly_Min_Easting = -20037509.0;
 
  260   if(Poly_False_Northing)
 
  262     Poly_Max_Northing -= Poly_False_Northing;
 
  263     Poly_Min_Northing -= Poly_False_Northing;
 
  280   Poly_Origin_Long = p.Poly_Origin_Long; 
 
  281   Poly_Origin_Lat = p.Poly_Origin_Lat; 
 
  282   Poly_False_Easting = p.Poly_False_Easting; 
 
  283   Poly_False_Northing = p.Poly_False_Northing; 
 
  284   Poly_Max_Easting = p.Poly_Max_Easting; 
 
  285   Poly_Max_Northing = p.Poly_Max_Northing; 
 
  286   Poly_Min_Easting = p.Poly_Min_Easting; 
 
  287   Poly_Min_Northing = p.Poly_Min_Northing; 
 
  310     Poly_Origin_Long = p.Poly_Origin_Long; 
 
  311     Poly_Origin_Lat = p.Poly_Origin_Lat; 
 
  312     Poly_False_Easting = p.Poly_False_Easting; 
 
  313     Poly_False_Northing = p.Poly_False_Northing; 
 
  314     Poly_Max_Easting = p.Poly_Max_Easting; 
 
  315     Poly_Max_Northing = p.Poly_Max_Northing; 
 
  316     Poly_Min_Easting = p.Poly_Min_Easting; 
 
  317     Poly_Min_Northing = p.Poly_Min_Northing; 
 
  362   double lat, sin2lat, sin4lat, sin6lat;
 
  368   double easting, northing;
 
  370   double longitude = geodeticCoordinates->
longitude();
 
  371   double latitude = geodeticCoordinates->
latitude();
 
  372   double slat = sin(latitude);
 
  378   if ((longitude < -
PI) || (longitude > 
TWO_PI))
 
  385   dlam = longitude - Poly_Origin_Long;
 
  386   if (fabs(dlam) > (
PI / 2))
 
  401     northing = -M0 + Poly_False_Northing;
 
  406     NN_OVER_tlat = NN  / tan(latitude);
 
  411     MM = polyM(lat, sin2lat, sin4lat, sin6lat);
 
  413     easting = NN_OVER_tlat * sin(EE) + Poly_False_Easting;
 
  414     northing = MM - M0 + NN_OVER_tlat * (1.0 - cos(EE)) +
 
  440   double dx_OVER_Poly_a;
 
  444   double PHIn, Delta_PHI = 1.0;
 
  446   double PHI, sin2PHI,sin4PHI, sin6PHI;
 
  447   double Mn, Mn_prime, Ma;
 
  451   double tolerance = 1.0e-12;        
 
  453   double longitude, latitude;
 
  456   double easting = mapProjectionCoordinates->
easting();
 
  457   double northing = mapProjectionCoordinates->
northing();
 
  459   if ((easting < (Poly_False_Easting + Poly_Min_Easting))
 
  460       || (easting > (Poly_False_Easting + Poly_Max_Easting)))
 
  464   if ((northing < (Poly_False_Northing + Poly_Min_Northing))
 
  465       || (northing > (Poly_False_Northing + Poly_Max_Northing)))
 
  470   dy = northing - Poly_False_Northing;
 
  471   dx = easting - Poly_False_Easting;
 
  473   if (floatEq(dy,-M0,1))
 
  476     longitude = dx_OVER_Poly_a + Poly_Origin_Long;
 
  481     BB = dx_OVER_Poly_a * dx_OVER_Poly_a + (AA * AA);
 
  484     while (fabs(Delta_PHI) > tolerance && count)
 
  486       sin_PHIn = sin(PHIn);
 
  487       CC = sqrt(1.0 - es2 * sin_PHIn * sin_PHIn) * tan(PHIn);
 
  492       Mn = polyM(PHI, sin2PHI, sin4PHI, sin6PHI);
 
  493       Mn_prime = c0 - 2.0 * c1 * cos(2.0 * PHIn) + 4.0 * c2 * cos(4.0 * PHIn) -
 
  494                  6.0 * c3 * cos(6.0 * PHIn);
 
  497       Ma2_PLUS_BB = Ma * Ma + BB;
 
  498       AA_MINUS_Ma = AA - Ma;
 
  499       Delta_PHI = (AA_Ma * CC + AA_MINUS_Ma - 0.5 * (Ma2_PLUS_BB) * CC) /
 
  500                   (es2 * sin2PHI * (Ma2_PLUS_BB - 2.0 * AA_Ma) /
 
  501                    4.0 * CC + (AA_MINUS_Ma) * (CC * Mn_prime - 2.0 / sin2PHI) - Mn_prime);
 
  516     if (floatEq(fabs(latitude),
PI_OVER_2,.00001) || (latitude == 0))
 
  517       longitude = Poly_Origin_Long;
 
  521       longitude = (asin(dx_OVER_Poly_a * CC)) / sin(latitude) +
 
  532   else if (longitude < -
PI)
 
  539 double Polyconic::polyM( 
double c0lat, 
double c1s2lat, 
double c2s4lat, 
double c3s6lat )
 
  541   return semiMajorAxis * (c0lat - c1s2lat + c2s4lat - c3s6lat);
 
  545 double Polyconic::floatEq( 
double x, 
double v, 
double epsilon )
 
  547   return ((v - epsilon) < x) && (x < (v + epsilon));