1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-02-12 06:10:48 +01:00
GPXSee/src/gpx.cpp

116 lines
2.2 KiB
C++
Raw Normal View History

2015-10-05 01:43:48 +02:00
#include <QFile>
#include <QLineF>
#include "ll.h"
#include "gpx.h"
#include <QDebug>
#define ALPHA 0.5
#define WINDOW 5
2015-10-05 01:43:48 +02:00
bool GPX::loadFile(const QString &fileName)
{
QFile file(fileName);
bool ret;
_data.clear();
_error.clear();
if (!file.open(QFile::ReadOnly | QFile::Text)) {
_error = qPrintable(file.errorString());
return false;
}
if (!(ret = _parser.loadFile(&file, _data)))
_error = _parser.errorString();
file.close();
return ret;
}
2015-10-12 01:12:12 +02:00
void GPX::elevationGraph(QVector<QPointF> &graph) const
2015-10-05 01:43:48 +02:00
{
2015-10-14 02:54:36 +02:00
qreal dist = 0, dh, acc;
2015-10-05 01:43:48 +02:00
if (!_data.size())
2015-10-12 01:12:12 +02:00
return;
2015-10-05 01:43:48 +02:00
graph.append(QPointF(0, _data.at(0).elevation));
for (int i = 1; i < _data.size(); i++) {
2015-10-14 02:54:36 +02:00
dist += llDistance(_data.at(i).coordinates, _data.at(i-1).coordinates);
2015-10-05 01:43:48 +02:00
dh = _data.at(i).elevation;
acc = (i == 1) ? dh : (ALPHA * dh) + (1.0 - ALPHA) * acc;
2015-10-05 01:43:48 +02:00
graph.append(QPointF(dist, acc));
}
}
static bool lt(const QPointF &p1, const QPointF &p2)
{
return p1.y() < p2.y();
}
static qreal median(QVector<QPointF> v)
{
qSort(v.begin(), v.end(), lt);
return v.at(v.size() / 2).y();
}
2015-10-12 01:12:12 +02:00
void GPX::speedGraph(QVector<QPointF> &graph) const
2015-10-05 01:43:48 +02:00
{
qreal dist = 0, v, ds, dt;
2015-10-05 01:43:48 +02:00
if (!_data.size())
2015-10-12 01:12:12 +02:00
return;
2015-10-05 01:43:48 +02:00
graph.append(QPointF(0, 0));
for (int i = 1; i < _data.size(); i++) {
ds = llDistance(_data.at(i).coordinates, _data.at(i-1).coordinates);
dt = _data.at(i-1).timestamp.msecsTo(_data.at(i).timestamp) / 1000.0;
dist += ds;
if (_data.at(i).speed < 0) {
if (dt == 0)
continue;
v = ds / dt;
} else
v = _data.at(i).speed;
graph.append(QPointF(dist, v));
2015-10-05 01:43:48 +02:00
}
if (graph.size() > WINDOW)
for (int i = WINDOW/2; i < graph.size() - WINDOW/2; i++)
graph[i].setY(median(graph.mid(i - WINDOW/2, WINDOW)));
2015-10-05 01:43:48 +02:00
}
2015-10-12 01:12:12 +02:00
void GPX::track(QVector<QPointF> &track) const
2015-10-05 01:43:48 +02:00
{
QPointF p;
for (int i = 0; i < _data.size(); i++) {
ll2mercator(_data.at(i).coordinates, p);
track.append(p);
}
}
2015-10-14 02:54:36 +02:00
qreal GPX::distance()
{
qreal dist = 0;
for (int i = 1; i < _data.size(); i++)
dist += llDistance(_data.at(i).coordinates, _data.at(i-1).coordinates);
return dist;
}
qreal GPX::time()
{
if (_data.size() < 2)
return 0;
return (_data.at(0).timestamp.msecsTo(_data.at(_data.size() - 1).timestamp)
/ 1000.0);
}