diff --git a/lang/gpxsee_cs.ts b/lang/gpxsee_cs.ts index 458ab026..f5e24333 100644 --- a/lang/gpxsee_cs.ts +++ b/lang/gpxsee_cs.ts @@ -24,22 +24,22 @@ m - + Ascent Stoupání - + Descent Klesání - + Minimum Minimum - + Maximum Maximum @@ -47,123 +47,162 @@ GUI - + About Qt O Qt - + GPXSee is distributed under the terms of the GNU General Public License version 3. For more info about GPXSee visit the project homepage at Program GPXSee je distribuován pod podmínkami licence GNU General Public License verze 3. Pro více informací navštivte stránky programu na adrese - + Open file Otevřít soubor - + Save as Uložit jako - + Open POI file Otevřít POI soubor - + Open Otevřít - + Quit Ukončit - + Save Uložit - + Close Zavřít - + Load file Nahrát soubor - + Show Zobrazit - - + + File Soubor - - + + POI POI - + Help Nápověda - + Elevation Výška - + Speed Rychlost - - + + Maximum + Maximum + + + + Minimum + Minimum + + + + About GPXSee O aplikaci GPXSee - + GPX viewer and analyzer Prohlížeč a analyzátor GPX - + + Distance + Vzdálenost + + + + Time + Čas + + + + Ascent + Stoupání + + + + + + + m + m + + + + Descent + Klesání + + + %1 tracks Počet tras: %1 - + + km km - - + + Error Chyba - + Error loading GPX file: %1 Soubor GPX nelze otevřít: %1 - + Error loading POI file: %1 Soubor POI nelze otevřít: @@ -173,12 +212,12 @@ QObject - + Not a GPX file. Neplatný GPX soubor. - + %1 Line %2 %1 @@ -202,32 +241,32 @@ Rádka %1 SpeedGraph - + Distance Vzdálenost - + Speed Rychlost - + km - + km/h km/h - + Average Průměr - + Maximum Maximum diff --git a/src/elevationgraph.h b/src/elevationgraph.h index d0908f87..66fbce78 100644 --- a/src/elevationgraph.h +++ b/src/elevationgraph.h @@ -14,6 +14,11 @@ public: void loadGPX(const GPX &gpx); void clear(); + qreal ascent() const {return _ascent;} + qreal descent() const {return _descent;} + qreal max() const {return _max;} + qreal min() const {return _min;} + private: qreal _ascent, _descent; qreal _max, _min; diff --git a/src/gpx.cpp b/src/gpx.cpp index 44ed1826..e12f7104 100644 --- a/src/gpx.cpp +++ b/src/gpx.cpp @@ -11,68 +11,6 @@ #define WINDOW_SF 11 -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; -} - -static QVector filter(const QVector &v, int window) -{ - qreal acc = 0; - QVector ret; - - if (v.size() < window) - return QVector(v); - - for (int i = 0; i < window; i++) - acc += v.at(i).y(); - for (int i = 0; i <= window/2; i++) - ret.append(QPointF(v.at(i).x(), acc/window)); - - for (int i = window/2 + 1; i < v.size() - window/2; i++) { - acc += v.at(i + window/2).y() - v.at(i - (window/2 + 1)).y(); - ret.append(QPointF(v.at(i).x(), acc/window)); - } - - for (int i = v.size() - window/2; i < v.size(); i++) - ret.append(QPointF(v.at(i).x(), acc/window)); - - return ret; -} - - -void GPX::elevationGraph(QVector &graph) const -{ - qreal dist = 0; - QVector raw; - - if (!_data.size()) - return; - - raw.append(QPointF(0, _data.at(0).elevation)); - for (int i = 1; i < _data.size(); i++) { - dist += llDistance(_data.at(i).coordinates, _data.at(i-1).coordinates); - raw.append(QPointF(dist, _data.at(i).elevation)); - } - - graph = filter(raw, WINDOW_EF); -} - static bool lt(const QPointF &p1, const QPointF &p2) { return p1.y() < p2.y(); @@ -120,6 +58,69 @@ static QVector eliminate(const QVector &v, int window) return ret; } +static QVector filter(const QVector &v, int window) +{ + qreal acc = 0; + QVector ret; + + if (v.size() < window) + return QVector(v); + + for (int i = 0; i < window; i++) + acc += v.at(i).y(); + for (int i = 0; i <= window/2; i++) + ret.append(QPointF(v.at(i).x(), acc/window)); + + for (int i = window/2 + 1; i < v.size() - window/2; i++) { + acc += v.at(i + window/2).y() - v.at(i - (window/2 + 1)).y(); + ret.append(QPointF(v.at(i).x(), acc/window)); + } + + for (int i = v.size() - window/2; i < v.size(); i++) + ret.append(QPointF(v.at(i).x(), acc/window)); + + return ret; +} + + +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; +} + +void GPX::elevationGraph(QVector &graph) const +{ + qreal dist = 0; + QVector raw; + + if (!_data.size()) + return; + + raw.append(QPointF(0, _data.at(0).elevation)); + for (int i = 1; i < _data.size(); i++) { + dist += llDistance(_data.at(i).coordinates, _data.at(i-1).coordinates); + raw.append(QPointF(dist, _data.at(i).elevation + - _data.at(i).geoidheight)); + } + + graph = filter(raw, WINDOW_EF); +} + void GPX::speedGraph(QVector &graph) const { qreal dist = 0, v, ds, dt; diff --git a/src/graph.cpp b/src/graph.cpp index 8ad5d737..520eae54 100644 --- a/src/graph.cpp +++ b/src/graph.cpp @@ -216,9 +216,11 @@ void Graph::plot(QPainter *painter, const QRectF &target) QSizeF canvas = QSizeF(orig.height() * ratio, orig.height()); resize(canvas); - _slider->setVisible(false); + _slider->hide(); + _info->hide(); _scene->render(painter, target, QRectF(), Qt::KeepAspectRatioByExpanding); - _slider->setVisible(true); + _slider->show(); + _info->show(); resize(orig); } diff --git a/src/gui.cpp b/src/gui.cpp index 41b3bba5..7cacd55f 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -8,7 +8,6 @@ #include #include #include -#include "gui.h" #include "config.h" #include "icons.h" #include "keys.h" @@ -16,10 +15,13 @@ #include "elevationgraph.h" #include "speedgraph.h" #include "track.h" +#include "infoitem.h" +#include "gui.h" #include + static QString timeSpan(qreal time) { unsigned h, m, s; @@ -287,12 +289,28 @@ void GUI::saveFile(const QString &fileName) printer.setOutputFileName(fileName); QPainter p(&printer); - int margin = (printer.paperRect().height() - printer.pageRect().height()) - / 2; - _track->plot(&p, QRectF(0, 0, printer.width(), (0.80 * printer.height()) - - margin)); + + _track->plot(&p, QRectF(0, 300, printer.width(), (0.80 * printer.height()) + - 400)); _elevationGraph->plot(&p, QRectF(0, 0.80 * printer.height(), printer.width(), printer.height() * 0.20)); + + QGraphicsScene scene; + InfoItem info; + info.insert(tr("Distance"), QString::number(_distance / 1000, 'f', 1) + " " + + tr("km")); + info.insert(tr("Time"), timeSpan(_time)); + info.insert(tr("Ascent"), QString::number(_elevationGraph->ascent(), 'f', 0) + + " " + tr("m")); + info.insert(tr("Descent"), QString::number(_elevationGraph->descent(), 'f', + 0) + " " + tr("m")); + info.insert(tr("Maximum"), QString::number(_elevationGraph->max(), 'f', 0) + + " " + tr("m")); + info.insert(tr("Minimum"), QString::number(_elevationGraph->min(), 'f', 0) + + " " + tr("m")); + scene.addItem(&info); + scene.render(&p, QRectF(0, 0, printer.width(), 200)); + p.end(); } diff --git a/src/parser.cpp b/src/parser.cpp index 6fc1be6d..a9bb4c4f 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -18,6 +18,8 @@ void Parser::handleTrekPointData(QVector &data, if (element == "time") data.last().timestamp = QDateTime::fromString(value.toLatin1(), Qt::ISODate); + if (element == "geoidheight") + data.last().geoidheight = value.toLatin1().toDouble(); } void Parser::handleTrekPointAttributes(QVector &data, @@ -41,7 +43,8 @@ void Parser::extensions(QVector &data) void Parser::trekPointData(QVector &data) { while (_reader.readNextStartElement()) { - if (_reader.name() == "ele" || _reader.name() == "time") + if (_reader.name() == "ele" || _reader.name() == "time" + || _reader.name() == "geoidheight") handleTrekPointData(data, _reader.name(), _reader.readElementText()); else if (_reader.name() == "extensions") extensions(data); diff --git a/src/parser.h b/src/parser.h index 0f02b779..e1ac47eb 100644 --- a/src/parser.h +++ b/src/parser.h @@ -10,9 +10,10 @@ struct TrackPoint QPointF coordinates; QDateTime timestamp; qreal elevation; + qreal geoidheight; qreal speed; - TrackPoint() {speed = -1;} + TrackPoint() {elevation = 0; geoidheight = 0; speed = -1;} }; class Parser diff --git a/src/speedgraph.cpp b/src/speedgraph.cpp index 33e9b9e0..102ff5e7 100644 --- a/src/speedgraph.cpp +++ b/src/speedgraph.cpp @@ -18,30 +18,21 @@ SpeedGraph::SpeedGraph(QWidget *parent) : Graph(parent) void SpeedGraph::loadGPX(const GPX &gpx) { QVector data; - qreal max = 0, sum = 0, w = 0, avg; + qreal max = 0; gpx.speedGraph(data); if (data.isEmpty()) return; - avg = gpx.distance() / gpx.time(); - _avg.append(QPointF(gpx.distance(), avg)); + _avg.append(QPointF(gpx.distance(), gpx.distance() / gpx.time())); for (int i = 0; i < data.size(); i++) max = qMax(max, data.at(i).y()); - - - sum = 0; w = 0; - for (QList::iterator it = _avg.begin(); it != _avg.end(); it++) { - sum += it->y() * it->x(); - w += it->x(); - } - avg = sum / w; _max = qMax(_max, max); - addInfo(tr("Average"), QString::number(avg * _yScale, 'f', 1) + " " + addInfo(tr("Average"), QString::number(avg() * _yScale, 'f', 1) + " " + _yUnits); addInfo(tr("Maximum"), QString::number(_max * _yScale, 'f', 1) + " " + _yUnits); @@ -49,6 +40,19 @@ void SpeedGraph::loadGPX(const GPX &gpx) Graph::loadData(data); } +qreal SpeedGraph::avg() const +{ + qreal sum = 0, w = 0; + QList::const_iterator it; + + for (it = _avg.begin(); it != _avg.end(); it++) { + sum += it->y() * it->x(); + w += it->x(); + } + + return (sum / w); +} + void SpeedGraph::clear() { _max = 0; diff --git a/src/speedgraph.h b/src/speedgraph.h index 406e4104..c9dc6e8c 100644 --- a/src/speedgraph.h +++ b/src/speedgraph.h @@ -15,6 +15,9 @@ public: void loadGPX(const GPX &gpx); void clear(); + qreal avg() const; + qreal max() const {return _max;} + private: qreal _max; QList _avg;