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:
|
2018-01-20 20:13:56 +01:00
|
|
|
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:
|
2018-01-20 20:13:56 +01:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-01-20 20:13:56 +01:00
|
|
|
const PCS *PCS::pcs(int id)
|
2018-01-08 23:47:45 +01:00
|
|
|
{
|
2018-01-20 20:13:56 +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
|
|
|
|
2018-01-20 20:13:56 +01:00
|
|
|
return 0;
|
2018-01-08 23:47:45 +01:00
|
|
|
}
|
|
|
|
|
2018-01-20 20:13:56 +01:00
|
|
|
const PCS *PCS::pcs(const GCS *gcs, int proj)
|
2018-01-09 23:19:35 +01:00
|
|
|
{
|
2018-01-20 20:13:56 +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
|
|
|
}
|
|
|
|
|
2018-01-20 20:13:56 +01:00
|
|
|
void PCS::loadList(const QString &path)
|
2018-01-08 23:47:45 +01:00
|
|
|
{
|
|
|
|
QFile file(path);
|
2018-01-20 20:13:56 +01:00
|
|
|
bool res;
|
|
|
|
int ln = 0;
|
2018-01-08 23:47:45 +01:00
|
|
|
|
|
|
|
if (!file.open(QFile::ReadOnly)) {
|
2018-01-20 20:13:56 +01:00
|
|
|
qWarning("Error opening PCS file: %s: %s", qPrintable(path),
|
|
|
|
qPrintable(file.errorString()));
|
|
|
|
return;
|
2018-01-08 23:47:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
while (!file.atEnd()) {
|
2018-01-20 20:13:56 +01:00
|
|
|
ln++;
|
|
|
|
|
2018-01-08 23:47:45 +01:00
|
|
|
QByteArray line = file.readLine();
|
|
|
|
QList<QByteArray> list = line.split(',');
|
|
|
|
if (list.size() != 12) {
|
2018-01-20 20:13:56 +01:00
|
|
|
qWarning("%s: %d: Format error", qPrintable(path), ln);
|
|
|
|
continue;
|
2018-01-08 23:47:45 +01:00
|
|
|
}
|
|
|
|
|
2018-01-20 20:13:56 +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
|
|
|
}
|
2018-01-20 20:13:56 +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
|
|
|
}
|
2018-01-20 20:13:56 +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
|
|
|
}
|
|
|
|
|
2018-01-20 20:13:56 +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)
|
|
|
|
{
|
2018-01-20 20:13:56 +01:00
|
|
|
dbg.nospace() << "PCS(" << *pcs.gcs() << ", " << pcs.method()
|
2018-01-08 23:47:45 +01:00
|
|
|
<< ", " << pcs.setup() << ")";
|
2018-01-20 20:13:56 +01:00
|
|
|
return dbg.maybeSpace();
|
2018-01-08 23:47:45 +01:00
|
|
|
}
|