UNCLASSIFIED

GeographicTranslator
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Friends Macros
DatumLibraryImplementation.h
Go to the documentation of this file.
1 // CLASSIFICATION: UNCLASSIFIED
2 
3 #ifndef DatumLibraryImplementation_H
4 #define DatumLibraryImplementation_H
5 
6 /***************************************************************************/
7 /* RSC IDENTIFIER: Datum Library
8  *
9  * ABSTRACT
10  *
11  * This component provides datum shifts for a large collection of local
12  * datums, WGS72, and WGS84. A particular datum can be accessed by using its
13  * standard 5-letter code to find its index in the datum table. The index
14  * can then be used to retrieve the name, type, ellipsoid code, and datum
15  * shift parameters, and to perform shifts to or from that datum.
16  *
17  * By sequentially retrieving all of the datum codes and/or names, a menu
18  * of the available datums can be constructed. The index values resulting
19  * from selections from this menu can then be used to access the parameters
20  * of the selected datum, or to perform datum shifts involving that datum.
21  *
22  * This component supports both 3-parameter local datums, for which only X,
23  * Y, and Z translations relative to WGS 84 have been defined, and
24  * 7-parameter local datums, for which X, Y, and Z rotations, and a scale
25  * factor, are also defined. It also includes entries for WGS 84 (with an
26  * index of 0), and WGS 72 (with an index of 1), but no shift parameter
27  * values are defined for these.
28  *
29  * This component provides datum shift functions for both geocentric and
30  * geodetic coordinates. WGS84 is used as an intermediate state when
31  * shifting from one local datum to another. When geodetic coordinates are
32  * given Molodensky's method is used, except near the poles where the 3-step
33  * step method is used instead. Specific algorithms are used for shifting
34  * between WGS72 and WGS84.
35  *
36  * This component depends on two data files, named 3_param.dat and
37  * 7_param.dat, which contain the datum parameter values. Copies of these
38  * files must be located in the directory specified by the value of the
39  * environment variable "MSPCCS_DATA", if defined, or else in the current
40  * directory whenever a program containing this component is executed.
41  *
42  * Additional datums can be added to these files, either manually or using
43  * the Create_Datum function. However, if a large number of datums are
44  * added, the datum table array sizes in this component will have to be
45  * increased.
46  *
47  * This component depends on two other components: the Ellipsoid component
48  * for access to ellipsoid parameters; and the Geocentric component for
49  * conversions between geodetic and geocentric coordinates.
50  *
51  * ERROR HANDLING
52  *
53  * This component checks for input file errors and input parameter errors.
54  * If an invalid value is found, the error code is combined with the current
55  * error code using the bitwise or. This combining allows multiple error
56  * codes to be returned. The possible error codes are:
57  *
58  * DATUM_NO_ERROR : No errors occurred in function
59  * DATUM_NOT_INITIALIZED_ERROR : Datum module has not been initialized
60  * DATUM_7PARAM_FILE_OPEN_ERROR : 7 parameter file opening error
61  * DATUM_7PARAM_FILE_PARSING_ERROR : 7 parameter file structure error
62  * DATUM_3PARAM_FILE_OPEN_ERROR : 3 parameter file opening error
63  * DATUM_3PARAM_FILE_PARSING_ERROR : 3 parameter file structure error
64  * DATUM_INVALID_INDEX_ERROR : Index out of valid range (less than one
65  * or more than Number_of_Datums)
66  * DATUM_INVALID_SRC_INDEX_ERROR : Source datum index invalid
67  * DATUM_INVALID_DEST_INDEX_ERROR : Destination datum index invalid
68  * DATUM_INVALID_CODE_ERROR : Datum code not found in table
69  * DATUM_LAT_ERROR : Latitude out of valid range (-90 to 90)
70  * DATUM_LON_ERROR : Longitude out of valid range (-180 to
71  * 360)
72  * DATUM_SIGMA_ERROR : Standard error values must be positive
73  * (or -1 if unknown)
74  * DATUM_DOMAIN_ERROR : Domain of validity not well defined
75  * DATUM_ELLIPSE_ERROR : Error in ellipsoid module
76  * DATUM_NOT_USERDEF_ERROR : Datum code is not user defined - cannot
77  * be deleted
78  *
79  *
80  * REUSE NOTES
81  *
82  * Datum is intended for reuse by any application that needs access to
83  * datum shift parameters relative to WGS 84.
84  *
85  *
86  * REFERENCES
87  *
88  * Further information on Datum can be found in the Reuse Manual.
89  *
90  * Datum originated from : U.S. Army Topographic Engineering Center (USATEC)
91  * Geospatial Information Division (GID)
92  * 7701 Telegraph Road
93  * Alexandria, VA 22310-3864
94  *
95  * LICENSES
96  *
97  * None apply to this component.
98  *
99  * RESTRICTIONS
100  *
101  * Datum has no restrictions.
102  *
103  * ENVIRONMENT
104  *
105  * Datum was tested and certified in the following environments:
106  *
107  * 1. Solaris 2.5 with GCC 2.8.1
108  * 2. MS Windows 95 with MS Visual C++ 6
109  *
110  * MODIFICATIONS
111  *
112  * Date Description
113  * ---- -----------
114  * 03/30/97 Original Code
115  * 05/28/99 Added user-definable datums (for JMTK)
116  * Added datum domain of validity checking (for JMTK)
117  * Added datum shift accuracy calculation (for JMTK)
118  * 06/27/06 Moved data files to data directory
119  * 03-14-07 Original C++ Code
120  * 05/26/10 S. Gillis, BAEts26674, Added Validate Datum to the API
121  * in MSP Geotrans 3.0
122  * 08/13/12 S. Gillis, MSP_00029654, Added lat/lon to define7ParamDatum
123  */
124 
125 
126 #include <vector>
127 #include "DatumType.h"
128 #include "Precision.h"
129 #include "DtccApi.h"
130 
131 
132 namespace MSP
133 {
134  class CCSThreadMutex;
135  namespace CCS
136  {
137  class Accuracy;
138  class Datum;
139  class EllipsoidLibraryImplementation;
140  class CartesianCoordinates;
141  class GeodeticCoordinates;
142 
143 
145  {
147 
148  public:
149 
150  /* The function getInstance returns an instance of the DatumLibraryImplementation
151  */
152 
153  static DatumLibraryImplementation* getInstance();
154 
155 
156  /*
157  * The function removeInstance removes this DatumLibraryImplementation instance from the
158  * total number of instances.
159  */
160 
161  static void removeInstance();
162 
163 
165 
166 
167  /*
168  * The function define3ParamDatum creates a new local (3-parameter) datum with the
169  * specified code, name, and axes. If the datum table has not been initialized,
170  * the specified code is already in use, or a new version of the 3-param.dat
171  * file cannot be created, an exception is thrown.
172  * Note that the indexes of all datums in the datum table may be
173  * changed by this function.
174  *
175  * code : 5-letter new datum code. (input)
176  * name : Name of the new datum (input)
177  * ellipsoidCode : 2-letter code for the associated ellipsoid (input)
178  * deltaX : X translation to WGS84 in meters (input)
179  * deltaY : Y translation to WGS84 in meters (input)
180  * deltaZ : Z translation to WGS84 in meters (input)
181  * sigmaX : Standard error in X in meters (input)
182  * sigmaY : Standard error in Y in meters (input)
183  * sigmaZ : Standard error in Z in meters (input)
184  * westLongitude : Western edge of validity rectangle in radians (input)
185  * eastLongitude : Eastern edge of validity rectangle in radians (input)
186  * southLatitude : Southern edge of validity rectangle in radians(input)
187  * northLatitude : Northern edge of validity rectangle in radians(input)
188  */
189 
190  void define3ParamDatum( const char *code, const char *name, const char *ellipsoidCode,
191  double deltaX, double deltaY, double deltaZ,
192  double sigmaX, double sigmaY, double sigmaZ,
193  double westLongitude, double eastLongitude, double southLatitude, double northLatitude );
194 
195 
196  /*
197  * The function define7ParamDatum creates a new local (7-parameter) datum with the
198  * specified code, name, and axes. If the datum table has not been initialized,
199  * the specified code is already in use, or a new version of the 7-param.dat
200  * file cannot be created, an exception is thrown.
201  * Note that the indexes of all datums in the datum table may be
202  * changed by this function.
203  *
204  * code : 5-letter new datum code. (input)
205  * name : Name of the new datum (input)
206  * ellipsoidCode : 2-letter code for the associated ellipsoid (input)
207  * deltaX : X translation to WGS84 in meters (input)
208  * deltaY : Y translation to WGS84 in meters (input)
209  * deltaZ : Z translation to WGS84 in meters (input)
210  * rotationX : X rotation to WGS84 in arc seconds (input)
211  * rotationY : Y rotation to WGS84 in arc seconds (input)
212  * rotationZ : Z rotation to WGS84 in arc seconds (input)
213  * scale : Scale factor (input)
214  * westLongitude : Western edge of validity rectangle in radians (input)
215  * eastLongitude : Eastern edge of validity rectangle in radians (input)
216  * southLatitude : Southern edge of validity rectangle in radians(input)
217  * northLatitude : Northern edge of validity rectangle in radians(input)
218  */
219 
220  void define7ParamDatum( const char *code, const char *name, const char *ellipsoidCode,
221  double deltaX, double deltaY, double deltaZ,
222  double rotationX, double rotationY, double rotationZ,
223  double scale, double westLongitude,
224  double eastLongitude, double southLatitude,
225  double northLatitude);
226 
227  /*
228  * The function removeDatum deletes a local (3-parameter) datum with the
229  * specified code. If the datum table has not been initialized or a new
230  * version of the 3-param.dat file cannot be created, an exception is thrown.
231  * Note that the indexes of all datums
232  * in the datum table may be changed by this function.
233  *
234  * code : 5-letter datum code. (input)
235  *
236  */
237 
238  void removeDatum( const char* code );
239 
240 
241  /*
242  * The function datumCount returns the number of Datums in the table
243  * if the table was initialized without error.
244  *
245  * count : number of datums in the datum table (output)
246  */
247 
248  void datumCount( long *count );
249 
250 
251  /*
252  * The function datumIndex returns the index of the datum with the
253  * specified code.
254  *
255  * code : The datum code being searched for. (input)
256  * index : The index of the datum in the table with the (output)
257  * specified code.
258  */
259 
260  void datumIndex( const char *code, long *index );
261 
262 
263  /*
264  * The function datumCode returns the 5-letter code of the datum
265  * referenced by index.
266  *
267  * index : The index of a given datum in the datum table. (input)
268  * code : The datum Code of the datum referenced by Index. (output)
269  */
270 
271  void datumCode( const long index, char *code );
272 
273 
274  /*
275  * The function datumName returns the name of the datum referenced by
276  * index.
277  *
278  * index : The index of a given datum in the datum table. (input)
279  * name : The datum Name of the datum referenced by Index. (output)
280  */
281 
282  void datumName( const long index, char *name );
283 
284 
285  /*
286  * The function datumEllipsoidCode returns the 2-letter ellipsoid code
287  * for the ellipsoid associated with the datum referenced by index.
288  *
289  * index : The index of a given datum in the datum table. (input)
290  * code : The ellipsoid code for the ellipsoid associated with (output)
291  * the datum referenced by index.
292  */
293 
294  void datumEllipsoidCode( const long index, char *code );
295 
296 
297  /*
298  * The function datumStandardErrors returns the standard errors in X,Y, & Z
299  * for the datum referenced by index.
300  *
301  * index : The index of a given datum in the datum table (input)
302  * sigma_X : Standard error in X in meters (output)
303  * sigma_Y : Standard error in Y in meters (output)
304  * sigma_Z : Standard error in Z in meters (output)
305  */
306 
307  void datumStandardErrors( const long index, double *sigmaX, double *sigmaY, double *sigmaZ );
308 
309 
310  /*
311  * The function datumSevenParameters returns parameter values,
312  * used only by a seven parameter datum,
313  * for the datum referenced by index.
314  *
315  * index : The index of a given datum in the datum table. (input)
316  * rotationX : X rotation in radians (output)
317  * rotationY : Y rotation in radians (output)
318  * rotationZ : Z rotation in radians (output)
319  * scaleFactor : Scale factor (output)
320  */
321 
322  void datumSevenParameters( const long index, double *rotationX, double *rotationY, double *rotationZ, double *scaleFactor);
323 
324 
325  /*
326  * The function datumTranslationValues returns the translation values
327  * for the datum referenced by index.
328  *
329  * index : The index of a given datum in the datum table. (input)
330  * deltaX : X translation in meters (output)
331  * deltaY : Y translation in meters (output)
332  * deltaZ : Z translation in meters (output)
333  */
334 
335  void datumTranslationValues(
336  const long index,
337  double *deltaX,
338  double *deltaY,
339  double *deltaZ );
340 
341 
342  /*
343  * The function datumShiftError returns the 90% horizontal (circular),
344  * vertical (linear), and spherical errors for a shift from the
345  * specified source datum to the specified destination datum at
346  * the specified location.
347  *
348  * sourceIndex : Index of source datum (input)
349  * targetIndex : Index of destination datum (input)
350  * longitude : Longitude of point being converted (radians)(input)
351  * latitude : Latitude of point being converted (radians) (input)
352  * sourceAccuracy : Accuracy of the source coordinate (input)
353  * precision : Precision of the source coordinate (input)
354  */
355 
356  Accuracy* datumShiftError(
357  const long sourceIndex,
358  const long targetIndex,
359  double longitude,
360  double latitude,
361  Accuracy* sourceAccuracy,
362  Precision::Enum precision );
363 
364  /*
365  * The function datumUserDefined checks whether or not the specified datum is
366  * user defined. It returns 1 if the datum is user defined, and returns
367  * 0 otherwise. If index is valid DATUM_NO_ERROR is returned, otherwise
368  * DATUM_INVALID_INDEX_ERROR is returned.
369  *
370  * index : Index of a given datum in the datum table (input)
371  * result : Indicates whether specified datum is user defined (1)
372  * or not (0) (output)
373  */
374 
375  void datumUserDefined( const long index, long *result );
376 
377 
378  /*
379  * The function datumUsesEllipsoid returns 1 if the ellipsoid is in use by a
380  * user defined datum. Otherwise, 0 is returned.
381  *
382  * ellipsoidCode : The ellipsoid code being searched for. (input)
383  */
384 
385  bool datumUsesEllipsoid( const char *ellipsoidCode );
386 
387 
388  /*
389  * The function datumValidRectangle returns the edges of the validity
390  * rectangle for the datum referenced by index.
391  *
392  * index : The index of a given datum in the datum table (input)
393  * westLongitude : Western edge of validity rectangle in radians (output)
394  * eastLongitude : Eastern edge of validity rectangle in radians (output)
395  * southLatitude : Southern edge of validity rectangle in radians (output)
396  * northLatitude : Northern edge of validity rectangle in radians (output)
397  *
398  */
399 
400  void datumValidRectangle( const long index, double *westLongitude, double *eastLongitude, double *southLatitude, double *northLatitude );
401 
402 
403  /*
404  * The function geocentricDatumShift shifts a geocentric coordinate (X, Y, Z in meters) relative
405  * to the source datum to geocentric coordinate (X, Y, Z in meters) relative
406  * to the destination datum.
407  *
408  * sourceIndex : Index of source datum (input)
409  * sourceX : X coordinate relative to source datum (input)
410  * sourceY : Y coordinate relative to source datum (input)
411  * sourceZ : Z coordinate relative to source datum (input)
412  * targetIndex : Index of destination datum (input)
413  * targetX : X coordinate relative to destination datum (output)
414  * targetY : Y coordinate relative to destination datum (output)
415  * targetZ : Z coordinate relative to destination datum (output)
416  *
417  */
418 
419  CartesianCoordinates* geocentricDatumShift( const long sourceIndex, const double sourceX, const double sourceY, const double sourceZ,
420  const long targetIndex );
421 
422 
423  /*
424  * The function geocentricShiftFromWGS84 shifts a geocentric coordinate (X, Y, Z in meters) relative
425  * to WGS84 to a geocentric coordinate (X, Y, Z in meters) relative to the
426  * local datum referenced by index.
427  *
428  * WGS84X : X coordinate relative to WGS84 (input)
429  * WGS84Y : Y coordinate relative to WGS84 (input)
430  * WGS84Z : Z coordinate relative to WGS84 (input)
431  * targetIndex : Index of destination datum (input)
432  * targetX : X coordinate relative to the destination datum (output)
433  * targetY : Y coordinate relative to the destination datum (output)
434  * targetZ : Z coordinate relative to the destination datum (output)
435  */
436 
437  CartesianCoordinates* geocentricShiftFromWGS84( const double WGS84X, const double WGS84Y, const double WGS84Z, const long targetIndex );
438 
439 
440  /*
441  * The function geocentricShiftToWGS84 shifts a geocentric coordinate (X, Y, Z in meters) relative
442  * to the datum referenced by index to a geocentric coordinate (X, Y, Z in
443  * meters) relative to WGS84.
444  *
445  * sourceIndex : Index of source datum (input)
446  * sourceX : X coordinate relative to the source datum (input)
447  * sourceY : Y coordinate relative to the source datum (input)
448  * sourceZ : Z coordinate relative to the source datum (input)
449  * WGS84X : X coordinate relative to WGS84 (output)
450  * WGS84Y : Y coordinate relative to WGS84 (output)
451  * WGS84Z : Z coordinate relative to WGS84 (output)
452  */
453 
454  CartesianCoordinates* geocentricShiftToWGS84( const long sourceIndex, const double sourceX, const double sourceY, const double sourceZ );
455 
456 
457  /*
458  * The function geodeticDatumShift shifts geodetic coordinates (latitude, longitude in radians
459  * and height in meters) relative to the source datum to geodetic coordinates
460  * (latitude, longitude in radians and height in meters) relative to the
461  * destination datum.
462  *
463  * sourceIndex : Index of source datum (input)
464  * sourceLongitude : Longitude in radians relative to source datum (input)
465  * sourceLatitude : Latitude in radians relative to source datum (input)
466  * sourceHeight : Height in meters relative to source datum (input)
467  * targetIndex : Index of destination datum (input)
468  * targetLongitude : Longitude in radians relative to destination datum (output)
469  * targetLatitude : Latitude in radians relative to destination datum (output)
470  * targetHeight : Height in meters relative to destination datum (output)
471  */
472 
473  GeodeticCoordinates* geodeticDatumShift( const long sourceIndex, const GeodeticCoordinates* sourceCoordinates,
474  const long targetIndex );
475 
476 
477  /*
478  * The function geodeticShiftFromWGS84 shifts geodetic coordinates relative to WGS84
479  * to geodetic coordinates relative to a given local datum.
480  *
481  * WGS84Longitude : Longitude in radians relative to WGS84 (input)
482  * WGS84Latitude : Latitude in radians relative to WGS84 (input)
483  * WGS84Height : Height in meters relative to WGS84 (input)
484  * targetIndex : Index of destination datum (input)
485  * targetLongitude : Longitude in radians relative to destination datum (output)
486  * targetLatitude : Latitude in radians relative to destination datum (output)
487  * targetHeight : Height in meters relative to destination datum (output)
488  *
489  */
490 
491  GeodeticCoordinates* geodeticShiftFromWGS84( const GeodeticCoordinates* sourceCoordinates,
492  const long targetIndex );
493 
494 
495  /*
496  * The function geodeticShiftToWGS84 shifts geodetic coordinates relative to a given source datum
497  * to geodetic coordinates relative to WGS84.
498  *
499  * sourceIndex : Index of source datum (input)
500  * sourceLongitude : Longitude in radians relative to source datum (input)
501  * sourceLatitude : Latitude in radians relative to source datum (input)
502  * sourceHeight : Height in meters relative to source datum (input)
503  * WGS84Longitude : Longitude in radians relative to WGS84 (output)
504  * WGS84Latitude : Latitude in radians relative to WGS84 (output)
505  * WGS84Height : Height in meters relative to WGS84 (output)
506  *
507  */
508 
509  GeodeticCoordinates* geodeticShiftToWGS84( const long sourceIndex, const GeodeticCoordinates* sourceCoordinates );
510 
511 
512  /*
513  * The function retrieveDatumType returns the type of the datum referenced by
514  * index.
515  *
516  * index : The index of a given datum in the datum table. (input)
517  * datumType : The type of datum referenced by index. (output)
518  *
519  */
520 
521  void retrieveDatumType( const long index, DatumType::Enum *datumType );
522 
523 
524  /*
525  * The function validDatum checks whether or not the specified location is within the
526  * validity rectangle for the specified datum. It returns zero if the specified
527  * location is NOT within the validity rectangle, and returns 1 otherwise.
528  *
529  * index : The index of a given datum in the datum table (input)
530  * latitude : Latitude of the location to be checked in radians (input)
531  * longitude : Longitude of the location to be checked in radians (input)
532  * result : Indicates whether location is inside (1) or outside (0)
533  * of the validity rectangle of the specified datum (output)
534  */
535 
536  void validDatum( const long index, double longitude, double latitude, long *result );
537 
538 
539  /*
540  * The function setEllipsoidLibrary sets the ellipsoid library information
541  * which is needed to create datums and calculate datum shifts.
542  *
543  * __ellipsoidLibrary : Ellipsoid library (input)
544  *
545  */
546 
547  void setEllipsoidLibraryImplementation( EllipsoidLibraryImplementation* __ellipsoidLibraryImplementation );
548 
549 
550  protected:
551 
552  /*
553  * The constructor creates an empty list to store the datum information
554  * contained in two external files, 3_param.dat and 7_param.dat.
555  */
556 
558 
559 
561 
562 
564 
565 
566  private:
567 
568  static MSP::CCSThreadMutex mutex;
569  static DatumLibraryImplementation* instance;
570  static int instanceCount;
571 
572  std::vector<Datum*> datumList;
573 
574  EllipsoidLibraryImplementation* _ellipsoidLibraryImplementation;
575 
576  long datum3ParamCount;
577  long datum7ParamCount;
578 
579 
580  /*
581  * The function loadDatums creates the datum table from two external
582  * files. If an error occurs, the initialization stops and an error code is
583  * returned. This function must be called before any of the other functions
584  * in this component.
585  */
586 
587  void loadDatums();
588 
589 
590  /*
591  * The function write3ParamFile writes the 3 parameter datums in the datum list
592  * to the 3_param.dat file.
593  */
594 
595  void write3ParamFile();
596 
597 
598  /*
599  * The function write7ParamFile writes the 7 parameter datums in the datum list
600  * to the 7_param.dat file.
601  */
602 
603  void write7ParamFile();
604 
605  /*
606  * The function geodeticShiftWGS84ToWGS72 shifts a geodetic coordinate (latitude, longitude in radians
607  * and height in meters) relative to WGS84 to a geodetic coordinate
608  * (latitude, longitude in radians and height in meters) relative to WGS72.
609  *
610  * WGS84Longitude : Longitude in radians relative to WGS84 (input)
611  * WGS84Latitude : Latitude in radians relative to WGS84 (input)
612  * WGS84Height : Height in meters relative to WGS84 (input)
613  * WGS72Longitude : Longitude in radians relative to WGS72 (output)
614  * WGS72Latitude : Latitude in radians relative to WGS72 (output)
615  * WGS72Height : Height in meters relative to WGS72 (output)
616  */
617 
618  GeodeticCoordinates* geodeticShiftWGS84ToWGS72( const double WGS84Longitude, const double WGS84Latitude, const double WGS84Height );
619 
620 
621  /*
622  * The function geodeticShiftWGS72ToWGS84 shifts a geodetic coordinate (latitude, longitude in radians
623  * and height in meters) relative to WGS72 to a geodetic coordinate
624  * (latitude, longitude in radians and height in meters) relative to WGS84.
625  *
626  * WGS72Longitude : Longitude in radians relative to WGS72 (input)
627  * WGS72Latitude : Latitude in radians relative to WGS72 (input)
628  * WGS72Height : Height in meters relative to WGS72 (input)
629  * WGS84Longitude : Longitude in radians relative to WGS84 (output)
630  * WGS84Latitude : Latitude in radians relative to WGS84 (output)
631  * WGS84Height : Height in meters relative to WGS84 (output)
632  */
633 
634  GeodeticCoordinates* geodeticShiftWGS72ToWGS84( const double WGS72Longitude, const double WGS72Latitude, const double WGS72Height );
635 
636 
637  /*
638  * The function geocentricShiftWGS84ToWGS72 shifts a geocentric coordinate (X, Y, Z in meters) relative
639  * to WGS84 to a geocentric coordinate (X, Y, Z in meters) relative to WGS72.
640  *
641  * X_WGS84 : X coordinate relative to WGS84 (input)
642  * Y_WGS84 : Y coordinate relative to WGS84 (input)
643  * Z_WGS84 : Z coordinate relative to WGS84 (input)
644  * X : X coordinate relative to WGS72 (output)
645  * Y : Y coordinate relative to WGS72 (output)
646  * Z : Z coordinate relative to WGS72 (output)
647  */
648 
649  CartesianCoordinates* geocentricShiftWGS84ToWGS72( const double X_WGS84, const double Y_WGS84, const double Z_WGS84 );
650 
651 
652  /*
653  * The function geocentricShiftWGS72ToWGS84 shifts a geocentric coordinate (X, Y, Z in meters) relative
654  * to WGS72 to a geocentric coordinate (X, Y, Z in meters) relative to WGS84.
655  *
656  * X : X coordinate relative to WGS72 (input)
657  * Y : Y coordinate relative to WGS72 (input)
658  * Z : Z coordinate relative to WGS72 (input)
659  * X_WGS84 : X coordinate relative to WGS84 (output)
660  * Y_WGS84 : Y coordinate relative to WGS84 (output)
661  * Z_WGS84 : Z coordinate relative to WGS84 (output)
662  */
663 
664  CartesianCoordinates* geocentricShiftWGS72ToWGS84( const double X, const double Y, const double Z );
665 
666 
667  /*
668  * Delete the singleton.
669  */
670 
671  static void deleteInstance();
672  };
673  }
674 }
675 
676 #endif
677 
678 
679 // CLASSIFICATION: UNCLASSIFIED