00001
00002
00003
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 #ifndef conversions_H
00029 #define conversions_H
00030
00031 #include <mrpt/utils/utils_defs.h>
00032 #include <mrpt/math/lightweight_geom_data.h>
00033
00034 #include <mrpt/topography/link_pragmas.h>
00035
00036 using namespace std;
00037 using namespace mrpt::utils;
00038
00039 namespace mrpt
00040 {
00041
00042
00043 namespace topography
00044 {
00045
00046
00047
00048
00049
00050 struct TOPO_IMPEXP TCoords
00051 {
00052 inline TCoords( const int _deg, const int _min, const double _sec ) : degrees(_deg), minutes(_min), seconds(_sec) {}
00053 inline TCoords( const double dec ) { setFromDecimal(dec); }
00054
00055 int degrees;
00056 int minutes;
00057 double seconds;
00058
00059 inline void setFromDecimal( const double dec )
00060 {
00061 double aux = fabs(dec);
00062 degrees = (int)aux;
00063 minutes = (int)((aux - degrees)*60.0f);
00064 seconds = ((aux - degrees)*60.0f - minutes)*60.0f;
00065 if( dec<0 )
00066 degrees *= -1;
00067 }
00068 inline double getDecimalValue() const
00069 {
00070 double aux = abs(degrees)+minutes/60.0f+seconds/3600.0f;
00071 if( degrees < 0 )
00072 aux *= -1;
00073 return aux;
00074 }
00075 inline operator double(void) const { return getDecimalValue(); }
00076 };
00077
00078 inline std::ostream& operator<<( std::ostream& out, const TCoords &o )
00079 {
00080 out << o.degrees << "deg " << o.minutes << "' " << o.seconds << "''";
00081 return out;
00082 }
00083
00084 struct TOPO_IMPEXP TEllipsoid
00085 {
00086 inline TEllipsoid() : sa( 6378137.0 ), sb( 6356752.314245 ), name("WGS84") {}
00087 inline TEllipsoid( const double _sa, const double _sb, const string _name ) : sa(_sa), sb(_sb), name(_name) {}
00088
00089 double sa;
00090 double sb;
00091 string name;
00092 };
00093
00094 inline TEllipsoid Ellipsoid_WGS84() { return TEllipsoid( 6378137.000, 6356752.314245, "WGS84" ); }
00095 inline TEllipsoid Ellipsoid_WGS72() { return TEllipsoid( 6378135.000, 6356750.519915, "WGS72" ); }
00096 inline TEllipsoid Ellipsoid_WGS66() { return TEllipsoid( 6378145.000, 6356759.769356, "WGS66" ); }
00097 inline TEllipsoid Ellipsoid_Walbeck_1817() { return TEllipsoid( 6376896.000, 6355834.846700, "Walbeck_1817" ); }
00098 inline TEllipsoid Ellipsoid_Sudamericano_1969() { return TEllipsoid( 6378160.000, 6356774.720000, "Sudamericano_1969" ); }
00099 inline TEllipsoid Ellipsoid_Nuevo_Internacional_1967() {return TEllipsoid( 6378157.500, 6356772.200000, "Nuevo_Internacional_1967" ); }
00100 inline TEllipsoid Ellipsoid_Mercury_Modificado_1968() { return TEllipsoid( 6378150.000, 6356768.337303, "Mercury_Modificado_1968" ); }
00101 inline TEllipsoid Ellipsoid_Mercury_1960() { return TEllipsoid( 6378166.000, 6356784.283666, "Mercury_1960" ); }
00102 inline TEllipsoid Ellipsoid_Krasovsky_1940() { return TEllipsoid( 6378245.000, 6356863.018800, "Krasovsky_1940" ); }
00103 inline TEllipsoid Ellipsoid_Internacional_1924() { return TEllipsoid( 6378388.000, 6356911.946130, "Internacional_1924" ); }
00104 inline TEllipsoid Ellipsoid_Internacional_1909() { return TEllipsoid( 6378388.000, 6356911.946130, "Internacional_1909" ); }
00105 inline TEllipsoid Ellipsoid_Hough_1960() { return TEllipsoid( 6378270.000, 6356794.343479, "Hough_1960" ); }
00106 inline TEllipsoid Ellipsoid_Helmert_1906() { return TEllipsoid( 6378200.000, 6356818.170000, "Helmert_1906" ); }
00107 inline TEllipsoid Ellipsoid_Hayford_1909() { return TEllipsoid( 6378388.000, 6356911.946130, "Hayford_1909" ); }
00108 inline TEllipsoid Ellipsoid_GRS80() { return TEllipsoid( 6378137.000, 6356752.314140, "GRS80" ); }
00109 inline TEllipsoid Ellipsoid_Fischer_1968() { return TEllipsoid( 6378150.000, 6356768.330000, "Fischer_1968" ); }
00110 inline TEllipsoid Ellipsoid_Fischer_1960() { return TEllipsoid( 6378166.000, 6356784.280000, "Fischer_1960" ); }
00111 inline TEllipsoid Ellipsoid_Clarke_1880() { return TEllipsoid( 6378249.145, 6356514.869550, "Clarke_1880" ); }
00112 inline TEllipsoid Ellipsoid_Clarke_1866() { return TEllipsoid( 6378206.400, 6356583.800000, "Clarke_1866" ); }
00113 inline TEllipsoid Ellipsoid_Bessel_1841() { return TEllipsoid( 6377397.155, 6356078.962840, "Bessel_1841" ); }
00114 inline TEllipsoid Ellipsoid_Airy_Modificado_1965() { return TEllipsoid( 6377340.189, 6356034.447900, "Airy_Modificado_1965" ); }
00115 inline TEllipsoid Ellipsoid_Airy_1830() { return TEllipsoid( 6377563.396, 6356256.910000, "Airy_1830" ); }
00116
00117 typedef mrpt::math::TPoint3D TUTMCoords;
00118 typedef mrpt::math::TPoint3D TGeocentricCoords;
00119
00120
00121 struct TOPO_IMPEXP TGeodeticCoords
00122 {
00123 TGeodeticCoords() : lat(0),lon(0),height(0) {}
00124 TGeodeticCoords(const double _lat, const double _lon, const double _height) : lat(_lat),lon(_lon),height(_height) {}
00125
00126 double lat;
00127 double lon;
00128 double height;
00129 };
00130
00131
00132
00133
00134 struct TOPO_IMPEXP TDatum7Params
00135 {
00136 double dX, dY, dZ;
00137 double Rx, Ry, Rz;
00138 double dS;
00139
00140 inline TDatum7Params(
00141 const double _dX, const double _dY, const double _dZ,
00142 const double _Rx, const double _Ry, const double _Rz,
00143 const double _dS ) :
00144 dX(_dX), dY(_dY), dZ(_dZ)
00145 {
00146 Rx = DEG2RAD(_Rx/60/60);
00147 Ry = DEG2RAD(_Ry/60/60);
00148 Rz = DEG2RAD(_Rz/60/60);
00149 dS = _dS*1e-6;
00150 }
00151 };
00152
00153 struct TOPO_IMPEXP TDatum7Params_TOPCON
00154 {
00155 double dX, dY, dZ;
00156 double m11, m12, m13, m21, m22, m23, m31, m32, m33;
00157 double dS;
00158
00159 inline TDatum7Params_TOPCON(
00160 const double _dX, const double _dY, const double _dZ,
00161 const double _m11, const double _m12, const double _m13,
00162 const double _m21, const double _m22, const double _m23,
00163 const double _m31, const double _m32, const double _m33,
00164 const double _dS ) :
00165 dX(_dX), dY(_dY), dZ(_dZ), m11(_m11), m12(_m12), m13(_m13), m21(_m21), m22(_m22), m23(_m23), m31(_m31), m32(_m32), m33(_m33)
00166 {
00167 dS = _dS*1e-6;
00168 }
00169 };
00170
00171
00172
00173
00174
00175 struct TOPO_IMPEXP TDatum10Params
00176 {
00177 double dX, dY, dZ;
00178 double Xp, Yp, Zp;
00179 double Rx, Ry, Rz;
00180 double dS;
00181
00182 inline TDatum10Params(
00183 const double _dX, const double _dY, const double _dZ,
00184 const double _Xp, const double _Yp, const double _Zp,
00185 const double _Rx, const double _Ry, const double _Rz,
00186 const double _dS ) :
00187 dX(_dX), dY(_dY), dZ(_dZ), Xp(_Xp), Yp(_Yp), Zp(_Zp)
00188 {
00189 Rx = DEG2RAD(_Rx/60/60);
00190 Ry = DEG2RAD(_Ry/60/60);
00191 Rz = DEG2RAD(_Rz/60/60);
00192 dS = _dS*1e-6;
00193 }
00194 };
00195
00196
00197
00198
00199 struct TOPO_IMPEXP TDatumHelmert2D
00200 {
00201 double dX, dY;
00202 double alpha;
00203 double dS;
00204 double Xp, Yp;
00205
00206 inline TDatumHelmert2D(
00207 const double _dX, const double _dY,
00208 const double _alpha, const double _dS,
00209 const double _Xp, const double _Yp ) :
00210 dX(_dX), dY(_dY), Xp(_Xp), Yp(_Yp)
00211 {
00212 alpha = DEG2RAD(_alpha);
00213 dS = _dS*1e-6;
00214 }
00215 };
00216
00217 struct TOPO_IMPEXP TDatumHelmert2D_TOPCON
00218 {
00219 double a,b,c,d;
00220
00221 inline TDatumHelmert2D_TOPCON(
00222 const double _a, const double _b,
00223 const double _c, const double _d ) :
00224 a(_a), b(_b), c(_c), d(_d) {}
00225
00226 };
00227
00228
00229
00230
00231 struct TOPO_IMPEXP TDatumHelmert3D
00232 {
00233 double dX, dY, dZ;
00234 double Rx, Ry, Rz;
00235 double dS;
00236
00237 inline TDatumHelmert3D(
00238 const double _dX, const double _dY, const double _dZ,
00239 const double _Rx, const double _Ry, const double _Rz,
00240 const double _dS ) :
00241 dX(_dX), dY(_dY), dZ(_dZ)
00242 {
00243 Rx = DEG2RAD(_Rx/60/60);
00244 Ry = DEG2RAD(_Ry/60/60);
00245 Rz = DEG2RAD(_Rz/60/60);
00246 dS = _dS*1e-6;
00247 }
00248 };
00249
00250
00251
00252
00253 struct TOPO_IMPEXP TDatumHelmert3D_TOPCON
00254 {
00255 double a,b,c,d,e,f,g;
00256
00257 inline TDatumHelmert3D_TOPCON(
00258 const double _a, const double _b, const double _c,
00259 const double _d, const double _e, const double _f, const double _g ) :
00260 a(_a), b(_b), c(_c), d(_d), e(_e), f(_f), g(_g) { }
00261 };
00262
00263
00264
00265
00266 struct TOPO_IMPEXP TDatum1DTransf
00267 {
00268 double dX, dY, DZ;
00269 double dS;
00270
00271 inline TDatum1DTransf(
00272 const double _dX, const double _dY, const double _DZ,
00273 const double _dS ) :
00274 dX(_dX), dY(_dY), DZ(_DZ)
00275 {
00276 dS = _dS*1e-6;
00277 }
00278 };
00279
00280
00281
00282
00283 struct TOPO_IMPEXP TDatumTransfInterpolation
00284 {
00285 double dX, dY;
00286 double dSx, dSy;
00287 double beta;
00288
00289 inline TDatumTransfInterpolation(
00290 const double _dX, const double _dY,
00291 const double _dSx, const double _dSy, const double _beta ) :
00292 dX(_dX), dY(_dY)
00293 {
00294 dSx = _dSx*1e-6;
00295 dSy = _dSy*1e-6;
00296 beta = DEG2RAD(_beta/60/60);
00297 }
00298 };
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314 void TOPO_IMPEXP geodeticToENU_WGS84(
00315 const TGeodeticCoords &in_coords,
00316 mrpt::math::TPoint3D &out_ENU_point,
00317 const TGeodeticCoords &in_coords_origin );
00318
00319
00320
00321
00322
00323
00324
00325 void TOPO_IMPEXP geodeticToGeocentric_WGS84(
00326 const TGeodeticCoords &in_coords,
00327 mrpt::math::TPoint3D &out_point );
00328
00329
00330
00331
00332 void TOPO_IMPEXP geodeticToGeocentric(
00333 const TGeodeticCoords &in_coords,
00334 TGeocentricCoords &out_point,
00335 const TEllipsoid &ellip );
00336
00337
00338
00339
00340 void TOPO_IMPEXP geocentricToGeodetic(
00341 const TGeocentricCoords &in_point,
00342 TGeodeticCoords &out_coords,
00343 const TEllipsoid &ellip = Ellipsoid_WGS84() );
00344
00345
00346
00347
00348
00349 void TOPO_IMPEXP transform7params(
00350 const mrpt::math::TPoint3D &in_point,
00351 const TDatum7Params &in_datum,
00352 mrpt::math::TPoint3D &out_point);
00353
00354 void TOPO_IMPEXP transform7params_TOPCON(
00355 const mrpt::math::TPoint3D &in_point,
00356 const TDatum7Params_TOPCON &in_datum,
00357 mrpt::math::TPoint3D &out_point);
00358
00359
00360
00361
00362
00363 void TOPO_IMPEXP transform10params(
00364 const mrpt::math::TPoint3D &in_point,
00365 const TDatum10Params &in_datum,
00366 mrpt::math::TPoint3D &out_point);
00367
00368
00369
00370
00371
00372 void TOPO_IMPEXP transformHelmert2D(
00373 const mrpt::math::TPoint2D &p,
00374 const TDatumHelmert2D &d,
00375 mrpt::math::TPoint2D &o);
00376
00377 void TOPO_IMPEXP transformHelmert2D_TOPCON(
00378 const mrpt::math::TPoint2D &p,
00379 const TDatumHelmert2D_TOPCON &d,
00380 mrpt::math::TPoint2D &o);
00381
00382
00383
00384
00385
00386 void TOPO_IMPEXP transformHelmert3D(
00387 const mrpt::math::TPoint3D &p,
00388 const TDatumHelmert3D &d,
00389 mrpt::math::TPoint3D &o);
00390
00391 void TOPO_IMPEXP transformHelmert3D_TOPCON(
00392 const mrpt::math::TPoint3D &p,
00393 const TDatumHelmert3D_TOPCON &d,
00394 mrpt::math::TPoint3D &o);
00395
00396
00397
00398
00399 void TOPO_IMPEXP transform1D(
00400 const mrpt::math::TPoint3D &p,
00401 const TDatum1DTransf &d,
00402 mrpt::math::TPoint3D &o);
00403
00404
00405
00406
00407 void TOPO_IMPEXP transfInterpolation(
00408 const mrpt::math::TPoint3D &p,
00409 const TDatumTransfInterpolation &d,
00410 mrpt::math::TPoint3D &o);
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421 void TOPO_IMPEXP UTMToGeodetic(
00422 double X,
00423 double Y,
00424 int zone,
00425 char hem,
00426 double &out_lon ,
00427 double &out_lat ,
00428 TEllipsoid ellip = Ellipsoid_WGS84() );
00429
00430
00431
00432
00433
00434
00435
00436
00437 inline void TOPO_IMPEXP UTMToGeodetic(
00438 const TUTMCoords &UTMCoords,
00439 const int &zone,
00440 const char &hem,
00441 TGeodeticCoords &GeodeticCoords,
00442 TEllipsoid ellip = Ellipsoid_WGS84() )
00443 {
00444 UTMToGeodetic( UTMCoords.x, UTMCoords.y, zone, hem, GeodeticCoords.lon, GeodeticCoords.lat, ellip );
00445 GeodeticCoords.height = UTMCoords.z;
00446 }
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462 void TOPO_IMPEXP GeodeticToUTM(
00463 double in_latitude_degrees,
00464 double in_longitude_degrees,
00465 double &out_UTM_x,
00466 double &out_UTM_y,
00467 int &out_UTM_zone,
00468 char &out_UTM_latitude_band,
00469 TEllipsoid ellip = Ellipsoid_WGS84());
00470
00471 void TOPO_IMPEXP geodeticToUTM(
00472 const TGeodeticCoords &GeodeticCoords,
00473 TUTMCoords &UTMCoords,
00474 int &UTMZone,
00475 char &UTMLatitudeBand,
00476 TEllipsoid ellip = Ellipsoid_WGS84());
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493 inline void TOPO_IMPEXP GeodeticToUTM(
00494 const TGeodeticCoords &GeodeticCoords,
00495 TUTMCoords &UTMCoords,
00496 int &UTMZone,
00497 char &UTMLatitudeBand,
00498 TEllipsoid ellip = Ellipsoid_WGS84())
00499 {
00500 GeodeticToUTM( GeodeticCoords.lat, GeodeticCoords.lon, UTMCoords.x, UTMCoords.y, UTMZone, UTMLatitudeBand, ellip );
00501 UTMCoords.z = GeodeticCoords.height;
00502 }
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519 MRPT_DECLARE_DEPRECATED_FUNCTION("*DEPRECATED* Use geodeticToENU_WGS84 instead",
00520 void TOPO_IMPEXP coordinatesTransformation_WGS84(
00521 double in_longitude_degrees,
00522 double in_latitude_degrees,
00523 double in_height_meters,
00524 double &out_x_meters,
00525 double &out_y_meters,
00526 double &out_z_meters,
00527 double in_longitude_reference_degrees,
00528 double in_latitude_reference_degrees,
00529 double in_height_reference_meters
00530 ));
00531
00532
00533
00534
00535
00536
00537
00538 MRPT_DECLARE_DEPRECATED_FUNCTION("*DEPRECATED* Use geodeticToENU_WGS84 instead",
00539 void TOPO_IMPEXP coordinatesTransformation_WGS84_geocentric(
00540 double in_longitude_degrees,
00541 double in_latitude_degrees,
00542 double in_height_meters,
00543 double &out_x_meters,
00544 double &out_y_meters,
00545 double &out_z_meters
00546 ) );
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562 void TOPO_IMPEXP ENU_axes_from_WGS84(
00563 double in_longitude_reference_degrees,
00564 double in_latitude_reference_degrees,
00565 double in_height_reference_meters,
00566 mrpt::math::TPose3D &out_ENU,
00567 bool only_angles = false
00568 );
00569
00570
00571
00572
00573
00574
00575 inline void ENU_axes_from_WGS84(
00576 const TGeodeticCoords &in_coords,
00577 mrpt::math::TPose3D &out_ENU,
00578 bool only_angles = false
00579 )
00580 {
00581 ENU_axes_from_WGS84(in_coords.lon,in_coords.lat,in_coords.height, out_ENU,only_angles);
00582 }
00583
00584
00585
00586
00587
00588 }
00589
00590 }
00591
00592 #endif