File indexing completed on 2024-04-28 15:39:05

0001 // SPDX-FileCopyrightText: 2020-2023 Tobias Leupold <tl at stonemx dot de>
0002 //
0003 // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 
0005 #ifndef GPXENGINE_H
0006 #define GPXENGINE_H
0007 
0008 // Local includes
0009 #include "KGeoTag.h"
0010 #include "Coordinates.h"
0011 
0012 // Qt includes
0013 #include <QObject>
0014 #include <QVector>
0015 #include <QHash>
0016 #include <QDateTime>
0017 #include <QImage>
0018 #include <QJsonObject>
0019 
0020 // Local classes
0021 class GeoDataModel;
0022 
0023 class GpxEngine : public QObject
0024 {
0025     Q_OBJECT
0026 
0027 public:
0028     enum LoadResult {
0029         OpenFailed,
0030         XmlError,
0031         NoGpxElement,
0032         NoGeoData,
0033         AlreadyLoaded,
0034         Okay
0035     };
0036 
0037     struct LoadInfo
0038     {
0039         LoadResult result;
0040         int tracks = 0;
0041         int segments = 0;
0042         int points = 0;
0043     };
0044 
0045     explicit GpxEngine(QObject *parent, GeoDataModel *geoDataModel);
0046     GpxEngine::LoadInfo load(const QString &path);
0047     Coordinates findExactCoordinates(const QDateTime &time, int deviation) const;
0048     Coordinates findInterpolatedCoordinates(const QDateTime &time, int deviation) const;
0049     QPair<Coordinates, QDateTime> findClosestTrackPoint(QDateTime time,
0050                                                         int cameraClockDeviation) const;
0051     void setMatchParameters(int exactMatchTolerance, int maximumInterpolationInterval,
0052                             int maximumInterpolationDistance);
0053     QByteArray lastDetectedTimeZoneId() const;
0054     bool timeZoneDataLoaded() const;
0055 
0056 private: // Functions
0057     Coordinates findExactCoordinates(const QDateTime &time) const;
0058     Coordinates findInterpolatedCoordinates(const QDateTime &time) const;
0059 
0060 private: // Variables
0061     GeoDataModel *m_geoDataModel;
0062 
0063     int m_exactMatchTolerance;
0064     int m_maximumInterpolationInterval;
0065     int m_maximumInterpolationDistance;
0066 
0067     QImage m_timezoneMap;
0068     double m_timezoneMapWidth = 0.0;
0069     double m_timezoneMapHeight = 0.0;
0070     QJsonObject m_timezoneMapping;
0071     QByteArray m_lastDetectedTimeZoneId;
0072 
0073 };
0074 
0075 #endif // GPXENGINE_H