engine.h
上传用户:oybseng
上传日期:2015-04-27
资源大小:7831k
文件大小:129k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. #ifndef ENGINE_H
  2.   #define ENGINE_H
  3. /***************************************************************************/
  4. /* RSC IDENTIFIER: GEOTRANS ENGINE                 
  5.  *
  6.  * ABSTRACT
  7.  *
  8.  *    This component is the coordinate transformation engine for the GEOTRANS
  9.  *    application.  It provides an external input interface that supports the
  10.  *    GEOTRANS GUIs (Motif and Windows) and the GEOTRANS file processing
  11.  *    component.
  12.  *
  13.  *    This component depends on the DT&CC modules:  DATUM, ELLIPSOID,
  14.  *    GEOCENTRIC, GEOREF, MERCATOR, TRANSVERSE MERCATOR, UTM, MGRS, POLAR
  15.  *    STEREOGRAPHIC, UPS, LAMBERT, ALBERS, AZIMUTHAL EQUIDISTANT, BONNE, 
  16.  *    BRITISH NATIONAL GRID,  CASSINI, CYLINDRICAL EQUAL AREA,ECKERT4, ECKERT6, 
  17.  *    EQUIDISTANT CYLINDRICAL, GNOMONIC, LOCAL CARTESIAN, MILLER, MOLLWEIDE, 
  18.  *    NEYS, NEW ZEALAND MAP GRID, OBLIQUE MERCATOR, ORTHOGRAPHIC, POLYCONIC, 
  19.  *    SINUSOIDAL, STEREOGRAPHIC, TRANSVERSE CYLINDRICAL EQUAL AREA, and VAN DER GRINTEN.
  20.  *
  21.  *
  22.  * ERROR HANDLING
  23.  *
  24.  *    This component checks for error codes returned by the DT&CC modules.
  25.  *    If an error code is returned, it is combined with the current
  26.  *    error code using the bitwise or.  This combining allows multiple error
  27.  *    codes to be returned. The possible error codes are listed below.
  28.  *
  29.  *
  30.  * REUSE NOTES
  31.  *
  32.  *    GEOTRANS ENGINE is intended for reuse by other applications that require 
  33.  *    coordinate conversions between multiple coordinate systems and/or datum 
  34.  *    transformations between multiple datums.
  35.  *
  36.  *
  37.  * REFERENCES
  38.  *
  39.  *    Further information on GEOTRANS ENGINE can be found in the GEOTRANS ENGINE 
  40.  *    Reuse Manual.
  41.  *
  42.  *    GEOTRANS ENGINE originated from :  U.S. Army Topographic Engineering Center
  43.  *                                       Geospatial Information Division
  44.  *                                       7701 Telegraph Road
  45.  *                                       Alexandria, VA  22310-3864
  46.  *
  47.  * LICENSES
  48.  *
  49.  *    None apply to this component.
  50.  *
  51.  * RESTRICTIONS
  52.  *
  53.  *    GEOTRANS ENGINE has no restrictions.
  54.  *
  55.  * ENVIRONMENT
  56.  *
  57.  *    GEOTRANS ENGINE was tested and certified in the following environments:
  58.  *
  59.  *    1. Solaris 2.5 with GCC, version 2.8.1
  60.  *    2. Windows 95 with MS Visual C++, version 6
  61.  *
  62.  * MODIFICATIONS
  63.  *
  64.  *    Date              Description
  65.  *    ----              -----------
  66.  *    04-22-97          Original Code
  67.  *    09-30-99          Added support for 15 new projections
  68.  *    05-30-00          Added support for 2 new projections
  69.  *    06-30-00          Added support for 1 new projection
  70.  *    09-30-00          Added support for 4 new projections
  71.  */
  72. /***************************************************************************/
  73. /*
  74.  *                              DEFINES
  75.  */
  76. /* Engine return status codes */
  77.   #define ENGINE_INPUT_WARNING         0x00000001    /* Warning returned by 1st conversion */
  78.   #define ENGINE_INPUT_ERROR           0x00000002    /* Error returned by 1st conversion */
  79.   #define ENGINE_OUTPUT_WARNING        0x00000004    /* Warning returned by 2nd conversion */
  80.   #define ENGINE_OUTPUT_ERROR          0x00000008    /* Error returned by 2nd conversion */
  81. /* Initialization errors */
  82.   #define ENGINE_NOT_INITIALIZED       0x00000010    /* Initialize_Engine has not been called */ 
  83.   #define ENGINE_ELLIPSOID_ERROR       0x00000020    /* Error returned by Ellipsoid module */
  84.   #define ENGINE_DATUM_ERROR           0x00000040    /* Error returned by Datum module */
  85.   #define ENGINE_GEOID_ERROR           0x00000080    /* Error returned by Geoid module*/
  86. /* Interface parameter errors (should never occur) */
  87.   #define ENGINE_INVALID_TYPE          0x00000100    /* Invalid coordinate system type */
  88.   #define ENGINE_INVALID_DIRECTION     0x00000200    /* Invalid direction (input or output) */
  89.   #define ENGINE_INVALID_STATE         0x00000400    /* Invalid state (interactive or file) */
  90. /* Lookup table errors */
  91.   #define ENGINE_INVALID_INDEX_ERROR   0x00001000    /* Index is an invalid value */
  92.   #define ENGINE_INVALID_CODE_ERROR    0x00002000    /* Code was not found in table */
  93.   #define ENGINE_ELLIPSOID_OVERFLOW    0x00004000    /* Ellipsoid table overflow */
  94.   #define ENGINE_DATUM_OVERFLOW        0x00008000    /* 3-parameter datum table overflow */
  95. /* Datum definition errors */
  96.   #define ENGINE_DATUM_SIGMA_ERROR     0x00010000    /* Standard error values must be positive
  97.                                                         (or -1 if unknown) */
  98.   #define ENGINE_DATUM_DOMAIN_ERROR    0x00020000    /* Invalid local datum domain of validity */
  99. /* Ellipsoid errors */
  100.   #define ENGINE_ELLIPSE_IN_USE_ERROR  0x00040000    /* Ellipsoid code is in use by a datum */
  101. /* Datum, ellipsoid deletion error */   
  102.   #define ENGINE_NOT_USERDEF_ERROR     0x00080000    /* Specified code is not user defined */
  103. /* Input/Output conversion status codes */
  104.   #define ENGINE_ORIGIN_LAT_ERROR      0x00000001    /* Invalid Origin Latitude */
  105.   #define ENGINE_CENT_MER_ERROR        0x00000002    /* Invalid Central Meridian */
  106.   #define ENGINE_EASTING_ERROR         0x00000004    /* Invalid Easting */
  107.   #define ENGINE_NORTHING_ERROR        0x00000008    /* Invalid Northing */
  108.   #define ENGINE_RADIUS_ERROR          0x00000010    /* Point too far from center of projection */
  109.   #define ENGINE_HEMISPHERE_ERROR      0x00000020    /* Invalid Hemisphere */                                           
  110.   #define ENGINE_SCALE_FACTOR_ERROR    0x00000040    /* Invalid Scale Factor */
  111.   #define ENGINE_LON_WARNING           0x00000080    /* Longitude too far from Central Meridian */
  112.   #define ENGINE_ORIGIN_LON_ERROR      0x00000100    /* Invalid Origin Longitude */
  113.   #define ENGINE_DATUM_WARNING         0x00000200    /* Point outside datum validity rectangle */
  114. /* Lambert/Albers error conditions */
  115.   #define ENGINE_FIRST_STDP_ERROR      0x00000400    /* Invalid 1st Standard Parallel */
  116.   #define ENGINE_SECOND_STDP_ERROR     0x00000800    /* Invalid 2nd Standard Parallel */
  117.   #define ENGINE_FIRST_SECOND_ERROR    0x00001000    /* 1st & 2nd Standard Parallel cannot be same */
  118. /* UTM/UPS/MGRS specific error conditions */
  119.   #define ENGINE_ZONE_ERROR            0x00002000    /* Invalid UTM Zone */
  120.   #define ENGINE_ZONE_OVERRIDE_ERROR   0x00004000    /* Invalid UTM zone Override */
  121. /* MGRS, GEOREF, British National Grid error condition */
  122.   #define ENGINE_STRING_ERROR          0x00008000    /* Invalid MGRS, GEOREF or BNG String */
  123. /* GEOREF specific error conditions */
  124.   #define ENGINE_STR_LON_MIN_ERROR     0x00010000    /* GEOREF string long. min. error */
  125.   #define ENGINE_STR_LAT_MIN_ERROR     0x00020000    /* GEOREF string lat. min. error */
  126. /* Equidistant Cylindrical error condition */   
  127.   #define ENGINE_STDP_ERROR            0x00040000    /* Standard parallel error */
  128. /* Azimuthal Equidistant error condition */
  129.   #define ENGINE_PROJECTION_ERROR      0x00080000    /* Point projects into a circle of radius PI*R */
  130. /* Oblique Mercator error conditions */
  131.   #define ENGINE_LAT1_ERROR            0x00100000    /* Invalid 1st Latitude */
  132.   #define ENGINE_LON1_ERROR            0x00200000    /* Invalid 1st Longitude */
  133.   #define ENGINE_LAT2_ERROR            0x00400000    /* Invalid 2nd Latitude */
  134.   #define ENGINE_LON2_ERROR            0x00800000    /* Invalid 2nd Longitude */
  135.   #define ENGINE_LAT1_LAT2_ERROR       0x01000000    /* 1st & 2nd Latitudes cannot be equal */
  136. /* British National Grid error condition */
  137.   #define ENGINE_INVALID_AREA_ERROR    0x02000000    /* Coordinate outside BNG grid */
  138. /* British National Grid, New Zealand Map Grid error condition */
  139.   #define ENGINE_ELLIPSOID_CODE_ERROR  0x04000000    /* Invalid ellipsoid */
  140. /* Common status codes */
  141.   #define ENGINE_NO_ERROR              0x00000000    /* no error */ 
  142.   #define ENGINE_LAT_ERROR             0x10000000    /* Invalid Latitude */
  143.   #define ENGINE_LON_ERROR             0x20000000    /* Invalid Longitude */
  144.   #define ENGINE_A_ERROR               0x40000000    /* Invalid Ellipsoid Semi-Major Axis */
  145.   #define ENGINE_INV_F_ERROR           0x80000000    /* Invalid Inverse Flattening */
  146. /* Symbolic constants */   
  147.   #define NUMBER_COORD_SYS             32  /* Number of coordinate systems        */
  148.   #define COORD_SYS_CODE_LENGTH         3  /* Length of coordinate system codes (including null) */
  149.   #define COORD_SYS_NAME_LENGTH        50  /* Max length of coordinate system names (including null) */
  150.   #define DATUM_CODE_LENGTH             7  /* Length of datum codes (including null) */
  151.   #define DATUM_NAME_LENGTH            33  /* Max length of datum names (including null) */
  152.   #define ELLIPSOID_CODE_LENGTH         3  /* Length of ellipsoid codes (including null) */
  153.   #define ELLIPSOID_NAME_LENGTH        30  /* Max length of ellipsoid names (including null) */
  154.   #define CONVERT_MSG_LENGTH         2048  /* Max length of coordinate conversion status message */
  155.   #define RETURN_MSG_LENGTH           256  /* Max length of return code status message */
  156. /***************************************************************************/
  157. /*
  158.  *                          GLOBAL DECLARATIONS
  159.  */
  160. /* State Enumerations */
  161. typedef enum Input_Output
  162. {
  163.   Input = 0,
  164.   Output = 1
  165. } Input_or_Output;
  166. typedef enum File_Interactive
  167. {
  168.   File = 0,
  169.   Interactive = 1
  170. } File_or_Interactive;
  171. /* Coordinate Type Enumeration */
  172. typedef enum Coordinate_Types
  173. {
  174.   Geodetic,
  175.   GEOREF,
  176.   Geocentric,
  177.   Local_Cartesian,    
  178.   MGRS,
  179.   UTM,
  180.   UPS,
  181.   Albers_Equal_Area_Conic,
  182.   Azimuthal_Equidistant,
  183.   BNG,
  184.   Bonne,
  185.   Cassini,
  186.   Cylindrical_Equal_Area,
  187.   Eckert4,
  188.   Eckert6,
  189.   Equidistant_Cylindrical,
  190.   Gnomonic,
  191.   Lambert_Conformal_Conic,
  192.   Mercator,
  193.   Miller_Cylindrical,
  194.   Mollweide,
  195.   Neys,
  196.   NZMG,
  197.   Oblique_Mercator,
  198.   Orthographic,
  199.   Polar_Stereo,
  200.   Polyconic,
  201.   Sinusoidal,
  202.   Stereographic,
  203.   Transverse_Cylindrical_Equal_Area,
  204.   Transverse_Mercator,
  205.   Van_der_Grinten
  206. } Coordinate_Type;
  207. /* Precision Enumeration */
  208. typedef enum Precisions
  209. {
  210.   Degree,                /* 100000m */
  211.   Ten_Minutes,           /* 10000m */
  212.   Minute,                /* 1000m */
  213.   Ten_Seconds,           /* 100m */
  214.   Second,                /* 10m */
  215.   Tenth_of_Second,       /* 1m */
  216.   Hundredth_of_Second,   /* 0.1m */
  217.   Thousandth_of_Second,  /* 0.01 */
  218.   Ten_Thousandth_of_Second  /* 0.001m */
  219. } Precision;
  220. /* Heights */
  221. typedef enum Height_Types
  222. {
  223.   No_Height,
  224.   Ellipsoid_Height,
  225.   Geoid_or_MSL_Height
  226. } Height_Type;
  227. /* Datums */
  228. typedef enum Define_Datum_Types
  229. {
  230.   Three_Param_Datum_Type,
  231.   Seven_Param_Datum_Type,
  232.   WGS84_Datum_Type,
  233.   WGS72_Datum_Type
  234. } Define_Datum_Type; 
  235. /* Geocentric Coordinate Tuple Definition */
  236. typedef struct Geocentric_Tuple_Structure
  237. {
  238.   double  x;   /* meters */
  239.   double  y;   /* meters */
  240.   double  z;   /* meters */
  241. } Geocentric_Tuple;
  242. /* Geodetic Coordinate System Definition */
  243. typedef struct Geodetic_Structure
  244. {
  245.   Height_Type  height_type;
  246. } Geodetic_Parameters;
  247. /* Geodetic Coordinate Tuple Definition */
  248. typedef struct Geodetic_Tuple_Structure
  249. {
  250.   double  longitude;   /* radians */
  251.   double  latitude;    /* radians */
  252.   double  height;      /* meters */
  253. } Geodetic_Tuple;
  254. /* GEOREF Coordinate Tuple Definition */
  255. typedef struct GEOREF_Tuple_Structure
  256. {
  257.   char    string[21];
  258. } GEOREF_Tuple;
  259. /* Albers Equal Area Conic Coordinate System Definition */
  260. typedef struct Albers_Equal_Area_Conic_Structure
  261. {
  262.   double  origin_latitude;   /* radians */
  263.   double  central_meridian;  /* radians */
  264.   double  std_parallel_1;    /* radians */
  265.   double  std_parallel_2;    /* radians */
  266.   double  false_easting;     /* meters */
  267.   double  false_northing;    /* meters */
  268. } Albers_Equal_Area_Conic_Parameters;
  269. /* Albers Equal Area Conic Coordinate Tuple Definition */
  270. typedef struct Albers_Equal_Area_Conic_Tuple_Structure
  271. {
  272.   double  easting;     /* meters */
  273.   double  northing;    /* meters */
  274. } Albers_Equal_Area_Conic_Tuple;
  275. /* Azimuthal Equidistant Coordinate System Definition */
  276. typedef struct Azimuthal_Equidistant_Structure
  277. {
  278.   double  origin_latitude;   /* radians */
  279.   double  central_meridian;  /* radians */
  280.   double  false_easting;     /* meters */
  281.   double  false_northing;    /* meters */
  282. } Azimuthal_Equidistant_Parameters;
  283. /* Azimuthal Equidistant Coordinate Tuple Definition */
  284. typedef struct Azimuthal_Equidistant_Tuple_Structure
  285. {
  286.   double  easting;     /* meters */
  287.   double  northing;    /* meters */
  288. } Azimuthal_Equidistant_Tuple;
  289. /* BNG Coordinate Tuple Definition */
  290. typedef struct BNG_Tuple_Structure
  291. {
  292.   char string[21];
  293. } BNG_Tuple;
  294. /* Bonne Coordinate System Definition */
  295. typedef struct Bonne_Structure
  296. {
  297.   double  origin_latitude;   /* radians */
  298.   double  central_meridian;  /* radians */
  299.   double  false_easting;     /* meters */
  300.   double  false_northing;    /* meters */
  301. } Bonne_Parameters;
  302. /* Bonne Coordinate Tuple Definition */
  303. typedef struct Bonne_Tuple_Structure
  304. {
  305.   double  easting;     /* meters */
  306.   double  northing;    /* meters */
  307. } Bonne_Tuple;
  308. /* Cassini Coordinate System Definition */
  309. typedef struct Cassini_Structure
  310. {
  311.   double  origin_latitude;   /* radians */
  312.   double  central_meridian;  /* radians */
  313.   double  false_easting;     /* meters */
  314.   double  false_northing;    /* meters */
  315. } Cassini_Parameters;
  316. /* Cassini Coordinate Tuple Definition */
  317. typedef struct Cassini_Tuple_Structure
  318. {
  319.   double  easting;     /* meters */
  320.   double  northing;    /* meters */
  321. } Cassini_Tuple;
  322. /* Cylindrical Equal Area Coordinate System Definition */
  323. typedef struct Cylindrical_Equal_Area_Structure
  324. {
  325.   double  origin_latitude;   /* radians */
  326.   double  central_meridian;  /* radians */
  327.   double  false_easting;     /* meters */
  328.   double  false_northing;    /* meters */
  329. } Cylindrical_Equal_Area_Parameters;
  330. /* Cylindrical Equal Area Coordinate Tuple Definition */
  331. typedef struct Cylindrical_Equal_Area_Tuple_Structure
  332. {
  333.   double  easting;     /* meters */
  334.   double  northing;    /* meters */
  335. } Cylindrical_Equal_Area_Tuple;
  336. /* Eckert IV Coordinate System Definition */
  337. typedef struct Eckert4_Structure
  338. {
  339.   double  central_meridian;  /* radians */
  340.   double  false_easting;     /* meters */
  341.   double  false_northing;    /* meters */
  342. } Eckert4_Parameters;
  343. /* Eckert IV Coordinate Tuple Definition */
  344. typedef struct Eckert4_Tuple_Structure
  345. {
  346.   double  easting;     /* meters */
  347.   double  northing;    /* meters */
  348. } Eckert4_Tuple;
  349. /* Eckert VI Coordinate System Definition */
  350. typedef struct Eckert6_Structure
  351. {
  352.   double  central_meridian;  /* radians */
  353.   double  false_easting;     /* meters */
  354.   double  false_northing;    /* meters */
  355. } Eckert6_Parameters;
  356. /* Eckert VI Coordinate Tuple Definition */
  357. typedef struct Eckert6_Tuple_Structure
  358. {
  359.   double  easting;     /* meters */
  360.   double  northing;    /* meters */
  361. } Eckert6_Tuple;
  362. /* Equidistant Cylindrical Coordinate System Definition */
  363. typedef struct Equidistant_Cylindrical_Structure
  364. {
  365.   double  std_parallel;      /* radians */
  366.   double  central_meridian;  /* radians */
  367.   double  false_easting;     /* meters */
  368.   double  false_northing;    /* meters */
  369. } Equidistant_Cylindrical_Parameters;
  370. /* Equidistant Cylindrical Coordinate Tuple Definition */
  371. typedef struct Equidistant_Cylindrical_Tuple_Structure
  372. {
  373.   double  easting;     /* meters */
  374.   double  northing;    /* meters */
  375. } Equidistant_Cylindrical_Tuple;
  376. /* Gnomonic Coordinate System Definition */
  377. typedef struct Gnomonic_Structure
  378. {
  379.   double  origin_latitude;   /* radians */
  380.   double  central_meridian;  /* radians */
  381.   double  false_easting;     /* meters */
  382.   double  false_northing;    /* meters */
  383. } Gnomonic_Parameters;
  384. /* Gnomonic Coordinate Tuple Definition */
  385. typedef struct Gnomonic_Tuple_Structure
  386. {
  387.   double  easting;     /* meters */
  388.   double  northing;    /* meters */
  389. } Gnomonic_Tuple;
  390. /* Lambert Conformal Conic System Definition */
  391. typedef struct Lambert_Conformal_Conic_Structure
  392. {
  393.   double  origin_latitude;   /* radians */
  394.   double  central_meridian;  /* radians */
  395.   double  std_parallel_1;  /* radians */
  396.   double  std_parallel_2;  /* radians */
  397.   double  false_easting;     /* meters */
  398.   double  false_northing;    /* meters */
  399. } Lambert_Conformal_Conic_Parameters;
  400. /* Lambert Conformal Conic Coordinate Tuple Definition */
  401. typedef struct Lambert_Conformal_Conic_Tuple_Structure
  402. {
  403.   double  easting;     /* meters */
  404.   double  northing;    /* meters */
  405. } Lambert_Conformal_Conic_Tuple;
  406. /* Local Cartesian Coordinate System Definition */
  407. typedef struct Local_Cartesian_Structure
  408. {
  409.   double  origin_latitude;  /* radians */
  410.   double  origin_longitude; /* radians */
  411.   double  origin_height;    /* meters */
  412.   double  orientation;      /* radians clockwise from north */
  413. } Local_Cartesian_Parameters;
  414. /* Local Cartesian Coordinate Tuple Definition */
  415. typedef struct Local_Cartesian_Tuple_Structure
  416. {
  417.   double  x;  /* meters */
  418.   double  y;  /* meters */
  419.   double  z;  /* meters */
  420. } Local_Cartesian_Tuple;
  421. /* Mercator Coordinate System Definition */
  422. typedef struct Mercator_Structure
  423. {
  424.   double  origin_latitude;   /* radians */
  425.   double  central_meridian;  /* radians */
  426.   double  scale_factor;      /* unitless */
  427.   double  false_easting;     /* meters */
  428.   double  false_northing;    /* meters */
  429. } Mercator_Parameters;
  430. /* Mercator Coordinate Tuple Definition */
  431. typedef struct Mercator_Tuple_Structure
  432. {
  433.   double  easting;     /* meters */
  434.   double  northing;    /* meters */
  435. } Mercator_Tuple;
  436. /* MGRS Coordinate Tuple Definition */
  437. typedef struct MGRS_Tuple_Structure
  438. {
  439.   char    string[21];
  440. } MGRS_Tuple;
  441. /* Miller Cylindrical Coordinate System Definition */
  442. typedef struct Miller_Cylindrical_Structure
  443. {
  444.   double  central_meridian;  /* radians */
  445.   double  false_easting;     /* meters */
  446.   double  false_northing;    /* meters */
  447. } Miller_Cylindrical_Parameters;
  448. /* Miller Cylindrical Coordinate Tuple Definition */
  449. typedef struct Miller_Cylindrical_Tuple_Structure
  450. {
  451.   double  easting;     /* meters */
  452.   double  northing;    /* meters */
  453. } Miller_Cylindrical_Tuple;
  454. /* Mollweide Coordinate System Definition */
  455. typedef struct Mollweide_Structure
  456. {
  457.   double  central_meridian;  /* radians */
  458.   double  false_easting;     /* meters */
  459.   double  false_northing;    /* meters */
  460. } Mollweide_Parameters;
  461. /* Mollweide Coordinate Tuple Definition */
  462. typedef struct Mollweide_Tuple_Structure
  463. {
  464.   double  easting;     /* meters */
  465.   double  northing;    /* meters */
  466. } Mollweide_Tuple;
  467. /* Ney's (Modified Lambert Conformal Conic) System Definition */
  468. typedef struct Neys_Structure
  469. {
  470.   double  origin_latitude;   /* radians */
  471.   double  central_meridian;  /* radians */
  472.   double  std_parallel_1;    /* radians */
  473.   double  false_easting;     /* meters */
  474.   double  false_northing;    /* meters */
  475. } Neys_Parameters;
  476. /* Ney's (Modified Lambert Conformal Conic) Coordinate Tuple Definition */
  477. typedef struct Neys_Tuple_Structure
  478. {
  479.   double  easting;     /* meters */
  480.   double  northing;    /* meters */
  481. } Neys_Tuple;
  482. /* New Zealand Map Grid Coordinate Tuple Definition */
  483. typedef struct NZMG_Tuple_Structure
  484. {
  485.   double  easting;     /* meters */
  486.   double  northing;    /* meters */
  487. } NZMG_Tuple;
  488. /* Oblique Mercator Coordinate System Definition */
  489. typedef struct Oblique_Mercator_Structure
  490. {
  491.   double  origin_latitude;   /* radians */
  492.   double  latitude_1;        /* radians */
  493.   double  longitude_1;       /* radians */
  494.   double  latitude_2;        /* radians */
  495.   double  longitude_2;       /* radians */
  496.   double  scale_factor;      /* unitless */
  497.   double  false_easting;     /* meters */
  498.   double  false_northing;    /* meters */
  499. } Oblique_Mercator_Parameters;
  500. /* Oblique Mercator Coordinate Tuple Definition */
  501. typedef struct Oblique_Mercator_Tuple_Structure
  502. {
  503.   double  easting;     /* meters */
  504.   double  northing;    /* meters */
  505. } Oblique_Mercator_Tuple;
  506. /* Orthographic Coordinate System Definition */
  507. typedef struct Orthographic_Structure
  508. {
  509.   double  origin_latitude;   /* radians */
  510.   double  central_meridian;  /* radians */
  511.   double  false_easting;     /* meters */
  512.   double  false_northing;    /* meters */
  513. } Orthographic_Parameters;
  514. /* Orthographic Coordinate Tuple Definition */
  515. typedef struct Orthographic_Tuple_Structure
  516. {
  517.   double  easting;     /* meters */
  518.   double  northing;    /* meters */
  519. } Orthographic_Tuple;
  520. /* Polar Stereographic Coordinate System Definition */
  521. typedef struct Polar_Stereo_Structure
  522. {
  523.   double  latitude_of_true_scale;   /* radians */
  524.   double  longitude_down_from_pole; /* radians */
  525.   double  false_easting;     /* meters */
  526.   double  false_northing;    /* meters */
  527. } Polar_Stereo_Parameters;
  528. /* Polar Stereographic Coordinate Tuple Definition */
  529. typedef struct Polar_Stereo_Tuple_Structure
  530. {
  531.   double  easting;     /* meters */
  532.   double  northing;    /* meters */
  533. } Polar_Stereo_Tuple;
  534. /* Polyconic Coordinate System Definition */
  535. typedef struct Polyconic_Structure
  536. {
  537.   double  origin_latitude;   /* radians */
  538.   double  central_meridian;  /* radians */
  539.   double  false_easting;     /* meters */
  540.   double  false_northing;    /* meters */
  541. } Polyconic_Parameters;
  542. /* Polyconic Coordinate Tuple Definition */
  543. typedef struct Polyconic_Tuple_Structure
  544. {
  545.   double  easting;     /* meters */
  546.   double  northing;    /* meters */
  547. } Polyconic_Tuple;
  548. /* Sinusoidal Coordinate System Definition */
  549. typedef struct Sinusoidal_Structure
  550. {
  551.   double  central_meridian;  /* radians */
  552.   double  false_easting;     /* meters */
  553.   double  false_northing;    /* meters */
  554. } Sinusoidal_Parameters;
  555. /* Sinusoidal Coordinate Tuple Definition */
  556. typedef struct Sinusoidal_Tuple_Structure
  557. {
  558.   double  easting;     /* meters */
  559.   double  northing;    /* meters */
  560. } Sinusoidal_Tuple;
  561. /* Stereographic Coordinate System Definition */
  562. typedef struct Stereographic_Structure
  563. {
  564.   double  origin_latitude;   /* radians */
  565.   double  central_meridian;  /* radians */
  566.   double  false_easting;     /* meters */
  567.   double  false_northing;    /* meters */
  568. } Stereographic_Parameters;
  569. /* Stereographic Coordinate Tuple Definition */
  570. typedef struct Stereographic_Tuple_Structure
  571. {
  572.   double  easting;     /* meters */
  573.   double  northing;    /* meters */
  574. } Stereographic_Tuple;
  575. /* Transverse Cylindrical Equal Area Coordinate System Definition */
  576. typedef struct Transverse_Cylindrical_Equal_Area_Structure
  577. {
  578.   double  origin_latitude;   /* radians */
  579.   double  central_meridian;  /* radians */
  580.   double  scale_factor;      /* unitless */
  581.   double  false_easting;     /* meters */
  582.   double  false_northing;    /* meters */
  583. } Transverse_Cylindrical_Equal_Area_Parameters;
  584. /* Transverse Cylindrical Equal Area Coordinate Tuple Definition */
  585. typedef struct Transverse_Cylindrical_Equal_Area_Tuple_Structure
  586. {
  587.   double  easting;     /* meters */
  588.   double  northing;    /* meters */
  589. } Transverse_Cylindrical_Equal_Area_Tuple;
  590. /* Transverse Mercator Coordinate System Definition */
  591. typedef struct Transverse_Mercator_Structure
  592. {
  593.   double  origin_latitude;   /* radians */
  594.   double  central_meridian;  /* radians */
  595.   double  scale_factor;      /* unitless */
  596.   double  false_easting;     /* meters */
  597.   double  false_northing;    /* meters */
  598. } Transverse_Mercator_Parameters;
  599. /* Transverse Mercator Coordinate Tuple Definition */
  600. typedef struct Transverse_Mercator_Tuple_Structure
  601. {
  602.   double  easting;     /* meters */
  603.   double  northing;    /* meters */
  604. } Transverse_Mercator_Tuple;
  605. /* UPS Coordinate Tuple Definition */
  606. typedef struct UPS_Tuple_Structure
  607. {
  608.   double  easting;     /* meters */
  609.   double  northing;    /* meters */
  610.   char    hemisphere;  /* "N" or "S" */
  611. } UPS_Tuple;
  612. /* UTM Coordinate System Definition */
  613. typedef struct UTM_Structure
  614. {
  615.   long     zone;     /* 1..60 */
  616.   long     override; /* 0 or 1 */
  617. } UTM_Parameters;
  618. /* UTM Coordinate Tuple Definition */
  619. typedef struct UTM_Tuple_Structure
  620. {
  621.   double  easting;     /* meters */
  622.   double  northing;    /* meters */
  623.   long    zone;        /* 1..60 */
  624.   char    hemisphere;  /* "N" or "S" */
  625. }  UTM_Tuple;
  626. /* Van Der Grinten Coordinate System Definition */
  627. typedef struct Van_der_Grinten_Structure
  628. {
  629.   double  central_meridian;  /* radians */
  630.   double  false_easting;     /* meters */
  631.   double  false_northing;    /* meters */
  632. } Van_der_Grinten_Parameters;
  633. /* Van Der Grinten Coordinate Tuple Definition */
  634. typedef struct Van_der_Grinten_Tuple_Structure
  635. {
  636.   double  easting;     /* meters */
  637.   double  northing;    /* meters */
  638. } Van_der_Grinten_Tuple;
  639. /***************************************************************************/
  640. /*
  641.  *                              FUNCTION PROTOTYPES
  642.  *                                for ENGINE.C
  643.  */
  644. /* ensure proper linkage to c++ programs */
  645.   #ifdef __cplusplus
  646. extern "C" {
  647.   #endif
  648. long Initialize_Engine();
  649. /*
  650.  *  The function Initialize_Engine sets the initial state of the engine in
  651.  *  in preparation for coordinate conversion and/or datum transformation
  652.  *  operations.
  653.  */
  654. long Get_Coordinate_System_Count ( long *Count );
  655. /*
  656.  *   Count    : The number of coordinate systems supported. (output) 
  657.  *
  658.  * The function Get_Coordinate_System_Count returns the number of coordinate
  659.  * systems (including projections and grids) that are supported.
  660.  */
  661. long Get_Coordinate_System_Index ( const char *Code,
  662.                                    long *Index );
  663. /*
  664.  *    Code     : 2-letter coordinate system code.              (input)
  665.  *    Index    : Index of the coordinate system with the specified code
  666.  *                                                             (output)
  667.  *
  668.  *  The function Get_Coordinate_System_Index returns the index of the coordinate
  669.  *  system with the specified code.  If the specified Code is found, 
  670.  *  ENGINE_NO_ERROR is returned, otherwise ENGINE_INVALID_CODE_ERROR is 
  671.  *  returned.
  672.  */
  673. long Get_Coordinate_System_Type ( const long Index,
  674.                                   Coordinate_Type *System ); 
  675. /*
  676.  *    Index   : Index of a specific coordinate system            (input)
  677.  *    System  : Type of the coordinate system referencd by index (output)
  678.  *
  679.  *  The Function Get_Coordinate_System_Type returns the type of the coordinate 
  680.  *  system with the specified index.  If theh index is valid, ENGINE_NO_ERROR is 
  681.  *  returned, otherwise ENGINE_INVALID_INDEX_ERROR is returned.
  682.  */
  683. long Get_Coordinate_System_Name ( const long Index, 
  684.                                   char *Name );
  685. /*
  686.  *    Index   : Index of a specific coordinate system            (input)
  687.  *    Name    : Name of the coordinate system referencd by index (output)
  688.  *
  689.  *  The Function Get_Coordinate_System_Name returns the name of the coordinate 
  690.  *  system with the specified index.  If theh index is valid, ENGINE_NO_ERROR is 
  691.  *  returned, otherwise ENGINE_INVALID_INDEX_ERROR is returned.
  692.  */
  693. long Get_Coordinate_System_Code ( const long Index,
  694.                                   char *Code );
  695. /*
  696.  *    Index   : Index of a specific coordinate system            (input)
  697.  *    Code    : 2-letter coordinate system code.                 (output)
  698.  *
  699.  *  The Function Get_Coordinate_System_Code returns the 2-letter code for the 
  700.  *  coordinate system with the specified index.  If index is valid, ENGINE_NO_ERROR  
  701.  *  is returned, otherwise ENGINE_INVALID_INDEX_ERROR is returned.
  702.  */
  703. long Set_Coordinate_System
  704. ( const File_or_Interactive State,
  705.   const Input_or_Output     Direction,
  706.   const Coordinate_Type     System );
  707. /*
  708.  *  The function Set_Coordinate_System sets the coordinate system for the 
  709.  *  specified state to the specified coordinate system type.
  710.  *  State      : Indicates whether the coordinate system is to be used for 
  711.  *               interactive or file processing                        (input)
  712.  *  Direction  : Indicates whether the coordinate system is to be used for 
  713.  *               input or output                                       (input)
  714.  *  System     : Identifies the coordinate system to be used           (input)
  715.  */
  716. long Get_Coordinate_System
  717. ( const File_or_Interactive State,
  718.   const Input_or_Output     Direction,
  719.   Coordinate_Type           *System );
  720. /*
  721.  *  The function Get_Coordinate_System returns the current coordinate system  
  722.  *  type for the specified state.
  723.  *  State      : Indicates whether the coordinate system is to be used for 
  724.  *               interactive or file processing                        (input)
  725.  *  Direction  : Indicates whether the coordinate system is to be used for 
  726.  *               input or output                                       (input)
  727.  *  System     : Identifies current coordinate system type             (output)
  728.  */
  729. long Get_Datum_Count ( long *Count );
  730. /*
  731.  *  The function Get_Datum_Count returns the number of Datums in the table
  732.  *  if the table was initialized without error.
  733.  *
  734.  *  Count   : number of datums in the datum table                   (output)
  735.  */
  736. long Get_Datum_Index ( const char *Code, 
  737.                        long *Index );
  738. /*
  739.  *  The function Get_Datum_Index returns the index of the datum with the 
  740.  *  specified code.
  741.  *
  742.  *  Code    : The datum code being searched for                     (input)
  743.  *  Index   : The index of the datum in the table with the          (output)
  744.  *              specified code
  745.  */
  746. long Get_Datum_Name ( const long Index,
  747.                       char *Name );
  748. /*
  749.  *  The function Get_Datum_Name returns the name of the datum referenced by
  750.  *  index.
  751.  *
  752.  *  Index   : The index of a given datum in the datum table         (input)
  753.  *  Name    : The datum name of the datum referenced by index       (output)
  754.  */
  755. long Get_Datum_Code ( const long Index,
  756.                       char *Code );
  757. /*
  758.  *  The function Get_Datum_Code returns the 5-letter code of the datum
  759.  *  referenced by index.
  760.  *
  761.  *  Index   : The index of a given datum in the datum table         (input)
  762.  *  Code    : The datum code of the datum referenced by index       (output)
  763.  */
  764. long Get_Datum_Ellipsoid_Code ( const long Index,
  765.                                 char *Code );
  766. /*
  767.  *  The function Get_Datum_Ellipsoid_Code returns the 2-letter ellipsoid code 
  768.  *  for the ellipsoid associated with the datum referenced by index.
  769.  *
  770.  *  Index   : The index of a given datum in the datum table           (input)
  771.  *  Code    : The ellisoid code for the ellipsoid associated with the (output)
  772.  *               datum referenced by index 
  773.  */
  774. long Get_Datum_Type (const long Index,
  775.                      Define_Datum_Type *Type);
  776. /*
  777.  *  The function Get_Datum_Type returns the type of the datum referenced by
  778.  *  index.
  779.  *
  780.  *  Index   : The index of a given datum in the datum table.        (input)
  781.  *  Type    : The type of datum referenced by index.                (output)
  782.  */
  783. long Get_Datum_Seven_Parameters (const long Index, 
  784.                                  double *Delta_X,                             
  785.                                  double *Delta_Y,
  786.                                  double *Delta_Z,
  787.                                  double *Rx, 
  788.                                  double *Ry, 
  789.                                  double *Rz, 
  790.                                  double *Scale_Factor);
  791. /*
  792.  *   The function Get_Datum_Seven_Parameters returns the seven parameters 
  793.  *   for the datum referenced by index.
  794.  *
  795.  *    Index      : The index of a given datum in the datum table.  (input)
  796.  *    Delta_X    : X translation in meters                         (output)
  797.  *    Delta_Y    : Y translation in meters                         (output)
  798.  *    Delta_Z    : Z translation in meters                         (output)
  799.  *    Rx         : X rotation in radians                           (output)
  800.  *    Rx         : Y rotation in radians                           (output)
  801.  *    Ry         : Z rotation in radians                           (output)
  802.  *    Scale_Factor : Scale factor                                  (output)
  803.  */
  804. long Get_Datum_Three_Parameters (const long Index, 
  805.                                  double *Delta_X,
  806.                                  double *Delta_Y,
  807.                                  double *Delta_Z);
  808. /*
  809.  *   The function Get_Datum_Three_Parameters returns the three parameters
  810.  *   for the datum referenced by index.
  811.  *
  812.  *    Index      : The index of a given datum in the datum table.  (input)
  813.  *    Delta_X    : X translation in meters                         (output)
  814.  *    Delta_Y    : Y translation in meters                         (output)
  815.  *    Delta_Z    : Z translation in meters                         (output)
  816.  */
  817. long Get_Datum_Errors (const long Index, 
  818.                        double *Sigma_X,
  819.                        double *Sigma_Y,
  820.                        double *Sigma_Z);
  821. /*
  822.  *   The function Get_Datum_Errors returns the standard errors in X,Y, & Z 
  823.  *   for the datum referenced by index.
  824.  *
  825.  *    Index      : The index of a given datum in the datum table   (input)
  826.  *    Sigma_X    : Standard error in X in meters                   (output)
  827.  *    Sigma_Y    : Standard error in Y in meters                   (output)
  828.  *    Sigma_Z    : Standard error in Z in meters                   (output)
  829.  */
  830. long Get_Datum_Valid_Rectangle (const long Index,
  831.                                 double *South_latitude,
  832.                                 double *North_latitude,
  833.                                 double *West_longitude,
  834.                                 double *East_longitude);
  835. /*
  836.  *   The function Get_Datum_Valid_Rectangle returns the edges of the validity 
  837.  *   rectangle for the datum referenced by index.
  838.  *
  839.  *   Index          : The index of a given datum in the datum table   (input)
  840.  *   South_latitude : Southern edge of validity rectangle in radians  (output)
  841.  *   North_latitude : Northern edge of validity rectangle in radians  (output)
  842.  *   West_longitude : Western edge of validity rectangle in radians   (output)
  843.  *   East_longitude : Eastern edge of validity rectangle in radians   (output)
  844.  */
  845. long Check_Datum_User_Defined ( const long Index,
  846.                                 long *result );
  847. /*
  848.  *    Index    : Index of a given datum in the datum table (input)
  849.  *    result   : Indicates whether specified datum is user defined (1)
  850.  *               or not (0)                                (output)
  851.  *
  852.  *  The function Check_Datum_User_Defined checks whether or not the specified datum is 
  853.  *  user defined. It returns 1 if the datum is user defined, and returns
  854.  *  0 otherwise.  
  855.  */
  856. long Check_Valid_Datum(const long Index,
  857.                        double latitude,
  858.                        double longitude,
  859.                        long *result);
  860. /*
  861.  *  The function Check_Valid_Datum checks whether or not the specified location is within the 
  862.  *  validity rectangle for the specified datum.  It returns zero if the specified
  863.  *  location is NOT within the validity rectangle, and returns 1 otherwise.
  864.  *
  865.  *   Index     : The index of a given datum in the datum table      (input)
  866.  *   latitude  : Latitude of the location to be checked in radians  (input)
  867.  *   longitude : Longitude of the location to be checked in radians (input)
  868.  *   result    : Indicates whether location is inside (1) or outside (0)
  869.  *               of the validity rectangle of the specified datum   (output)
  870.  */
  871. long Set_Datum
  872. ( const File_or_Interactive State,
  873.   const Input_or_Output     Direction,
  874.   const long                Index );
  875. /*
  876.  *  The function Set_Datum sets the datum for the specified state to the 
  877.  *  datum corresponding to the specified index.
  878.  *  State      : Indicates whether the datum is to be used for interactive 
  879.  *               or file processing                                    (input)
  880.  *  Direction  : Indicates whether the datum is to be used for input or 
  881.  *               output                                                (input)
  882.  *  Index      : Identifies the index of the datum to be used          (input)
  883.  */
  884. long Get_Datum
  885. ( const File_or_Interactive State,
  886.   const Input_or_Output     Direction,
  887.   long                      *Index );
  888. /*
  889.  *  The function Get_Datum returns the index of the current datum for the 
  890.  *  specified state. 
  891.  *  State      : Indicates whether the datum is to be used for interactive 
  892.  *               or file processing                                    (input)
  893.  *  Direction  : Indicates whether the datum is to be used for input or 
  894.  *               output                                                (input)
  895.  *  Index      : Identifies the index of the current datum             (input)
  896.  */
  897. long Define_Datum ( const char *Code,
  898.                     const char *Name,
  899.                     const char *Ellipsoid_Code,
  900.                     double Delta_X,
  901.                     double Delta_Y,
  902.                     double Delta_Z,
  903.                     double Sigma_X,
  904.                     double Sigma_Y,
  905.                     double Sigma_Z,
  906.                     double South_latitude,
  907.                     double North_latitude,
  908.                     double West_longitude,
  909.                     double East_longitude);
  910. /*
  911.  *   Code           : 5-letter new datum code.                      (input)
  912.  *   Name           : Name of the new datum                         (input)
  913.  *   Ellipsoid_Code : 2-letter code for the associated ellipsoid    (input)
  914.  *   Delta_X        : X translation to WGS84 in meters              (input)
  915.  *   Delta_Y        : Y translation to WGS84 in meters              (input)
  916.  *   Delta_Z        : Z translation to WGS84 in meters              (input)
  917.  *   Sigma_X        : Standard error in X in meters                 (input)
  918.  *   Sigma_Y        : Standard error in Y in meters                 (input)
  919.  *   Sigma_Z        : Standard error in Z in meters                 (input)
  920.  *   South_latitude : Southern edge of validity rectangle in radians(input)
  921.  *   North_latitude : Northern edge of validity rectangle in radians(input)
  922.  *   West_longitude : Western edge of validity rectangle in radians (input)
  923.  *   East_longitude : Eastern edge of validity rectangle in radians (input)
  924.  *
  925.  * The function Define_Datum creates a new local (3-parameter) datum with the 
  926.  * specified code, name, shift values, and standard error values.  If the 
  927.  * datum table has not been initialized, the specified code is already in use, 
  928.  * or a new version of the 3-param.dat file cannot be created, an error code 
  929.  * is returned, otherwise ENGINE_NO_ERROR is returned.  Note that the indexes 
  930.  * of all datums in the datum table may be changed by this function.
  931.  */
  932. long Remove_Datum (const char *Code);
  933. /*
  934.  *   Code           : 5-letter new datum code.                      (input)
  935.  *
  936.  * The function Remove_Datum deletes a user defined local (3-parameter) datum  
  937.  * with the specified code.  If the datum table has not been initialized, or 
  938.  * a new version of the 3-param.dat file cannot be created, an error code is
  939.  * returned, otherwise ENGINE_NO_ERROR is returned.  Note that the indexes 
  940.  * of all datums in the datum table may be changed by this function.
  941.  */
  942. long Get_Ellipsoid_Count ( long *Count );
  943. /*
  944.  *   Count    : The number of ellipsoids in the ellipsoid table. (output)
  945.  *
  946.  * The function Get_Ellipsoid_Count returns the number of ellipsoids in the
  947.  * ellipsoid table.  If the ellipsoid table has been initialized without error,
  948.  * ENGINE_NO_ERROR is returned, otherwise ENGINE_NOT_INITIALIZED_ERROR
  949.  * is returned.
  950.  */
  951. long Get_Ellipsoid_Index ( const char *Code,
  952.                            long *Index );
  953. /*
  954.  *    Code     : 2-letter ellipsoid code.                      (input)
  955.  *    Index    : Index of the ellipsoid in the ellipsoid table with the 
  956.  *                  specified code                             (output)
  957.  *
  958.  *  The function Get_Ellipsoid_Index returns the index of the ellipsoid in 
  959.  *  the ellipsoid table with the specified code.  If ellipsoid code is found, 
  960.  *  ENGINE_NO_ERROR is returned, otherwise ENGINE_INVALID_CODE_ERROR is 
  961.  *  returned.
  962.  */
  963. long Get_Ellipsoid_Name ( const long Index, 
  964.                           char *Name );
  965. /*
  966.  *    Index   : Index of a given ellipsoid.in the ellipsoid table with the
  967.  *                 specified index                             (input)
  968.  *    Name    : Name of the ellipsoid referencd by index       (output)
  969.  *
  970.  *  The Function Get_Ellipsoid_Name returns the name of the ellipsoid in 
  971.  *  the ellipsoid table with the specified index.  If index is valid, 
  972.  *  ENGINE_NO_ERROR is returned, otherwise ENGINE_INVALID_INDEX_ERROR is
  973.  *  returned.
  974.  */
  975. long Get_Ellipsoid_Parameters ( const long Index,
  976.                                 double *a,
  977.                                 double *f );
  978. /*
  979.  *    Index    : Index of a given ellipsoid in the ellipsoid table (input)
  980.  *    a        : Semi-major axis, in meters, of ellipsoid          (output)
  981.  *    f        : Flattening of ellipsoid.                          (output)
  982.  *
  983.  *  The function Get_Ellipsoid_Parameters returns the semi-major axis 
  984.  *  and flattening for the ellipsoid with the specified index.  
  985.  */
  986. long Get_Ellipsoid_Code ( const long Index,
  987.                           char *Code );
  988. /*
  989.  *    Index    : Index of a given ellipsoid in the ellipsoid table (input)
  990.  *    Code     : 2-letter ellipsoid code.                          (output)
  991.  *
  992.  *  The Function Get_Ellipsoid_Code returns the 2-letter code for the 
  993.  *  ellipsoid in the ellipsoid table with the specified index.  If index is 
  994.  *  valid, ENGINE_NO_ERROR is returned, otherwise ENGINE_INVALID_INDEX_ERROR 
  995.  *  is returned.
  996.  */
  997. long Get_Ellipsoid_Eccentricity2 ( const long Index,
  998.                                    double *e2 );
  999. /*
  1000.  *    Index    : Index of a given ellipsoid in the ellipsoid table (input)
  1001.  *    e2       : Square of eccentricity of ellipsoid               (output)
  1002.  *
  1003.  *  The function Get_Ellipsoid_Eccentricity2 returns the square of the 
  1004.  *  eccentricity for the ellipsoid with the specified index.  
  1005.  */
  1006. long Check_Ellipsoid_User_Defined ( const long Index,
  1007.                                     long *result );
  1008. /*
  1009.  *    Index    : Index of a given ellipsoid in the ellipsoid table (input)
  1010.  *    result   : Indicates whether specified ellipsoid is user defined (1)
  1011.  *               or not (0)                                        (output)
  1012.  *
  1013.  *  The function Check_Ellipsoid_User_Defined returns 1 if the ellipsoid is user 
  1014.  *  defined.  Otherwise, 0 is returned. 
  1015.  */
  1016. long Define_Ellipsoid (const char* Code,
  1017.                        const char* Name,
  1018.                        double a,
  1019.                        double f);
  1020. /*
  1021.  *   Code     : 2-letter ellipsoid code.                      (input)
  1022.  *   Name     : Name of the new ellipsoid                     (input)
  1023.  *   a        : Semi-major axis, in meters, of new ellipsoid  (input)
  1024.  *   f        : Flattening of new ellipsoid.                  (input)
  1025.  *
  1026.  * The function Define_Ellipsoid creates a new ellipsoid with the specified
  1027.  * code, name, and parameters.  If the ellipsoid table has not been initialized,
  1028.  * the specified code is already in use, or a new version of the ellips.dat 
  1029.  * file cannot be created, an error code is returned, otherwise ENGINE_NO_ERROR 
  1030.  * is returned.  Note that the indexes of all ellipsoids in the ellipsoid
  1031.  * table may be changed by this function.
  1032.  */
  1033. long Remove_Ellipsoid (const char* Code);
  1034. /*
  1035.  *   Code     : 2-letter ellipsoid code.                      (input)
  1036.  *
  1037.  * The function Remove_Ellipsoid deletes a user defined ellipsoid with 
  1038.  * the specified Code.  If the ellipsoid table has not been created,
  1039.  * the specified code is in use by a user defined datum, or a new version   
  1040.  * of the ellips.dat file cannot be created, an error code is returned, 
  1041.  * otherwise ENGINE_NO_ERROR is returned.  Note that the indexes of all  
  1042.  * ellipsoids in the ellipsoid table may be changed by this function.
  1043.  */
  1044. void Set_Precision(Precision Precis);
  1045. /*
  1046.  *  The function Set_Precision sets the output precision to the specified level. 
  1047.  *  Precis     : Indicates the desired level of precision              (input)
  1048.  */
  1049. void Get_Precision(Precision *Precis);
  1050. /*
  1051.  *  The function Get_Precision returns the current level of precision. 
  1052.  *  Precis     : Indicates the current level of precision              (output)
  1053.  */
  1054. long Set_Geocentric_Coordinates
  1055. ( const File_or_Interactive State,
  1056.   const Input_or_Output     Direction,
  1057.   const Geocentric_Tuple    coordinates);
  1058. /*
  1059.  *  The function Set_Geocentric_Coordinates sets the Geocentric coordinates
  1060.  *  for the specified state.. 
  1061.  *  State            : Indicates whether the coordinates are to be set for  
  1062.  *                     interactive or file processing                  (input)
  1063.  *  Direction        : Indicates whether the coordinates are to be set for  
  1064.  *                     input or output                                 (input)
  1065.  *  coordinates      : Geocentric coordinate values to be set          (input)
  1066.  */
  1067. long Get_Geocentric_Coordinates
  1068. ( const File_or_Interactive State,
  1069.   const Input_or_Output     Direction,
  1070.   Geocentric_Tuple          *coordinates);
  1071. /*
  1072.  *  The function Get_Geocentric_Coordinates returns the Geocentric coordinates
  1073.  *  for the specified state.. 
  1074.  *  State            : Indicates whether the coordinates are to be returned for 
  1075.  *                     interactive or file processing                  (input)
  1076.  *  Direction        : Indicates whether the coordinates are to be returned for  
  1077.  *                     input or output                                 (input)
  1078.  *  coordinates      : Geocentric coordinate values to be returned     (output)
  1079.  */
  1080. long Set_Geodetic_Params
  1081. ( const File_or_Interactive State,
  1082.   const Input_or_Output     Direction,
  1083.   const Geodetic_Parameters parameters);
  1084. /*
  1085.  *  The function Set_Geodetic_Params sets the Geodetic coordinate system  
  1086.  *  parameters for the specified state. 
  1087.  *  State        : Indicates whether the parameters are to be set for  
  1088.  *                 interactive or file processing                      (input)
  1089.  *  Direction    : Indicates whether the parameters are to be set for  
  1090.  *                 input or output                                     (input)
  1091.  *  parameters   : Geodetic parameters to be set                       (input)
  1092.  */
  1093. long Get_Geodetic_Params
  1094. ( const File_or_Interactive State,
  1095.   const Input_or_Output     Direction,
  1096.   Geodetic_Parameters       *parameters);
  1097. /*
  1098.  *  The function Get_Geodetic_Params returns the Geodetic coordinate system
  1099.  *  parameters for the specified state. 
  1100.  *  State        : Indicates whether the parameters are to be returned for
  1101.  *                 interactive or file processing                      (input)
  1102.  *  Direction    : Indicates whether the parameters are to be returned for  
  1103.  *                 input or output                                     (input)
  1104.  *  parameters   : Geodetic parameters to be returned                  (output)
  1105.  */
  1106. long Set_Geodetic_Coordinates
  1107. ( const File_or_Interactive State,
  1108.   const Input_or_Output     Direction,
  1109.   const Geodetic_Tuple      coordinates);
  1110. /*
  1111.  *  The function Set_Geodetic_Coordinates sets the Geodetic coordinates
  1112.  *  for the specified state.. 
  1113.  *  State          : Indicates whether the parameters are to be set for  
  1114.  *                   interactive or file processing                    (input)
  1115.  *  Direction      : Indicates whether the parameters are to be set for  
  1116.  *                   input or output                                   (input)
  1117.  *  coordinates    : Geodetic coordinate values to be set              (input)
  1118.  */
  1119. long Get_Geodetic_Coordinates
  1120. ( const File_or_Interactive State,
  1121.   const Input_or_Output     Direction,
  1122.   Geodetic_Tuple            *coordinates);
  1123. /*
  1124.  *  The function Get_Geodetic_Coordinates returns the Geodetic coordinates
  1125.  *  for the specified state.. 
  1126.  *  State          : Indicates whether the coordinates are to be returned for  
  1127.  *                   interactive or file processing                    (input)
  1128.  *  Direction      : Indicates whether the coordinates are to be returned for  
  1129.  *                   input or output                                   (input)
  1130.  *  coordinates    : Geodetic coordinate values to be returned         (output)
  1131.  */
  1132. long Set_GEOREF_Coordinates
  1133. ( const File_or_Interactive State,
  1134.   const Input_or_Output     Direction,
  1135.   const GEOREF_Tuple coordinates);
  1136. /*
  1137.  *  The function Set_GEOREF_Coordinates sets the GEOREF coordinates
  1138.  *  for the specified state.. 
  1139.  *  State        : Indicates whether the coordinates are to be set for  
  1140.  *                 interactive or file processing                      (input)
  1141.  *  Direction    : Indicates whether the coordinates are to be set for  
  1142.  *                 input or output                                     (input)
  1143.  *  coordinates  : GEOREF coordinate string value to be set            (input)
  1144.  */
  1145. long Get_GEOREF_Coordinates
  1146. ( const File_or_Interactive State,
  1147.   const Input_or_Output     Direction,
  1148.   GEOREF_Tuple              *coordinates);
  1149. /*
  1150.  *  The function Get_GEOREF_Coordinates returns the GEOREF coordinates
  1151.  *  for the specified state. 
  1152.  *  State        : Indicates whether the coordinates are to be returned for  
  1153.  *                 interactive or file processing                      (input)
  1154.  *  Direction    : Indicates whether the coordinates are to be returned for 
  1155.  *                 input or output                                     (input)
  1156.  *  coordinates  : GEOREF coordinate string value to be returned       (output)
  1157.  */
  1158. long Set_Albers_Equal_Area_Conic_Params
  1159. ( const File_or_Interactive State,
  1160.   const Input_or_Output     Direction,
  1161.   const Albers_Equal_Area_Conic_Parameters parameters);
  1162. /*
  1163.  *  The function Set_Albers_Equal_Area_Conic_Params sets the Albers Equal
  1164.  *  Area Conic projection parameters for the specified state.
  1165.  *  State        : Indicates whether the parameters are to be set for
  1166.  *                 interactive or file processing                      (input)
  1167.  *  Direction    : Indicates whether the parameters are to be set for
  1168.  *                 input or output                                     (input)
  1169.  *  parameters   : Albers Equal Area Conic projection parameters to be set 
  1170.  *                                                                     (input)
  1171.  */
  1172. long Get_Albers_Equal_Area_Conic_Params
  1173. ( const File_or_Interactive State,
  1174.   const Input_or_Output     Direction,
  1175.   Albers_Equal_Area_Conic_Parameters *parameters);
  1176. /*
  1177.  *  The function Get_Albers_Equal_Area_Conic_Params returns the Albers Equal
  1178.  *  Area Conic projection parameters for the specified state.
  1179.  *  State        : Indicates whether the parameters are to be returned for
  1180.  *                 interactive or file processing                      (input)
  1181.  *  Direction    : Indicates whether the parameters are to be returned for
  1182.  *                 input or output                                     (input)
  1183.  *  parameters   : Albers Equal Area Conic projection parameters to be returned
  1184.  *                                                                     (output)
  1185.  */
  1186. long Set_Albers_Equal_Area_Conic_Coordinates
  1187. ( const File_or_Interactive State,
  1188.   const Input_or_Output     Direction,
  1189.   const Albers_Equal_Area_Conic_Tuple coordinates);
  1190. /*
  1191.  *  The function Set_Albers_Equal_Area_Conic_Coordinates sets the Albers Equal
  1192.  *  Area Conic projection coordinates for the specified state.
  1193.  *  State        : Indicates whether the coordinates are to be set for
  1194.  *                 interactive or file processing                      (input)
  1195.  *  Direction    : Indicates whether the coordinates are to be set for
  1196.  *                 input or output                                     (input)
  1197.  *  coordinates  : Albers Equal Area Conic projection coordinates to be set 
  1198.  *                                                                     (input)
  1199.  */
  1200. long Get_Albers_Equal_Area_Conic_Coordinates
  1201. ( const File_or_Interactive State,
  1202.   const Input_or_Output     Direction,
  1203.   Albers_Equal_Area_Conic_Tuple *coordinates);
  1204. /*
  1205.  *  The function Get_Albers_Equal_Area_Conic_Coordinates returns the Albers Equal
  1206.  *  Area Conic projection coordinates for the specified state.
  1207.  *  State          : Indicates whether the coordinates are to be returned for
  1208.  *                   interactive or file processing                    (input)
  1209.  *  Direction      : Indicates whether the coordinates are to be returned for
  1210.  *                   input or output                                   (input)
  1211.  *  coordinates    : Albers Equal Area Conic projection coordinates to be returned
  1212.  *                                                                     (output)
  1213.  */
  1214. long Set_Azimuthal_Equidistant_Params
  1215. ( const File_or_Interactive State,
  1216.   const Input_or_Output     Direction,
  1217.   const Azimuthal_Equidistant_Parameters parameters);
  1218. /*
  1219.  *  The function Set_Azimuthal_Equidistant_Params sets the Azimuthal Equidistant
  1220.  *  projection parameters for the specified state.
  1221.  *  State        : Indicates whether the parameters are to be set for
  1222.  *                 interactive or file processing                      (input)
  1223.  *  Direction    : Indicates whether the parameters are to be set for
  1224.  *                 input or output                                     (input)
  1225.  *  parameters   : Azimuthal Equidistant projection parameters to be set 
  1226.  *                                                                     (input)
  1227.  */
  1228. long Get_Azimuthal_Equidistant_Params
  1229. ( const File_or_Interactive State,
  1230.   const Input_or_Output     Direction,
  1231.   Azimuthal_Equidistant_Parameters *parameters);
  1232. /*
  1233.  *  The function Get_Azimuthal_Equidistant_Params returns the Azimuthal Equidistant 
  1234.  *  projection parameters for the specified state. 
  1235.  *  State        : Indicates whether the parameters are to be returned for
  1236.  *                 interactive or file processing                      (input)
  1237.  *  Direction    : Indicates whether the parameters are to be returned for  
  1238.  *                 input or output                                     (input)
  1239.  *  parameters   : Azimuthal Equidistant projection parameters to be returned
  1240.  *                                                                     (output)
  1241.  */
  1242. long Set_Azimuthal_Equidistant_Coordinates
  1243. ( const File_or_Interactive State,
  1244.   const Input_or_Output     Direction,
  1245.   const Azimuthal_Equidistant_Tuple coordinates);
  1246. /*
  1247.  *  The function Set_Azimuthal_Equidistant_Coordinates sets the Azimuthal Equidistant 
  1248.  *  projection coordinates for the specified state.
  1249.  *  State        : Indicates whether the coordinates are to be set for
  1250.  *                 interactive or file processing                      (input)
  1251.  *  Direction    : Indicates whether the coordinates are to be set for
  1252.  *                 input or output                                     (input)
  1253.  *  coordinates  : Azimuthal Equidistant projection coordinates to be set 
  1254.  *                                                                     (input)
  1255.  */
  1256. long Get_Azimuthal_Equidistant_Coordinates
  1257. ( const File_or_Interactive State,
  1258.   const Input_or_Output     Direction,
  1259.   Azimuthal_Equidistant_Tuple               *coordinates);
  1260. /*
  1261.  *  The function Get_Azimuthal_Equidistant_Coordinates returns the Azimuthal Equidistant  
  1262.  *  projection coordinates for the specified state.
  1263.  *  State        : Indicates whether the coordinates are to be returned for
  1264.  *                 interactive or file processing                      (input)
  1265.  *  Direction    : Indicates whether the coordinates are to be returned for
  1266.  *                 input or output                                     (input)
  1267.  *  coordinates  : Azimuthal Equidistant projection coordinates to be returned 
  1268.  *                                                                     (output)
  1269.  */
  1270. long Set_BNG_Coordinates
  1271. ( const File_or_Interactive State,
  1272.   const Input_or_Output     Direction,
  1273.   const BNG_Tuple           coordinates);
  1274. /*
  1275.  *  The function Set_BNG_Coordinates sets the BNG coordinates
  1276.  *  for the specified state.. 
  1277.  *  State        : Indicates whether the coordinates are to be set for  
  1278.  *                 interactive or file processing                      (input)
  1279.  *  Direction    : Indicates whether the coordinates are to be set for  
  1280.  *                 input or output                                     (input)
  1281.  *  coordinates  : BNG coordinate string value to be set               (input)
  1282.  */
  1283. long Get_BNG_Coordinates
  1284. ( const File_or_Interactive State,
  1285.   const Input_or_Output     Direction,
  1286.   BNG_Tuple                 *coordinates);
  1287. /*
  1288.  *  The function Get_BNG_Coordinates returns the BNG coordinates
  1289.  *  for the specified state. 
  1290.  *  State        : Indicates whether the coordinates are to be returned for  
  1291.  *                 interactive or file processing                      (input)
  1292.  *  Direction    : Indicates whether the coordinates are to be returned for 
  1293.  *                 input or output                                     (input)
  1294.  *  coordinates  : BNG coordinate string value to be returned          (output)
  1295.  */
  1296. long Set_Bonne_Params
  1297. ( const File_or_Interactive State,
  1298.   const Input_or_Output     Direction,
  1299.   const Bonne_Parameters    parameters);
  1300. /*
  1301.  *  The function Set_Bonne_Params sets the Bonne projection parameters 
  1302.  *  for the specified state.
  1303.  *  State        : Indicates whether the parameters are to be set for
  1304.  *                 interactive or file processing                      (input)
  1305.  *  Direction    : Indicates whether the parameters are to be set for
  1306.  *                 input or output                                     (input)
  1307.  *  parameters   : Bonne projection parameters to be set               (input)
  1308.  */
  1309. long Get_Bonne_Params
  1310. ( const File_or_Interactive State,
  1311.   const Input_or_Output     Direction,
  1312.   Bonne_Parameters          *parameters);
  1313. /*
  1314.  *  The function Get_Bonne_Params returns the Bonne projection parameters 
  1315.  *  for the specified state. 
  1316.  *  State        : Indicates whether the parameters are to be returned for
  1317.  *                 interactive or file processing                      (input)
  1318.  *  Direction    : Indicates whether the parameters are to be returned for  
  1319.  *                 input or output                                     (input)
  1320.  *  parameters   : Bonne projection parameters to be returned          (output)
  1321.  */
  1322. long Set_Bonne_Coordinates
  1323. ( const File_or_Interactive State,
  1324.   const Input_or_Output     Direction,
  1325.   const Bonne_Tuple         coordinates);
  1326. /*
  1327.  *  The function Set_Bonne_Coordinates sets the Bonne projection 
  1328.  *  coordinates for the specified state.
  1329.  *  State        : Indicates whether the coordinates are to be set for
  1330.  *                 interactive or file processing                      (input)
  1331.  *  Direction    : Indicates whether the coordinates are to be set for
  1332.  *                 input or output                                     (input)
  1333.  *  coordinates  : Bonne projection coordinates to be set              (input)
  1334.  */
  1335. long Get_Bonne_Coordinates
  1336. ( const File_or_Interactive State,
  1337.   const Input_or_Output     Direction,
  1338.   Bonne_Tuple               *coordinates);
  1339. /*
  1340.  *  The function Get_Bonne_Coordinates returns the Bonne projection
  1341.  *  coordinates for the specified state. 
  1342.  *  State          : Indicates whether the coordinates are to be returned for  
  1343.  *                   interactive or file processing                    (input)
  1344.  *  Direction      : Indicates whether the coordinates are to be returned for  
  1345.  *                   input or output                                   (input)
  1346.  *  coordinates    : Bonne projection coordinates to be returned       (output)
  1347.  */
  1348. long Set_Cassini_Params
  1349. ( const File_or_Interactive State,
  1350.   const Input_or_Output     Direction,
  1351.   const Cassini_Parameters  parameters);
  1352. /*