2017-04-17 18:03:04 +02:00
|
|
|
#include <QFile>
|
2018-01-08 23:47:45 +01:00
|
|
|
#include <QDebug>
|
2018-01-20 20:13:56 +01:00
|
|
|
#include "common/wgs84.h"
|
2017-04-03 20:29:35 +02:00
|
|
|
#include "ellipsoid.h"
|
|
|
|
|
2018-06-28 22:12:16 +02:00
|
|
|
QMap<int, Ellipsoid> Ellipsoid::_ellipsoids = defaults();
|
2017-04-03 20:29:35 +02:00
|
|
|
|
2018-06-28 22:12:16 +02:00
|
|
|
const Ellipsoid &Ellipsoid::WGS84()
|
|
|
|
{
|
|
|
|
static Ellipsoid e(WGS84_RADIUS, WGS84_FLATTENING);
|
|
|
|
return e;
|
|
|
|
}
|
|
|
|
|
|
|
|
QMap<int, Ellipsoid> Ellipsoid::defaults()
|
2018-01-20 20:13:56 +01:00
|
|
|
{
|
|
|
|
QMap<int, Ellipsoid> map;
|
2018-06-28 22:12:16 +02:00
|
|
|
map.insert(7030, WGS84());
|
2018-01-20 20:13:56 +01:00
|
|
|
return map;
|
|
|
|
}
|
|
|
|
|
2021-06-17 21:58:25 +02:00
|
|
|
const Ellipsoid &Ellipsoid::ellipsoid(int id)
|
2017-04-03 20:29:35 +02:00
|
|
|
{
|
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;
|
2017-04-17 18:03:04 +02:00
|
|
|
|
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
|
|
|
}
|
|
|
|
|
2018-01-20 20:13:56 +01:00
|
|
|
void Ellipsoid::loadList(const QString &path)
|
2017-04-03 20:29:35 +02:00
|
|
|
{
|
2017-04-17 18:03:04 +02:00
|
|
|
QFile file(path);
|
|
|
|
bool res;
|
2018-01-20 20:13:56 +01:00
|
|
|
int ln = 0;
|
2017-04-17 18:03:04 +02:00
|
|
|
|
2018-01-08 23:47:45 +01:00
|
|
|
|
2017-04-17 18:03:04 +02:00
|
|
|
if (!file.open(QFile::ReadOnly)) {
|
2018-01-20 20:13:56 +01:00
|
|
|
qWarning("Error opening ellipsoids file: %s: %s", qPrintable(path),
|
|
|
|
qPrintable(file.errorString()));
|
|
|
|
return;
|
2017-04-17 18:03:04 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
while (!file.atEnd()) {
|
2018-01-20 20:13:56 +01:00
|
|
|
ln++;
|
|
|
|
|
2022-07-05 11:08:57 +02:00
|
|
|
QByteArray line = file.readLine(4096);
|
2017-04-17 18:03:04 +02:00
|
|
|
QList<QByteArray> list = line.split(',');
|
|
|
|
if (list.size() != 4) {
|
2018-01-20 20:13:56 +01:00
|
|
|
qWarning("%s: %d: Format error", qPrintable(path), ln);
|
|
|
|
continue;
|
2017-04-17 18:03:04 +02:00
|
|
|
}
|
|
|
|
|
2018-01-08 23:47:45 +01:00
|
|
|
int id = list[1].trimmed().toInt(&res);
|
2017-04-17 18:03:04 +02:00
|
|
|
if (!res) {
|
2018-01-20 20:13:56 +01:00
|
|
|
qWarning("%s: %d: Invalid ellipsoid code", qPrintable(path), ln);
|
|
|
|
continue;
|
2017-04-17 18:03:04 +02:00
|
|
|
}
|
|
|
|
double radius = list[2].trimmed().toDouble(&res);
|
|
|
|
if (!res) {
|
2018-01-20 20:13:56 +01:00
|
|
|
qWarning("%s: %d: Invalid radius", qPrintable(path), ln);
|
|
|
|
continue;
|
2017-04-17 18:03:04 +02:00
|
|
|
}
|
|
|
|
double flattening = list[3].trimmed().toDouble(&res);
|
|
|
|
if (!res) {
|
2018-01-20 20:13:56 +01:00
|
|
|
qWarning("%s: %d: Invalid flattening", qPrintable(path), ln);
|
|
|
|
continue;
|
2017-04-17 18:03:04 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
Ellipsoid e(radius, 1.0/flattening);
|
|
|
|
_ellipsoids.insert(id, e);
|
|
|
|
}
|
2017-04-03 20:29:35 +02:00
|
|
|
}
|
2018-01-08 23:47:45 +01:00
|
|
|
|
2018-05-17 22:41:56 +02: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;
|
2018-05-17 22:41:56 +02:00
|
|
|
_b = radius * (1.0 - flattening);
|
|
|
|
}
|
|
|
|
|
2018-02-13 23:03:18 +01:00
|
|
|
#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
|
|
|
}
|
2018-02-13 23:03:18 +01:00
|
|
|
#endif // QT_NO_DEBUG
|