1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-11-25 04:05:53 +01:00
GPXSee/src/map/ellipsoid.cpp

92 lines
2.0 KiB
C++
Raw Normal View History

#include <QFile>
2018-01-08 23:47:45 +01:00
#include <QDebug>
#include "common/wgs84.h"
#include "common/csv.h"
#include "ellipsoid.h"
QMap<int, Ellipsoid> Ellipsoid::_ellipsoids = defaults();
const Ellipsoid &Ellipsoid::WGS84()
{
static Ellipsoid e(WGS84_RADIUS, WGS84_FLATTENING);
return e;
}
QMap<int, Ellipsoid> Ellipsoid::defaults()
{
QMap<int, Ellipsoid> map;
map.insert(7030, WGS84());
return map;
}
2021-06-17 21:58:25 +02:00
const Ellipsoid &Ellipsoid::ellipsoid(int id)
{
2018-03-29 00:29:08 +02:00
QMap<int, Ellipsoid>::const_iterator it(_ellipsoids.find(id));
2021-06-17 21:58:25 +02:00
static const Ellipsoid null;
2018-03-29 00:29:08 +02:00
if (it == _ellipsoids.constEnd())
2021-06-17 21:58:25 +02:00
return null;
2018-01-08 23:47:45 +01:00
else
2021-06-17 21:58:25 +02:00
return it.value();
2018-01-09 23:19:35 +01:00
}
bool Ellipsoid::loadList(const QString &path)
{
QFile file(path);
CSV csv(&file);
QByteArrayList entry;
bool res;
2018-01-08 23:47:45 +01:00
if (!file.open(QFile::ReadOnly)) {
qWarning("Error opening ellipsoids file: %s: %s", qPrintable(path),
qPrintable(file.errorString()));
return false;
}
while (!csv.atEnd()) {
if (!csv.readEntry(entry) || entry.size() < 4) {
qWarning("%s:%d: Parse error", qPrintable(path), csv.line());
return false;
}
int id = entry.at(1).toInt(&res);
if (!res) {
qWarning("%s: %d: Invalid ellipsoid code", qPrintable(path),
csv.line());
continue;
}
double radius = entry.at(2).toDouble(&res);
if (!res) {
qWarning("%s: %d: Invalid radius", qPrintable(path), csv.line());
continue;
}
double flattening = entry.at(3).toDouble(&res);
if (!res) {
qWarning("%s: %d: Invalid flattening", qPrintable(path), csv.line());
continue;
}
Ellipsoid e(radius, 1.0/flattening);
_ellipsoids.insert(id, e);
}
return true;
}
2018-01-08 23:47:45 +01:00
Ellipsoid::Ellipsoid(double radius, double flattening)
: _radius(radius), _flattening(flattening)
{
_es = 2.0 * flattening - flattening * flattening;
2018-05-18 22:10:43 +02:00
_e2s = (1.0 / (1.0 - _es)) - 1.0;
_b = radius * (1.0 - flattening);
}
#ifndef QT_NO_DEBUG
2018-01-08 23:47:45 +01:00
QDebug operator<<(QDebug dbg, const Ellipsoid &ellipsoid)
{
dbg.nospace() << "Ellipsoid(" << ellipsoid.radius() << ", "
<< 1.0 / ellipsoid.flattening() << ")";
2018-01-21 11:19:46 +01:00
return dbg.space();
2018-01-08 23:47:45 +01:00
}
#endif // QT_NO_DEBUG