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;