171 using namespace MSP::CCS;
181 const double PI = 3.14159265358979323e0;
213 const double sourceLongitude,
214 const double sourceLatitude,
215 const double sourceHeight )
258 if (sourceLongitude >
PI)
259 tLon_in = sourceLongitude -
TWO_PI;
261 tLon_in = sourceLongitude;
265 sin_Lat = sin(sourceLatitude);
266 cos_Lat = cos(sourceLatitude);
267 sin_Lon = sin(tLon_in);
268 cos_Lon = cos(tLon_in);
269 sin2_Lat = sin_Lat * sin_Lat;
270 w2 = 1.0 - e2 * sin2_Lat;
273 m = (a * (1.0 - e2)) / w3;
275 dp1 = cos_Lat * dz - sin_Lat * cos_Lon * dx - sin_Lat * sin_Lon * dy;
276 dp2 = ((e2 * sin_Lat * cos_Lat) / w) * da;
277 dp3 = sin_Lat * cos_Lat * (2.0 * n + ep2 * m * sin2_Lat) * (1.0 - f) * df;
278 dp = (dp1 + dp2 + dp3) / (m + sourceHeight);
279 dl = (-sin_Lon * dx + cos_Lon * dy) / ((n + sourceHeight) * cos_Lat);
280 dh1 = (cos_Lat * cos_Lon * dx) + (cos_Lat * sin_Lon * dy) + (sin_Lat * dz);
281 dh2 = -(w * da) + ((a * (1 - f)) / w) * sin2_Lat * df;
284 double targetLatitude = sourceLatitude + dp;
285 double targetLongitude = sourceLongitude + dl;
286 double targetHeight = sourceHeight + dh;
288 if (targetLongitude > TWO_PI)
289 targetLongitude -=
TWO_PI;
290 if (targetLongitude < (-
PI))
291 targetLongitude += TWO_PI;
317 DatumLibraryImplementation::deleteInstance();
327 int DatumLibraryImplementation::instanceCount = 0;
349 if( --instanceCount < 1 )
356 void DatumLibraryImplementation::deleteInstance()
371 _ellipsoidLibraryImplementation( 0 ),
372 datum3ParamCount( 0 ),
373 datum7ParamCount( 0 )
382 int size = dl.datumList.size();
383 for(
int i = 0; i < size; i++ )
385 switch( dl.datumList[i]->datumType() )
397 datumList.push_back(
new Datum( *( dl.datumList[i] ) ) );
402 _ellipsoidLibraryImplementation = dl._ellipsoidLibraryImplementation;
403 datum3ParamCount = dl.datum3ParamCount;
404 datum7ParamCount = dl.datum7ParamCount;
410 std::vector<Datum*>::iterator iter = datumList.begin();
411 while( iter != datumList.end() )
418 _ellipsoidLibraryImplementation = 0;
428 int size = dl.datumList.size();
429 for(
int i = 0; i < size; i++ )
431 switch( dl.datumList[i]->datumType() )
443 datumList.push_back(
new Datum( *( dl.datumList[i] ) ) );
448 _ellipsoidLibraryImplementation = dl._ellipsoidLibraryImplementation;
449 datum3ParamCount = dl.datum3ParamCount;
450 datum7ParamCount = dl.datum7ParamCount;
459 const char *ellipsoidCode,
466 double westLongitude,
467 double eastLongitude,
468 double southLatitude,
469 double northLatitude )
496 long ellipsoid_index = 0;
497 long code_length = 0;
498 char *PathName = NULL;
499 FILE *fp_3param = NULL;
501 if (!(((sigmaX > 0.0) || (sigmaX == -1.0)) &&
502 ((sigmaY > 0.0) || (sigmaY == -1.0)) &&
503 ((sigmaZ > 0.0) || (sigmaZ == -1.0))))
514 if (southLatitude >= northLatitude)
516 if((westLongitude >= eastLongitude) &&
517 (westLongitude >= 0 && westLongitude < 180) &&
518 (eastLongitude >= 0 && eastLongitude < 180))
522 bool isNewDatumCode =
true;
528 isNewDatumCode =
false;
536 if ( !isNewDatumCode )
539 code_length = strlen( code );
544 if( _ellipsoidLibraryImplementation )
547 ellipsoidCode, &ellipsoid_index );
553 strcpy( datum_Code, code );
555 for(
long i = 0; i < code_length; i++ )
556 datum_Code[i] = (
char )toupper( datum_Code[i] );
558 int numDatums = datumList.size();
560 numDatums, (
char* )datum_Code, (
char* )ellipsoidCode,
562 westLongitude, eastLongitude, southLatitude, northLatitude, sigmaX,
563 sigmaY, sigmaZ,
true ) );
573 const char *ellipsoidCode,
581 double westLongitude,
582 double eastLongitude,
583 double southLatitude,
584 double northLatitude )
612 long ellipsoid_index = 0;
613 long code_length = 0;
614 char *PathName = NULL;
615 FILE *fp_7param = NULL;
617 if ((rotationX < -60.0) || (rotationX > 60.0))
619 if ((rotationY < -60.0) || (rotationY > 60.0))
621 if ((rotationZ < -60.0) || (rotationZ > 60.0))
624 if ((scale < -0.001) || (scale > 0.001))
628 bool isNewDatumCode =
true;
634 isNewDatumCode =
false;
642 if ( !isNewDatumCode )
645 code_length = strlen( code );
649 if( _ellipsoidLibraryImplementation )
652 ellipsoidCode, &ellipsoid_index );
658 strcpy( datum_Code, code );
660 for( i = 0; i < code_length; i++ )
661 datum_Code[i] = (
char )toupper( datum_Code[i] );
663 datumList.insert( datumList.begin() +
MAX_WGS + datum7ParamCount,
666 deltaX, deltaY, deltaZ,
667 westLongitude, eastLongitude, southLatitude, northLatitude,
690 char *PathName = NULL;
691 FILE *fp_3param = NULL;
692 FILE *fp_7param = NULL;
694 bool delete_3param_datum =
true;
705 delete_3param_datum =
false;
712 datumList.erase( datumList.begin() + index );
714 if( !delete_3param_datum )
720 else if( delete_3param_datum )
738 *count = datumList.size();
763 length = strlen( code );
768 strcpy( temp_code, code );
771 for( i=0; i < length; i++ )
772 temp_code[i] = (
char )toupper( temp_code[i] );
775 while( pos < length )
777 if( isspace( temp_code[pos] ) )
779 for( i=pos; i <= length; i++ )
780 temp_code[i] = temp_code[i+1];
787 int numDatums = datumList.size();
790 while( i < numDatums && strcmp( temp_code, datumList[i]->code() ) )
794 if( i == numDatums || strcmp( temp_code, datumList[i]->code() ) )