107 using namespace MSP::CCS;
 
  114 #define PI           3.14159265358979323e0 
  115 #define PI_OVER_180  (3.14159265358979323e0 / 180.0) 
  116 #define MIN_LAT      ((-80.5 * PI) / 180.0)  
  117 #define MAX_LAT      (( 84.5 * PI) / 180.0)  
  118 #define MIN_EASTING   100000.0 
  119 #define MAX_EASTING   900000.0 
  120 #define MIN_NORTHING  0.0 
  121 #define MAX_NORTHING  10000000.0 
  123 #define EPSILON       1.75e-7    
  136   strcpy( ellipsCode, 
"WE" ); 
 
  137   double ellipsoidSemiMajorAxis = 6378137.0;
 
  138   double ellipsoidFlattening =  1 / 298.257223563;
 
  139   double inv_f = 1 / ellipsoidFlattening;
 
  145   double centralMeridian;
 
  146   double originLatitude = 0;
 
  147   double falseEasting   = 500000;
 
  148   double falseNorthing  = 0;
 
  149   double scale          = 0.9996;
 
  151   for(
int zone = 1; zone <= 60; zone++)
 
  154         centralMeridian = ((6 * zone - 183) * 
PI_OVER_180);
 
  156         centralMeridian = ((6 * zone + 177) * 
PI_OVER_180);
 
  160         falseEasting, falseNorthing, scale, ellipsCode);
 
  165    double ellipsoidSemiMajorAxis,
 
  166    double ellipsoidFlattening,
 
  183   strcpy( ellipsCode, ellipsoidCode ); 
 
  184   double inv_f = 1 / ellipsoidFlattening;
 
  186   if (ellipsoidSemiMajorAxis <= 0.0)
 
  190   if ((inv_f < 250) || (inv_f > 350))
 
  194   if ((
override < 0) || (
override > 60))
 
  202   UTM_Override = 
override;
 
  204   double centralMeridian;
 
  205   double originLatitude = 0;
 
  206   double falseEasting   = 500000;
 
  207   double falseNorthing  = 0;
 
  208   double scale          = 0.9996;
 
  210   for(
int zone = 1; zone <= 60; zone++)
 
  213         centralMeridian = ((6 * zone - 183) * 
PI_OVER_180);
 
  215         centralMeridian = ((6 * zone + 177) * 
PI_OVER_180);
 
  219         falseEasting, falseNorthing, scale, ellipsCode);
 
  227   std::map< int, TransverseMercator* > tempTransverseMercatorMap =
 
  228      u.transverseMercatorMap;
 
  229   std::map< int, TransverseMercator* >::iterator _iterator =
 
  230      tempTransverseMercatorMap.begin();
 
  231   while( _iterator != tempTransverseMercatorMap.end() && zone <= 60 )
 
  239   UTM_Override  = u.UTM_Override;
 
  245    while( transverseMercatorMap.begin() != transverseMercatorMap.end() )
 
  247       delete ( ( *transverseMercatorMap.begin() ).second );
 
  248       transverseMercatorMap.erase( transverseMercatorMap.begin() );
 
  258      std::map< int, TransverseMercator* > tempTransverseMercatorMap =
 
  259         u.transverseMercatorMap;
 
  260      std::map< int, TransverseMercator* >::iterator _iterator =
 
  261         tempTransverseMercatorMap.begin();
 
  262      while( _iterator != tempTransverseMercatorMap.end() && zone <= 60 )
 
  264         transverseMercatorMap[zone]->operator=( *_iterator->second );
 
  271      UTM_Override  = u.UTM_Override;
 
  296    int                            utmZoneOverride )
 
  317   double False_Northing = 0;
 
  319   double longitude = geodeticCoordinates->
longitude();
 
  320   double latitude  = geodeticCoordinates->
latitude();
 
  331   if((latitude > -1.0e-9) && (latitude < 0))
 
  337   Lat_Degrees = (long)(latitude * 180.0 / 
PI);
 
  338   Long_Degrees = (long)(longitude * 180.0 / 
PI);
 
  341     temp_zone = (long)(31 + (((longitude+1.0e-10) * 180.0 / 
PI) / 6.0));
 
  343     temp_zone = (long)((((longitude+1.0e-10) * 180.0 / 
PI) / 6.0) - 29);
 
  349   if( utmZoneOverride )
 
  351     if ((temp_zone == 1) && (utmZoneOverride == 60))
 
  352       temp_zone = utmZoneOverride;
 
  353     else if ((temp_zone == 60) && (utmZoneOverride == 1))
 
  354       temp_zone = utmZoneOverride;
 
  355     else if (((temp_zone-1) <= utmZoneOverride) &&
 
  356               (utmZoneOverride <= (temp_zone+1)))
 
  357       temp_zone = utmZoneOverride;
 
  361   else if( UTM_Override )
 
  363     if ((temp_zone == 1) && (UTM_Override == 60))
 
  364       temp_zone = UTM_Override;
 
  365     else if ((temp_zone == 60) && (UTM_Override == 1))
 
  366       temp_zone = UTM_Override;
 
  367     else if (((temp_zone-1) <= UTM_Override) &&
 
  368               (UTM_Override <= (temp_zone+1)))
 
  369       temp_zone = UTM_Override;
 
  376     if ((Lat_Degrees > 55) && (Lat_Degrees < 64) && (Long_Degrees > -1)
 
  377         && (Long_Degrees < 3))
 
  379     if ((Lat_Degrees > 55) && (Lat_Degrees < 64) && (Long_Degrees > 2)
 
  380         && (Long_Degrees < 12))
 
  382     if ((Lat_Degrees > 71) && (Long_Degrees > -1) && (Long_Degrees < 9))
 
  384     if ((Lat_Degrees > 71) && (Long_Degrees > 8) && (Long_Degrees < 21))
 
  386     if ((Lat_Degrees > 71) && (Long_Degrees > 20) && (Long_Degrees < 33))
 
  388     if ((Lat_Degrees > 71) && (Long_Degrees > 32) && (Long_Degrees < 42))
 
  396     False_Northing = 10000000;
 
  406   double easting = transverseMercatorCoordinates->
easting();
 
  407   double northing = transverseMercatorCoordinates->
northing() + False_Northing;
 
  411     delete transverseMercatorCoordinates;
 
  417     delete transverseMercatorCoordinates;
 
  421   delete transverseMercatorCoordinates;
 
  425      temp_zone, hemisphere, easting, northing );
 
  447   double False_Northing = 0;
 
  449   long zone       = utmCoordinates->
zone();
 
  450   char hemisphere = utmCoordinates->
hemisphere();
 
  451   double easting  = utmCoordinates->
easting();
 
  452   double northing = utmCoordinates->
northing();
 
  454   if ((zone < 1) || (zone > 60))
 
  456   if ((hemisphere != 
'S') && (hemisphere != 
'N'))
 
  465   if (hemisphere == 
'S')
 
  466     False_Northing = 10000000;
 
  474   double latitude = geodeticCoordinates->
latitude();
 
  478     delete geodeticCoordinates;
 
  482   return geodeticCoordinates;