1
// CLASSIFICATION: UNCLASSIFIED
3
#ifndef EllipsoidLibraryImplementation_H
4
#define EllipsoidLibraryImplementation_H
6
/****************************************************************************/
7
/* RSC IDENTIFIER: Ellipsoid Library
11
* The purpose of ELLIPSOID is to provide access to ellipsoid parameters
12
* for a collection of common ellipsoids. A particular ellipsoid can be
13
* accessed by using its standard 2-letter code to find its index in the
14
* ellipsoid table. The index can then be used to retrieve the ellipsoid
15
* name and parameters.
17
* By sequentially retrieving all of the ellipsoid codes and/or names, a
18
* menu of the available ellipsoids can be constructed. The index values
19
* resulting from selections from this menu can then be used to access the
20
* parameters of the selected ellipsoid.
22
* This component depends on a data file named "ellips.dat", which contains
23
* the ellipsoid parameter values. A copy of this file must be located in
24
* the directory specified by the environment variable "MSPCCS_DATA", if
25
* defined, or else in the current directory, whenever a program containing
26
* this component is executed.
28
* Additional ellipsoids can be added to this file, either manually or using
29
* the Create_Ellipsoid function. However, if a large number of ellipsoids
30
* are added, the ellipsoid table array size in this component will have to
35
* This component checks parameters for valid values. If an invalid value
36
* is found, the error code is combined with the current error code using
37
* the bitwise or. This combining allows multiple error codes to be
38
* returned. The possible error codes are:
40
* ELLIPSE_NO_ERROR : No errors occured in function
41
* ELLIPSE_FILE_OPEN_ERROR : Ellipsoid file opening error
42
* ELLIPSE_INITIALIZE_ERROR : Ellipsoid table can not initialize
43
* ELLIPSE_TABLE_OVERFLOW_ERROR : Ellipsoid table overflow
44
* ELLIPSE_NOT_INITIALIZED_ERROR: Ellipsoid table not initialized properly
45
* ELLIPSE_INVALID_INDEX_ERROR : Index is an invalid value
46
* ELLIPSE_INVALID_CODE_ERROR : Code was not found in table
47
* ELLIPSE_A_ERROR : Semi-major axis less than or equal to zero
48
* ELLIPSE_INV_F_ERROR : Inverse flattening outside of valid range
50
* ELLIPSE_NOT_USERDEF_ERROR : Ellipsoid is not user defined - cannot be
55
* Ellipsoid is intended for reuse by any application that requires Earth
56
* approximating ellipsoids.
60
* Further information on Ellipsoid can be found in the Reuse Manual.
62
* Ellipsoid originated from : U.S. Army Topographic Engineering Center (USATEC)
63
* Geospatial Information Division (GID)
65
* Alexandria, VA 22310-3864
69
* None apply to this component.
73
* Ellipsoid has no restrictions.
77
* Ellipsoid was tested and certified in the following environments
86
* 11-19-95 Original Code
87
* 17-Jan-97 Moved local constants out of public interface
88
* Improved efficiency in algorithms (GEOTRANS)
89
* 24-May-99 Added user-defined ellipsoids (GEOTRANS for JMTK)
90
* 06-27-06 Moved data file to data directory
91
* 03-09-07 Original C++ Code
104
class DatumLibraryImplementation;
107
/***************************************************************************/
112
class EllipsoidLibraryImplementation
114
friend class EllipsoidLibraryImplementationCleaner;
119
* The function getInstance returns an instance of the EllipsoidLibraryImplementation
122
static EllipsoidLibraryImplementation* getInstance();
126
* The function removeInstance removes this EllipsoidLibraryImplementation instance from the
127
* total number of instances.
130
static void removeInstance();
133
~EllipsoidLibraryImplementation( void );
137
* The function defineEllipsoid creates a new ellipsoid with the specified
138
* Code, name, and axes. If the ellipsoid table has not been initialized,
139
* the specified code is already in use, or a new version of the ellips.dat
140
* file cannot be created, an exception is thrown.
141
* Note that the indexes of all ellipsoids in the ellipsoid
142
* table may be changed by this function.
144
* code : 2-letter ellipsoid code. (input)
145
* name : Name of the new ellipsoid (input)
146
* semiMajorAxis : Semi-major axis, in meters, of new ellipsoid (input)
147
* flattening : Flattening of new ellipsoid. (input)
151
void defineEllipsoid( const char* code, const char* name, double semiMajorAxis, double flattening );
155
* The function removeEllipsoid deletes a user defined ellipsoid with
156
* the specified Code. If the ellipsoid table has not been created,
157
* the specified code is in use by a user defined datum, or a new version
158
* of the ellips.dat file cannot be created, an exception is thrown.
159
* Note that the indexes of all
160
* ellipsoids in the ellipsoid table may be changed by this function.
162
* code : 2-letter ellipsoid code. (input)
166
void removeEllipsoid( const char* Code );
170
* The function ellipsoidCount returns the number of ellipsoids in the
171
* ellipsoid table. If the ellipsoid table has not been initialized,
172
* an exception is thrown.
174
* count : The number of ellipsoids in the ellipsoid table. (output)
178
void ellipsoidCount ( long *count );
182
* The function ellipsoidIndex returns the index of the ellipsoid in
183
* the ellipsoid table with the specified code. If ellipsoid code is not found,
184
* an exception is thrown.
186
* code : 2-letter ellipsoid code. (input)
187
* index : Index of the ellipsoid in the ellipsoid table with the
188
* specified code (output)
192
void ellipsoidIndex( const char* code, long* index );
196
* The Function ellipsoidCode returns the 2-letter code for the
197
* ellipsoid in the ellipsoid table with the specified index. If index is
198
* invalid, an exception is thrown.
200
* index : Index of a given ellipsoid in the ellipsoid table (input)
201
* code : 2-letter ellipsoid code. (output)
205
void ellipsoidCode( const long index, char *code );
209
* The Function ellipsoidName returns the name of the ellipsoid in
210
* the ellipsoid table with the specified index. If index is invalid,
211
* an exception is thrown.
213
* index : Index of a given ellipsoid.in the ellipsoid table with the
214
* specified index (input)
215
* name : Name of the ellipsoid referencd by index (output)
219
void ellipsoidName( const long index, char *name );
223
* The function ellipsoidParameters returns the semi-major axis and flattening
224
* for the ellipsoid with the specified index. If index is invalid,
225
* an exception is thrown.
227
* index : Index of a given ellipsoid in the ellipsoid table (input)
228
* a : Semi-major axis, in meters, of ellipsoid (output)
229
* f : Flattening of ellipsoid. (output)
233
void ellipsoidParameters( const long index, double *a, double *f );
237
* The function ellipsoidEccentricity2 returns the square of the
238
* eccentricity for the ellipsoid with the specified index. If index is
239
* invalid, an exception is thrown.
241
* index : Index of a given ellipsoid in the ellipsoid table (input)
242
* eccentricitySquared : Square of eccentricity of ellipsoid (output)
246
void ellipsoidEccentricity2( const long index, double *eccentricitySquared );
250
* The function ellipsoidUserDefined returns 1 if the ellipsoid is user
251
* defined. Otherwise, 0 is returned. If index is invalid an
252
* exception is thrown.
254
* index : Index of a given ellipsoid in the ellipsoid table (input)
255
* result : Indicates whether specified ellipsoid is user defined (1)
256
* or not (0) (output)
260
void ellipsoidUserDefined( const long index, long *result );
264
* The function setDatumLibraryImplementation sets the datum library information
265
* which is needed to ensure a user defined ellipsoid is not in use before being deleted.
267
* __datumLibraryImplementation : Datum library implementation (input)
271
void setDatumLibraryImplementation( DatumLibraryImplementation* __datumLibraryImplementation );
277
* The constructor creates an empty list to store the ellipsoid data from ellips.dat,
278
* which is used to build the ellipsoid table.
281
EllipsoidLibraryImplementation();
284
EllipsoidLibraryImplementation( const EllipsoidLibraryImplementation &e );
287
EllipsoidLibraryImplementation& operator=( const EllipsoidLibraryImplementation &e );
293
static EllipsoidLibraryImplementation* instance;
294
static int instanceCount;
296
std::vector<Ellipsoid*> ellipsoidList;
299
DatumLibraryImplementation* _datumLibraryImplementation;
302
* The function loadEllipsoids reads ellipsoid data from ellips.dat
303
* and builds the ellipsoid table from it. If an error occurs,
304
* an exception is thrown.
307
void loadEllipsoids();
311
* Delete the singleton.
314
static void deleteInstance();
321
// CLASSIFICATION: UNCLASSIFIED