112 using namespace MSP::CCS;
 
  120 const double PI = 3.14159265358979323e0;       
 
  124 const double ONE = (1.0 * 
PI / 180.0);         
 
  132 Stereographic::Stereographic( 
double ellipsoidSemiMajorAxis, 
double ellipsoidFlattening, 
double centralMeridian, 
double originLatitude, 
double falseEasting, 
double falseNorthing ) :
 
  133   Stereo_Ra( 6371007.1810824 ),             
 
  134   Two_Stereo_Ra( 12742014.3621648 ),        
 
  136   Stereo_Origin_Long( 0.0 ),                
 
  137   Stereo_Origin_Lat( 0.0 ),                 
 
  138   Stereo_False_Easting( 0.0 ),              
 
  139   Stereo_False_Northing( 0.0 ),             
 
  140   Sin_Stereo_Origin_Lat( 0.0 ),            
 
  141   Cos_Stereo_Origin_Lat( 1.0 ),             
 
  142   Stereo_Delta_Easting( 1460090226.0 ),
 
  143   Stereo_Delta_Northing( 1460090226.0 )
 
  161   double es2, es4, es6;
 
  163   double inv_f = 1 / ellipsoidFlattening;
 
  165   if (ellipsoidSemiMajorAxis <= 0.0)
 
  169   if ((inv_f < 250) || (inv_f > 350))
 
  177   if ((centralMeridian < -
PI) || (centralMeridian > 
TWO_PI))
 
  189      (1.0 - es2 / 6.0 - 17.0 * es4 / 360.0 - 67.0 * es6 /3024.0);
 
  190   Two_Stereo_Ra = 2.0 * Stereo_Ra;
 
  191   Stereo_Origin_Lat = originLatitude;
 
  192   Sin_Stereo_Origin_Lat = sin(Stereo_Origin_Lat);
 
  193   Cos_Stereo_Origin_Lat = cos(Stereo_Origin_Lat);
 
  194   if (centralMeridian > 
PI)
 
  195     centralMeridian -= 
TWO_PI;
 
  196   Stereo_Origin_Long = centralMeridian;
 
  197   Stereo_False_Easting = falseEasting;
 
  198   Stereo_False_Northing = falseNorthing;
 
  199   if(fabs(fabs(Stereo_Origin_Lat) - 
PI_OVER_2) < 1.0e-10)
 
  204   if ((Stereo_At_Pole) || (fabs(Stereo_Origin_Lat) < 1.0e-10))
 
  206     Stereo_Delta_Easting = 1460090226.0;
 
  211     if (Stereo_Origin_Long <= 0)
 
  221     Stereo_Delta_Easting = tempCoordinates->
easting();
 
  222     delete tempCoordinates;
 
  224     if(Stereo_False_Easting)
 
  225       Stereo_Delta_Easting -= Stereo_False_Easting;
 
  226     if (Stereo_Delta_Easting < 0)
 
  227       Stereo_Delta_Easting = -Stereo_Delta_Easting;
 
  236   Stereo_Ra = s.Stereo_Ra;     
 
  237   Two_Stereo_Ra = s.Two_Stereo_Ra; 
 
  238   Stereo_At_Pole = s.Stereo_At_Pole; 
 
  239   Stereo_Origin_Long = s.Stereo_Origin_Long; 
 
  240   Stereo_Origin_Lat = s.Stereo_Origin_Lat; 
 
  241   Stereo_False_Easting = s.Stereo_False_Easting; 
 
  242   Stereo_False_Northing = s.Stereo_False_Northing; 
 
  243   Sin_Stereo_Origin_Lat = s.Sin_Stereo_Origin_Lat; 
 
  244   Cos_Stereo_Origin_Lat = s.Cos_Stereo_Origin_Lat; 
 
  245   Stereo_Delta_Easting = s.Stereo_Delta_Easting; 
 
  246   Stereo_Delta_Northing = s.Stereo_Delta_Northing; 
 
  261     Stereo_Ra = s.Stereo_Ra;     
 
  262     Two_Stereo_Ra = s.Two_Stereo_Ra; 
 
  263     Stereo_At_Pole = s.Stereo_At_Pole; 
 
  264     Stereo_Origin_Long = s.Stereo_Origin_Long; 
 
  265     Stereo_Origin_Lat = s.Stereo_Origin_Lat; 
 
  266     Stereo_False_Easting = s.Stereo_False_Easting; 
 
  267     Stereo_False_Northing = s.Stereo_False_Northing; 
 
  268     Sin_Stereo_Origin_Lat = s.Sin_Stereo_Origin_Lat; 
 
  269     Cos_Stereo_Origin_Lat = s.Cos_Stereo_Origin_Lat; 
 
  270     Stereo_Delta_Easting = s.Stereo_Delta_Easting; 
 
  271     Stereo_Delta_Northing = s.Stereo_Delta_Northing; 
 
  320   double easting, northing;
 
  322   double longitude = geodeticCoordinates->
longitude();
 
  323   double latitude = geodeticCoordinates->
latitude();
 
  324   double slat = sin(latitude);
 
  325   double clat = cos(latitude);
 
  331   if ((longitude < -
PI) || (longitude > 
TWO_PI))
 
  336   dlam = longitude - Stereo_Origin_Long;
 
  346   cos_dlam = cos(dlam);
 
  347   g = 1.0 + Sin_Stereo_Origin_Lat * slat + Cos_Stereo_Origin_Lat * clat * cos_dlam;
 
  348   if (fabs(g) <= 1.0e-10)
 
  357       if (fabs(fabs(latitude) - 
PI_OVER_2) < 1.0e-10)
 
  359         easting = Stereo_False_Easting;
 
  360         northing = Stereo_False_Northing;
 
  364         if (Stereo_Origin_Lat > 0)
 
  366           num = Two_Stereo_Ra * tan(
PI_OVER_4 - latitude / 2.0);
 
  367           easting = Stereo_False_Easting + num * sin(dlam);
 
  368           northing = Stereo_False_Northing + (-num * cos_dlam);
 
  372           num = Two_Stereo_Ra * tan(
PI_OVER_4 + latitude / 2.0);
 
  373           easting = Stereo_False_Easting + num * sin(dlam);
 
  374           northing = Stereo_False_Northing + num * cos_dlam;
 
  380       if (fabs(Stereo_Origin_Lat) <= 1.0e-10)
 
  382         k = 2.0 / (1.0 + clat * cos_dlam);
 
  383         Ra_k = Stereo_Ra * k;
 
  384         northing = Stereo_False_Northing + Ra_k * slat;
 
  389         Ra_k = Stereo_Ra * k;
 
  390         northing = Stereo_False_Northing + Ra_k * (Cos_Stereo_Origin_Lat * slat - Sin_Stereo_Origin_Lat * clat * cos_dlam);
 
  392       easting = Stereo_False_Easting + Ra_k * clat * sin(dlam);
 
  419   double longitude, latitude;
 
  421   double easting = mapProjectionCoordinates->
easting();
 
  422   double northing = mapProjectionCoordinates->
northing();
 
  424   if ((easting < (Stereo_False_Easting - Stereo_Delta_Easting))
 
  425       ||(easting > (Stereo_False_Easting + Stereo_Delta_Easting)))
 
  429   if ((northing < (Stereo_False_Northing - Stereo_Delta_Northing))
 
  430       || (northing > (Stereo_False_Northing + Stereo_Delta_Northing)))
 
  435   dy = northing - Stereo_False_Northing;
 
  436   dx = easting - Stereo_False_Easting;
 
  437   rho = sqrt(dx * dx + dy * dy);
 
  438   if (fabs(rho) <= 1.0e-10)
 
  440     latitude  = Stereo_Origin_Lat;
 
  441     longitude = Stereo_Origin_Long;
 
  445     c = 2.0 * atan(rho / (Two_Stereo_Ra));
 
  448     dy_sin_c = dy * sin_c;
 
  451       if (Stereo_Origin_Lat > 0)
 
  452         longitude = Stereo_Origin_Long + atan2(dx, -dy);
 
  454         longitude = Stereo_Origin_Long + atan2(dx, dy);
 
  457       longitude = Stereo_Origin_Long + atan2(dx * sin_c, (rho * Cos_Stereo_Origin_Lat * cos_c - dy_sin_c * Sin_Stereo_Origin_Lat));
 
  458     latitude = asin(cos_c * Sin_Stereo_Origin_Lat + ((dy_sin_c * Cos_Stereo_Origin_Lat) / rho));
 
  461   if (fabs(latitude) < 2.2e-8)  
 
  470     if (longitude - 
PI < 3.5e-6)
 
  477     if (fabs(longitude + 
PI) < 3.5e-6)
 
  483   if (fabs(longitude) < 2.0e-7)  
 
  487   else if (longitude < -
PI)