Map API refactoring
[GPXSee.git] / src / map / angularunits.cpp
blobd2ff9c45ae9abb385edd8aa58fbdedfb561ea333
1 #include "common/util.h"
2 #include "angularunits.h"
4 static double sDMS2deg(double val)
6 double angle;
7 const char *decimal;
9 QString qstr(QString::number(qAbs(val), 'f', 7));
10 QByteArray ba = qstr.toLatin1();
11 const char *str = ba.constData();
12 decimal = strrchr(str, '.');
13 int deg = Util::str2int(str, decimal - str);
14 int min = Util::str2int(decimal + 1, 2);
15 int sec = Util::str2int(decimal + 3, 2);
16 int f = Util::str2int(decimal + 5, 3);
18 angle = deg + min/60.0 + sec/3600.0 + (f/1000.0)/3600.0;
20 return (val < 0) ? -angle : angle;
23 static double deg2sDMS(double val)
25 double aval = qAbs(val);
27 int deg = aval;
28 double r1 = aval - deg;
30 int min = r1 * 60.0;
31 double r2 = r1 - (min / 60.0);
33 int sec = r2 * 3600.0;
34 double r3 = r2 - (sec / 3600.0);
35 int f = (int)(r3 * 3600.0 * 1000.0);
37 QString str(QString("%1.%2%3%4").arg(deg).arg(min, 2, 10, QChar('0'))
38 .arg(sec, 2, 10, QChar('0')).arg(f, 3, 10, QChar('0')));
40 return (val < 0) ? -str.toDouble() : str.toDouble();
43 AngularUnits::AngularUnits(int code) : _code(code)
45 switch (code) {
46 case 9101:
47 _f = 180.0 / M_PI;
48 break;
49 case 9102:
50 case 9107:
51 case 9108:
52 case 9110:
53 case 9122:
54 _f = 1.0;
55 break;
56 case 9103:
57 _f = 1 / 60.0;
58 break;
59 case 9104:
60 _f = 1 / 3600.0;
61 break;
62 case 9105:
63 _f = 180.0 / 200.0;
64 break;
65 case 9106:
66 _f = 180.0 / 200.0;
67 break;
68 case 9109:
69 _f = 180.0 / (M_PI * 1000000.0);
70 break;
71 default:
72 _f = NAN;
76 double AngularUnits::toDegrees(double val) const
78 return (_code == 9110) ? sDMS2deg(val) : val * _f;
81 double AngularUnits::fromDegrees(double val) const
83 return (_code == 9110) ? deg2sDMS(val) : val / _f;
86 #ifndef QT_NO_DEBUG
87 QDebug operator<<(QDebug dbg, const AngularUnits &au)
89 dbg.nospace() << "AngularUnits(" << deg2rad(au._f) << ")";
90 return dbg.space();
92 #endif // QT_NO_DEBUG