106 using namespace MSP::CCS;
 
  114 const double PI = 3.14159265358979323e0;  
 
  121   return coeff * (sin (x * latit));
 
  130 Cassini::Cassini( 
double ellipsoidSemiMajorAxis, 
double ellipsoidFlattening, 
double centralMeridian, 
double originLatitude, 
double falseEasting, 
double falseNorthing ) :
 
  132   es2( 0.0066943799901413800 ),
 
  133   es4( 4.4814723452405e-005 ),
 
  134   es6( 3.0000678794350e-007 ),
 
  136   c0( .99832429845280 ),
 
  137   c1( .0025146070605187 ),
 
  138   c2( 2.6390465943377e-006 ),
 
  139   c3( 3.4180460865959e-009 ),
 
  140   One_Minus_es2( .99330562000986 ),
 
  141   a0( .0025188265843907 ),
 
  142   a1( 3.7009490356205e-006 ),
 
  143   a2( 7.4478137675038e-009 ),
 
  144   a3( 1.7035993238596e-011 ),
 
  145   Cass_Origin_Long( 0.0 ),
 
  146   Cass_Origin_Lat( 0.0 ),
 
  147   Cass_False_Easting( 0.0 ),
 
  148   Cass_False_Northing( 0.0 ),
 
  149   Cass_Min_Easting( -20037508.4 ),
 
  150   Cass_Max_Easting( 20037508.4 ),
 
  151   Cass_Min_Northing( -56575846.0 ),
 
  152   Cass_Max_Northing( 56575846.0 )
 
  173   double x, e1, e2, e3, e4;
 
  174   double lat, sin2lat, sin4lat, sin6lat;
 
  175   double inv_f = 1 / ellipsoidFlattening;
 
  177   if (ellipsoidSemiMajorAxis <= 0.0)
 
  181   if ((inv_f < 250) || (inv_f > 350))
 
  189   if ((centralMeridian < -
PI) || (centralMeridian > 
TWO_PI))
 
  197   Cass_Origin_Lat = originLatitude;
 
  198   if (centralMeridian > 
PI)
 
  199     centralMeridian -= 
TWO_PI;
 
  200   Cass_Origin_Long = centralMeridian;
 
  201   Cass_False_Northing = falseNorthing;
 
  202   Cass_False_Easting = falseEasting;
 
  206   j = 45.0 * es6 / 1024.0;
 
  207   three_es4 = 3.0 * es4;
 
  208   c0 = 1 - es2 / 4.0 - three_es4 / 64.0 - 5.0 * es6 / 256.0;
 
  209   c1 = 3.0 * es2 /8.0 + three_es4 / 32.0 + j;
 
  210   c2 = 15.0 * es4 / 256.0 + j;
 
  211   c3 = 35.0 * es6 / 3072.0;
 
  212   lat = c0 * Cass_Origin_Lat;
 
  216   M0 = cassM( lat, sin2lat, sin4lat, sin6lat );
 
  218   One_Minus_es2 = 1.0 - es2;
 
  219   x = sqrt (One_Minus_es2);
 
  220   e1 = (1 - x) / (1 + x);
 
  224   a0 = 3.0 * e1 / 2.0 - 27.0 * e3 / 32.0;
 
  225   a1 = 21.0 * e2 / 16.0 - 55.0 * e4 / 32.0;
 
  226   a2 = 151.0 * e3 / 96.0;
 
  227   a3 = 1097.0 * e4 /512.0;
 
  229   if (Cass_Origin_Long > 0)
 
  233     Cass_Max_Northing = tempCoordinates->
northing();
 
  234     delete tempCoordinates;
 
  238     Cass_Min_Northing = tempCoordinates->
northing();
 
  239     delete tempCoordinates;
 
  241     Cass_Max_Easting = 19926188.9;
 
  242     Cass_Min_Easting = -20037508.4;
 
  244   else if (Cass_Origin_Long < 0)
 
  248     Cass_Max_Northing = tempCoordinates->
northing();
 
  249     delete tempCoordinates;
 
  253     Cass_Min_Northing = tempCoordinates->
northing();
 
  254     delete tempCoordinates;
 
  256     Cass_Max_Easting = 20037508.4;
 
  257     Cass_Min_Easting = -19926188.9;
 
  263     Cass_Max_Northing = tempCoordinates->
northing();
 
  264     delete tempCoordinates;
 
  268     Cass_Min_Northing = tempCoordinates->
northing();
 
  269     delete tempCoordinates;
 
  271     Cass_Max_Easting = 20037508.4;
 
  272     Cass_Min_Easting = -20037508.4;
 
  275   if(Cass_False_Northing)
 
  277     Cass_Min_Northing -= Cass_False_Northing;
 
  278     Cass_Max_Northing -= Cass_False_Northing;
 
  295   One_Minus_es2 = c.One_Minus_es2;
 
  300   Cass_Origin_Long = c.Cass_Origin_Long;
 
  301   Cass_Origin_Lat = c.Cass_Origin_Lat;
 
  302   Cass_False_Easting = c.Cass_False_Easting;
 
  303   Cass_False_Northing = c.Cass_False_Northing;
 
  304   Cass_Min_Easting = c.Cass_Min_Easting;
 
  305   Cass_Max_Easting = c.Cass_Max_Easting;
 
  306   Cass_Min_Northing = c.Cass_Min_Northing;
 
  307   Cass_Max_Northing = c.Cass_Max_Northing;
 
  330     One_Minus_es2 = c.One_Minus_es2;
 
  335     Cass_Origin_Long = c.Cass_Origin_Long;
 
  336     Cass_Origin_Lat = c.Cass_Origin_Lat;
 
  337     Cass_False_Easting = c.Cass_False_Easting;
 
  338     Cass_False_Northing = c.Cass_False_Northing;
 
  339     Cass_Min_Easting = c.Cass_Min_Easting;
 
  340     Cass_Max_Easting = c.Cass_Max_Easting;
 
  341     Cass_Min_Northing = c.Cass_Min_Northing;
 
  342     Cass_Max_Northing = c.Cass_Max_Northing;
 
  386   double lat, sin2lat, sin4lat, sin6lat;
 
  391   double AA, A2, A3, A4, A5;
 
  395   double longitude = geodeticCoordinates->
longitude();
 
  396   double latitude  = geodeticCoordinates->
latitude();
 
  397   double tlat = tan(latitude);
 
  398   double clat = cos(latitude);
 
  399   double slat = sin(latitude);
 
  405   if ((longitude < -
PI) || (longitude > 
TWO_PI))
 
  410   dlam = longitude - Cass_Origin_Long;
 
  414   if (fabs(dlam) > (4.0 * 
PI / 180))
 
  435   CC = es2 * clat * clat / One_Minus_es2;
 
  440   MM = cassM( lat, sin2lat, sin4lat, sin6lat );
 
  442   double easting = NN * (AA - (TT * A3 / 6.0) - (8.0 - TT + 8.0 * CC) *
 
  443                    (TT * A5 / 120.0)) + Cass_False_Easting;
 
  444   double northing = MM - M0 + NN * tlat * ((A2 / 2.0) + (5.0 - TT +
 
  445                     6.0 * CC) * A4 / 24.0) + Cass_False_Northing;
 
  471   double sin2mu, sin4mu, sin6mu, sin8mu;
 
  474   double tanphi1, sinphi1, cosphi1;
 
  478   double DD, D2, D3, D4, D5;
 
  479   const double epsilon = 1.0e-1;
 
  480   double longitude, latitude;
 
  482   double easting  = mapProjectionCoordinates->
easting();
 
  483   double northing = mapProjectionCoordinates->
northing();
 
  485   if ((easting < (Cass_False_Easting + Cass_Min_Easting))
 
  486       || (easting > (Cass_False_Easting + Cass_Max_Easting)))
 
  490   if ((northing < (Cass_False_Northing + Cass_Min_Northing - epsilon))
 
  491       || (northing > (Cass_False_Northing + Cass_Max_Northing + epsilon)))
 
  496   dy = northing - Cass_False_Northing;
 
  497   dx = easting - Cass_False_Easting;
 
  505   phi1 = mu1 + sin2mu + sin4mu + sin6mu + sin8mu;
 
  510     longitude = Cass_Origin_Long;
 
  512   else if (floatEq(phi1,-
PI_OVER_2,.00001))
 
  515     longitude = Cass_Origin_Long;
 
  522     T1 = tanphi1 * tanphi1;
 
  523     RD = cassRd( sinphi1 );
 
  525     R1 = N1 * One_Minus_es2 / (RD * RD);
 
  531     T = (1.0 + 3.0 * T1);
 
  532     latitude = phi1 - (N1 * tanphi1 / R1) * (D2 / 2.0 - T * D4 / 24.0);
 
  534     longitude = Cass_Origin_Long + (DD - T1 * D3 / 3.0 + T * T1 * D5 / 15.0) / cosphi1;
 
  548     else if (longitude < -
PI)
 
  554   if (fabs(longitude - Cass_Origin_Long) > (4.0 * 
PI / 180))
 
  564 double Cassini::cassM(
 
  565    double c0lat, 
double c1s2lat, 
double c2s4lat, 
double c3s6lat )
 
  571 double Cassini::cassRd( 
double sinlat )
 
  573   return sqrt(1.0 - es2 * (sinlat * sinlat));
 
  577 double Cassini::floatEq( 
double x, 
double v, 
double epsilon )
 
  579   return ((v - epsilon) < x) && (x < (v + epsilon));