1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-10-06 23:03:22 +02:00
GPXSee/src/map/pcs.cpp

142 lines
3.1 KiB
C++
Raw Normal View History

2018-01-09 09:35:56 +01:00
#include <QFile>
2018-01-08 23:47:45 +01:00
#include "pcs.h"
class PCS::Entry {
public:
Entry(int id, int proj, const PCS &pcs) : _id(id), _proj(proj), _pcs(pcs) {}
2018-01-08 23:47:45 +01:00
int id() const {return _id;}
int proj() const {return _proj;}
const PCS &pcs() const {return _pcs;}
private:
int _id, _proj;
2018-01-08 23:47:45 +01:00
PCS _pcs;
};
QList<PCS::Entry> PCS::_pcss;
static double parameter(const QString &str, bool *res)
{
QString field = str.trimmed();
if (field.isEmpty()) {
*res = true;
return NAN;
}
return field.toDouble(res);
}
const PCS *PCS::pcs(int id)
2018-01-08 23:47:45 +01:00
{
for (int i = 0; i < _pcss.size(); i++)
if (_pcss.at(i).id() == id)
return &(_pcss.at(i).pcs());
2018-01-08 23:47:45 +01:00
return 0;
2018-01-08 23:47:45 +01:00
}
const PCS *PCS::pcs(const GCS *gcs, int proj)
2018-01-09 23:19:35 +01:00
{
for (int i = 0; i < _pcss.size(); i++)
if (_pcss.at(i).proj() == proj && *(_pcss.at(i).pcs().gcs()) == *gcs)
return &(_pcss.at(i).pcs());
return 0;
2018-01-09 23:19:35 +01:00
}
void PCS::loadList(const QString &path)
2018-01-08 23:47:45 +01:00
{
QFile file(path);
bool res;
int ln = 0;
2018-01-08 23:47:45 +01:00
if (!file.open(QFile::ReadOnly)) {
qWarning("Error opening PCS file: %s: %s", qPrintable(path),
qPrintable(file.errorString()));
return;
2018-01-08 23:47:45 +01:00
}
while (!file.atEnd()) {
ln++;
2018-01-08 23:47:45 +01:00
QByteArray line = file.readLine();
QList<QByteArray> list = line.split(',');
if (list.size() != 12) {
qWarning("%s: %d: Format error", qPrintable(path), ln);
continue;
2018-01-08 23:47:45 +01:00
}
int id = list[1].trimmed().toInt(&res);
if (!res) {
qWarning("%s: %d: Invalid PCS code", qPrintable(path), ln);
continue;
2018-01-08 23:47:45 +01:00
}
int gcs = list[2].trimmed().toInt(&res);
if (!res) {
qWarning("%s: %d: Invalid GCS code", qPrintable(path), ln);
continue;
2018-01-08 23:47:45 +01:00
}
int proj = list[3].trimmed().toInt(&res);
if (!res) {
qWarning("%s: %d: Invalid projection code", qPrintable(path), ln);
continue;
}
int transform = list[4].trimmed().toInt(&res);
if (!res) {
qWarning("%s: %d: Invalid coordinate transformation code",
qPrintable(path), ln);
continue;
}
double lat0 = parameter(list[5], &res);
if (!res) {
qWarning("%s: %d: Invalid latitude origin", qPrintable(path), ln);
continue;
}
double lon0 = parameter(list[6], &res);
if (!res) {
qWarning("%s: %d: Invalid longitude origin", qPrintable(path), ln);
continue;
}
double scale = parameter(list[7], &res);
if (!res) {
qWarning("%s: %d: Invalid scale", qPrintable(path), ln);
continue;
}
double fe = parameter(list[8], &res);
if (!res) {
qWarning("%s: %d: Invalid false easting", qPrintable(path), ln);
continue;
}
double fn = parameter(list[9], &res);
if (!res) {
qWarning("%s: %d: Invalid false northing", qPrintable(path), ln);
continue;
}
double sp1 = parameter(list[10], &res);
if (!res) {
qWarning("%s: %d: Invalid standard parallel #1", qPrintable(path),
ln);
continue;
}
double sp2 = parameter(list[11], &res);
if (!res) {
qWarning("%s: %d: Invalid standard parallel #2", qPrintable(path),
ln);
continue;
2018-01-08 23:47:45 +01:00
}
_pcss.append(Entry(id, proj, PCS(GCS::gcs(gcs), transform,
Projection::Setup(lat0, lon0, scale, fe, fn, sp1, sp2))));
2018-01-08 23:47:45 +01:00
}
}
QDebug operator<<(QDebug dbg, const PCS &pcs)
{
dbg.nospace() << "PCS(" << *pcs.gcs() << ", " << pcs.method()
2018-01-08 23:47:45 +01:00
<< ", " << pcs.setup() << ")";
return dbg.maybeSpace();
2018-01-08 23:47:45 +01:00
}