Map API refactoring
[GPXSee.git] / src / map / ellipsoid.cpp
blob95ff3473f5c17ede863f9994ebc1c1af7b9bef64
1 #include <QFile>
2 #include <QDebug>
3 #include "common/wgs84.h"
4 #include "common/csv.h"
5 #include "ellipsoid.h"
7 QMap<int, Ellipsoid> Ellipsoid::_ellipsoids = defaults();
9 const Ellipsoid &Ellipsoid::WGS84()
11 static Ellipsoid e(WGS84_RADIUS, WGS84_FLATTENING);
12 return e;
15 QMap<int, Ellipsoid> Ellipsoid::defaults()
17 QMap<int, Ellipsoid> map;
18 map.insert(7030, WGS84());
19 return map;
22 const Ellipsoid &Ellipsoid::ellipsoid(int id)
24 QMap<int, Ellipsoid>::const_iterator it(_ellipsoids.find(id));
25 static const Ellipsoid null;
27 if (it == _ellipsoids.constEnd())
28 return null;
29 else
30 return it.value();
33 bool Ellipsoid::loadList(const QString &path)
35 QFile file(path);
36 CSV csv(&file);
37 QByteArrayList entry;
38 bool res;
40 if (!file.open(QFile::ReadOnly)) {
41 qWarning("Error opening ellipsoids file: %s: %s", qPrintable(path),
42 qPrintable(file.errorString()));
43 return false;
46 while (!csv.atEnd()) {
47 if (!csv.readEntry(entry) || entry.size() < 4) {
48 qWarning("%s:%d: Parse error", qPrintable(path), csv.line());
49 return false;
52 int id = entry.at(1).toInt(&res);
53 if (!res) {
54 qWarning("%s: %d: Invalid ellipsoid code", qPrintable(path),
55 csv.line());
56 continue;
58 double radius = entry.at(2).toDouble(&res);
59 if (!res) {
60 qWarning("%s: %d: Invalid radius", qPrintable(path), csv.line());
61 continue;
63 double flattening = entry.at(3).toDouble(&res);
64 if (!res) {
65 qWarning("%s: %d: Invalid flattening", qPrintable(path), csv.line());
66 continue;
69 Ellipsoid e(radius, 1.0/flattening);
70 _ellipsoids.insert(id, e);
73 return true;
76 Ellipsoid::Ellipsoid(double radius, double flattening)
77 : _radius(radius), _flattening(flattening)
79 _es = 2.0 * flattening - flattening * flattening;
80 _e2s = (1.0 / (1.0 - _es)) - 1.0;
81 _b = radius * (1.0 - flattening);
84 #ifndef QT_NO_DEBUG
85 QDebug operator<<(QDebug dbg, const Ellipsoid &ellipsoid)
87 dbg.nospace() << "Ellipsoid(" << ellipsoid.radius() << ", "
88 << 1.0 / ellipsoid.flattening() << ")";
89 return dbg.space();
91 #endif // QT_NO_DEBUG