104 using namespace MSP::CCS;
 
  111 const double PI = 3.14159265358979323e0;  
 
  122    double ellipsoidSemiMajorAxis,
 
  123    double ellipsoidFlattening,
 
  124    double centralMeridian,
 
  125    double originLatitude,
 
  127    double falseNorthing ) :
 
  129   Ra( 6371007.1810824 ),
 
  130   Sin_Gnom_Origin_Lat( 0.0 ),
 
  131   Cos_Gnom_Origin_Lat( 1.0 ),
 
  132   Gnom_Origin_Long( 0.0 ),
 
  133   Gnom_Origin_Lat( 0.0 ),
 
  134   Gnom_False_Easting( 0.0 ),
 
  135   Gnom_False_Northing( 0.0 ),
 
  136   abs_Gnom_Origin_Lat( 0.0 ),
 
  137   Gnom_Delta_Northing( 40000000 ),
 
  138   Gnom_Delta_Easting( 40000000 )
 
  158   double es2, es4, es6;
 
  159   double inv_f = 1 / ellipsoidFlattening;
 
  161   if (ellipsoidSemiMajorAxis <= 0.0)
 
  165   if ((inv_f < 250) || (inv_f > 350))
 
  173   if ((centralMeridian < -
PI) || (centralMeridian > 
TWO_PI))
 
  186      (1.0 - es2 / 6.0 - 17.0 * es4 / 360.0 - 67.0 * es6 / 3024.0);
 
  187   Gnom_Origin_Lat = originLatitude;
 
  188   Sin_Gnom_Origin_Lat = sin(Gnom_Origin_Lat);
 
  189   Cos_Gnom_Origin_Lat = cos(Gnom_Origin_Lat);
 
  190   abs_Gnom_Origin_Lat = fabs(Gnom_Origin_Lat);
 
  191   if (centralMeridian > 
PI)
 
  192     centralMeridian -= 
TWO_PI;
 
  193   Gnom_Origin_Long = centralMeridian;
 
  194   Gnom_False_Northing = falseNorthing;
 
  195   Gnom_False_Easting = falseEasting;
 
  204   Sin_Gnom_Origin_Lat = g.Sin_Gnom_Origin_Lat;
 
  205   Cos_Gnom_Origin_Lat = g.Cos_Gnom_Origin_Lat;
 
  206   Gnom_Origin_Long    = g.Gnom_Origin_Long;
 
  207   Gnom_Origin_Lat     = g.Gnom_Origin_Lat;
 
  208   Gnom_False_Easting  = g.Gnom_False_Easting;
 
  209   Gnom_False_Northing = g.Gnom_False_Northing;
 
  210   abs_Gnom_Origin_Lat = g.abs_Gnom_Origin_Lat;
 
  211   Gnom_Delta_Northing = g.Gnom_Delta_Northing;
 
  212   Gnom_Delta_Easting  = g.Gnom_Delta_Easting;
 
  228     Sin_Gnom_Origin_Lat = g.Sin_Gnom_Origin_Lat;
 
  229     Cos_Gnom_Origin_Lat = g.Cos_Gnom_Origin_Lat;
 
  230     Gnom_Origin_Long    = g.Gnom_Origin_Long;
 
  231     Gnom_Origin_Lat     = g.Gnom_Origin_Lat;
 
  232     Gnom_False_Easting  = g.Gnom_False_Easting;
 
  233     Gnom_False_Northing = g.Gnom_False_Northing;
 
  234     abs_Gnom_Origin_Lat = g.abs_Gnom_Origin_Lat;
 
  235     Gnom_Delta_Northing = g.Gnom_Delta_Northing;
 
  236     Gnom_Delta_Easting  = g.Gnom_Delta_Easting;
 
  263      Gnom_False_Easting, Gnom_False_Northing );
 
  288   double sin_dlam, cos_dlam;
 
  289   double temp_Easting, temp_Northing;
 
  290   double easting, northing;
 
  292   double longitude = geodeticCoordinates->
longitude();
 
  293   double latitude  = geodeticCoordinates->
latitude();
 
  294   double slat = sin(latitude);
 
  295   double clat = cos(latitude);
 
  301   if ((longitude < -
PI) || (longitude > 
TWO_PI))
 
  305   dlam = longitude - Gnom_Origin_Long;
 
  306   sin_dlam = sin(dlam);
 
  307   cos_dlam = cos(dlam);
 
  308   cos_c = Sin_Gnom_Origin_Lat * slat + Cos_Gnom_Origin_Lat * clat * cos_dlam;
 
  309   if (cos_c <= 1.0e-10)
 
  324   if (fabs(abs_Gnom_Origin_Lat - 
PI_OVER_2) < 1.0e-10)
 
  326     Ra_cotlat = Ra * (clat / slat);
 
  327     temp_Easting = Ra_cotlat * sin_dlam;
 
  328     temp_Northing = Ra_cotlat * cos_dlam;
 
  329     if (Gnom_Origin_Lat >= 0.0)
 
  331       easting  = temp_Easting + Gnom_False_Easting;
 
  332       northing = -1.0 * temp_Northing + Gnom_False_Northing;
 
  336       easting  = -1.0 * temp_Easting + Gnom_False_Easting;
 
  337       northing = -1.0 * temp_Northing + Gnom_False_Northing;
 
  340   else if (abs_Gnom_Origin_Lat <= 1.0e-10)
 
  342     easting  = Ra * tan(dlam) + Gnom_False_Easting;
 
  343     northing = Ra * tan(latitude) / cos_dlam + Gnom_False_Northing;
 
  348     Ra_kprime = Ra * k_prime;
 
  349     easting  = Ra_kprime * clat * sin_dlam + Gnom_False_Easting;
 
  350     northing = Ra_kprime * 
 
  351        (Cos_Gnom_Origin_Lat * slat - Sin_Gnom_Origin_Lat * clat * cos_dlam)
 
  352        + Gnom_False_Northing;
 
  381   double longitude, latitude;
 
  383   double easting  = mapProjectionCoordinates->
easting();
 
  384   double northing = mapProjectionCoordinates->
northing();
 
  386   if ((easting < (Gnom_False_Easting - Gnom_Delta_Easting)) 
 
  387       || (easting > (Gnom_False_Easting + Gnom_Delta_Easting)))
 
  391   if ((northing < (Gnom_False_Northing - Gnom_Delta_Northing)) 
 
  392       || (northing > (Gnom_False_Northing + Gnom_Delta_Northing)))
 
  397   dy = northing - Gnom_False_Northing;
 
  398   dx = easting - Gnom_False_Easting;
 
  399   rho = sqrt(dx * dx + dy * dy);
 
  400   if (fabs(rho) <= 1.0e-10)
 
  402     latitude  = Gnom_Origin_Lat;
 
  403     longitude = Gnom_Origin_Long;
 
  410     dy_sinc = dy * sin_c;
 
  411     latitude = asin((cos_c * Sin_Gnom_Origin_Lat)
 
  412        + ((dy_sinc * Cos_Gnom_Origin_Lat) / rho));
 
  414     if (fabs(abs_Gnom_Origin_Lat - 
PI_OVER_2) < 1.0e-10)
 
  416       if (Gnom_Origin_Lat >= 0.0)
 
  417         longitude = Gnom_Origin_Long + atan2(dx, -dy);
 
  419         longitude = Gnom_Origin_Long + atan2(dx, dy);
 
  422       longitude = Gnom_Origin_Long
 
  423          + atan2((dx * sin_c),
 
  424             (rho * Cos_Gnom_Origin_Lat * cos_c - dy_sinc *Sin_Gnom_Origin_Lat));
 
  436   else if (longitude < -
PI)