00001
00002 #ifndef CoordinateConversionService_H
00003 #define CoordinateConversionService_H
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 #include <vector>
00084 #include "CoordinateType.h"
00085 #include "Precision.h"
00086 #include "SourceOrTarget.h"
00087 #include "CoordinateTuple.h"
00088
00089
00090 #ifdef WIN32
00091 #ifdef MSP_CCS_EX
00092 #define MSP_CCS __declspec(dllexport)
00093 #else
00094 #define MSP_CCS __declspec(dllimport)
00095 #endif
00096 #endif
00097
00098
00099 namespace MSP
00100 {
00101 class CCSThreadMutex;
00102 namespace CCS
00103 {
00104 class EllipsoidLibrary;
00105 class EllipsoidLibraryImplementation;
00106 class DatumLibrary;
00107 class DatumLibraryImplementation;
00108 class GeoidLibrary;
00109 class Accuracy;
00110 class CoordinateSystemParameters;
00111 class CoordinateTuple;
00112 class MapProjection3Parameters;
00113 class MapProjection4Parameters;
00114 class MapProjection5Parameters;
00115 class MapProjection6Parameters;
00116 class EquidistantCylindricalParameters;
00117 class GeodeticParameters;
00118 class LocalCartesianParameters;
00119 class MercatorStandardParallelParameters;
00120 class MercatorScaleFactorParameters;
00121 class NeysParameters;
00122 class ObliqueMercatorParameters;
00123 class PolarStereographicStandardParallelParameters;
00124 class PolarStereographicScaleFactorParameters;
00125 class UTMParameters;
00126 class MapProjectionCoordinates;
00127 class BNGCoordinates;
00128 class CartesianCoordinates;
00129 class GeodeticCoordinates;
00130 class GEOREFCoordinates;
00131 class GARSCoordinates;
00132 class MGRSorUSNGCoordinates;
00133 class UPSCoordinates;
00134 class UTMCoordinates;
00135 class CoordinateSystem;
00136
00137
00138
00139
00140
00141
00142
00143
00144 const int NUMBER_COORD_SYS = 37;
00145 const int COORD_SYS_CODE_LENGTH = 3;
00146 const int COORD_SYS_NAME_LENGTH = 50;
00147 const int DATUM_CODE_LENGTH = 7;
00148 const int DATUM_NAME_LENGTH = 33;
00149 const int ELLIPSOID_CODE_LENGTH = 3;
00150 const int ELLIPSOID_NAME_LENGTH = 30;
00151 const int CONVERT_MSG_LENGTH = 2048;
00152 const int RETURN_MSG_LENGTH = 256;
00153
00154
00158 struct Color
00159 {
00161 enum Enum
00162 {
00163 red,
00164 yellow,
00165 green
00166 };
00167 };
00168
00173 #ifdef WIN32
00174 class MSP_CCS CoordinateConversionService
00175 #else
00176 class CoordinateConversionService
00177 #endif
00178 {
00179 public:
00180
00192 CoordinateConversionService( const char* sourceDatumCode, MSP::CCS::CoordinateSystemParameters* sourceParameters, const char* targetDatumCode, MSP::CCS::CoordinateSystemParameters* targetParameters );
00193
00199 CoordinateConversionService( const CoordinateConversionService &ccs );
00200
00204 ~CoordinateConversionService( void );
00205
00211 CoordinateConversionService &operator=( const CoordinateConversionService &ccs );
00212
00213
00226 void convertSourceToTarget( CoordinateTuple* sourceCoordinates, Accuracy* sourceAccuracy, CoordinateTuple& targetCoordinates, Accuracy& targetAccuracy );
00227
00228
00241 void convertTargetToSource( CoordinateTuple* targetCoordinates, Accuracy* targetAccuracy, CoordinateTuple& sourceCoordinates, Accuracy& sourceAccurac );
00242
00243
00254 void convertSourceToTargetCollection( const std::vector<MSP::CCS::CoordinateTuple*>& sourceCoordinates, const std::vector<MSP::CCS::Accuracy*>& sourceAccuracy, std::vector<MSP::CCS::CoordinateTuple*>& targetCoordinates, std::vector<MSP::CCS::Accuracy*>& targetAccuracy );
00255
00256
00267 void convertTargetToSourceCollection( const std::vector<MSP::CCS::CoordinateTuple*>& targetCoordinates, const std::vector<MSP::CCS::Accuracy*>& targetAccuracy, std::vector<MSP::CCS::CoordinateTuple*>& sourceCoordinates, std::vector<MSP::CCS::Accuracy*>& sourceAccuracy );
00268
00269
00270
00271
00272
00273
00274
00275
00276 EllipsoidLibrary* getEllipsoidLibrary();
00277
00278
00279
00280
00281
00282
00283
00284
00285 DatumLibrary* getDatumLibrary();
00286
00287
00288
00289
00290
00291
00292
00293 int getServiceVersion();
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303 const char* getDatum( const SourceOrTarget::Enum direction ) const;
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315 MSP::CCS::CoordinateSystemParameters* getCoordinateSystem( const SourceOrTarget::Enum direction ) const;
00316
00317
00318 private:
00319
00320 static CCSThreadMutex mutex;
00321
00322
00323 struct CCSData
00324 {
00325 int refCount;
00326
00327 EllipsoidLibrary* ellipsoidLibrary;
00328 EllipsoidLibraryImplementation* ellipsoidLibraryImplementation;
00329 DatumLibrary* datumLibrary;
00330 DatumLibraryImplementation* datumLibraryImplementation;
00331 GeoidLibrary* geoidLibrary;
00332
00333 CCSData();
00334 ~CCSData();
00335 };
00336
00337 CCSData* ccsData;
00338
00339 EllipsoidLibraryImplementation* ellipsoidLibraryImplementation;
00340 DatumLibraryImplementation* datumLibraryImplementation;
00341 GeoidLibrary* geoidLibrary;
00342
00343
00344 #ifdef SOLARIS
00345 public:
00346 #endif
00347
00348
00349 union Parameters
00350 {
00351 CoordinateSystemParameters* coordinateSystemParameters;
00352 MapProjection3Parameters* mapProjection3Parameters;
00353 MapProjection4Parameters* mapProjection4Parameters;
00354 MapProjection5Parameters* mapProjection5Parameters;
00355 MapProjection6Parameters* mapProjection6Parameters;
00356 EquidistantCylindricalParameters* equidistantCylindricalParameters;
00357 GeodeticParameters* geodeticParameters;
00358 LocalCartesianParameters* localCartesianParameters;
00359 MercatorStandardParallelParameters* mercatorStandardParallelParameters;
00360 MercatorScaleFactorParameters* mercatorScaleFactorParameters;
00361 NeysParameters* neysParameters;
00362 ObliqueMercatorParameters* obliqueMercatorParameters;
00363 PolarStereographicStandardParallelParameters* polarStereographicStandardParallelParameters;
00364 PolarStereographicScaleFactorParameters* polarStereographicScaleFactorParameters;
00365 UTMParameters* utmParameters;
00366 };
00367
00368
00369 union Coordinates
00370 {
00371 MapProjectionCoordinates* mapProjectionCoordinates;
00372 BNGCoordinates* bngCoordinates;
00373 CartesianCoordinates* cartesianCoordinates;
00374 GeodeticCoordinates* geodeticCoordinates;
00375 GEOREFCoordinates* georefCoordinates;
00376 GARSCoordinates* garsCoordinates;
00377 MGRSorUSNGCoordinates* mgrsOrUSNGCoordinates;
00378 UPSCoordinates* upsCoordinates;
00379 UTMCoordinates* utmCoordinates;
00380 };
00381
00382 struct Coordinate_System_Row
00383 {
00384 char Name[COORD_SYS_NAME_LENGTH];
00385 char Code[COORD_SYS_CODE_LENGTH];
00386 CoordinateType::Enum coordinateSystem;
00387 };
00388
00389
00390
00391 struct Coordinate_State_Row
00392 {
00393 char datumCode[DATUM_CODE_LENGTH];
00394 long datumIndex;
00395 CoordinateType::Enum coordinateType;
00396 Parameters parameters;
00397 CoordinateSystem* coordinateSystem;
00398 };
00399
00400
00401
00402 Coordinate_State_Row coordinateSystemState[2];
00403
00404
00405 Coordinate_System_Row Coordinate_System_Table[NUMBER_COORD_SYS];
00406
00407 long WGS84_datum_index;
00408
00409
00410
00411
00412
00413
00414
00415
00416 void setDataLibraries();
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426 void initCoordinateSystemState( const SourceOrTarget::Enum direction );
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436 void deleteCoordinateSystem( const SourceOrTarget::Enum direction );
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449 void copyParameters( SourceOrTarget::Enum direction, CoordinateType::Enum coordinateType, Parameters parameters );
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461 void setDatum( const SourceOrTarget::Enum direction, const char* index );
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473 void setCoordinateSystem( const SourceOrTarget::Enum direction, MSP::CCS::CoordinateSystemParameters* parameters );
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484 void setParameters( const SourceOrTarget::Enum direction );
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497 void convert( SourceOrTarget::Enum sourceDirection, SourceOrTarget::Enum targetDirection, CoordinateTuple* sourceCoordinates, Accuracy* sourceAccuracy, CoordinateTuple& targetCoordinates, Accuracy& targetAccuracy );
00498
00499
00500 GeodeticCoordinates* convertSourceToGeodetic( SourceOrTarget::Enum sourceDirection, CoordinateTuple* sourceCoordinates, char* sourceWarningMessage );
00501
00502
00503 void convertGeodeticToTarget( SourceOrTarget::Enum targetDirection, GeodeticCoordinates* _shiftedGeodetic, CoordinateTuple& targetCoordinates, char* targetWarningMessage );
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516 void convertCollection( const std::vector<MSP::CCS::CoordinateTuple*>& sourceCoordinatesCollection, const std::vector<MSP::CCS::Accuracy*>& sourceAccuracyCollection, std::vector<MSP::CCS::CoordinateTuple*>& targetCoordinatesCollection, std::vector<MSP::CCS::Accuracy*>& targetAccuracyCollection );
00517 };
00518 }
00519 }
00520
00521 #endif
00522
00523
00524