Terrain.h 2.42 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
/****************************************************************************
 *
 *   (c) 2017 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/

#pragma once

Andreas Bircher's avatar
Andreas Bircher committed
12
#include "TerrainTile.h"
13
#include "QGCMapEngineData.h"
Andreas Bircher's avatar
Andreas Bircher committed
14 15
#include "QGCLoggingCategory.h"

16 17 18
#include <QObject>
#include <QGeoCoordinate>
#include <QNetworkAccessManager>
Andreas Bircher's avatar
Andreas Bircher committed
19 20
#include <QHash>
#include <QMutex>
21
#include <QtLocation/private/qgeotiledmapreply_p.h>
Andreas Bircher's avatar
Andreas Bircher committed
22

DonLakeFlyer's avatar
DonLakeFlyer committed
23
Q_DECLARE_LOGGING_CATEGORY(ElevationProviderLog)
24

DonLakeFlyer's avatar
DonLakeFlyer committed
25
class ElevationProvider;
26

DonLakeFlyer's avatar
DonLakeFlyer committed
27 28
/// Used internally by ElevationProvider to batch requests together
class TerrainBatchManager : public QObject {
29 30
    Q_OBJECT

DonLakeFlyer's avatar
DonLakeFlyer committed
31 32
public:
    TerrainBatchManager(void);
33

DonLakeFlyer's avatar
DonLakeFlyer committed
34
    void addQuery(ElevationProvider* elevationProvider, const QList<QGeoCoordinate>& coordinates);
35 36

private slots:
37
    void _fetchedTile       (void);                             /// slot to handle fetched elevation tiles
DonLakeFlyer's avatar
DonLakeFlyer committed
38

39
private:
DonLakeFlyer's avatar
DonLakeFlyer committed
40 41 42 43 44
    typedef struct {
        ElevationProvider*      elevationProvider;
        QList<QGeoCoordinate>   coordinates;
    } QueuedRequestInfo_t;

45 46 47 48 49
    enum class State {
        Idle,
        Downloading,
    };

50 51 52
    void _tileFailed(void);
    bool _getAltitudesForCoordinates(const QList<QGeoCoordinate>& coordinates, QList<float>& altitudes);
    QString _getTileHash(const QGeoCoordinate& coordinate);     /// Method to create a unique string for each tile
DonLakeFlyer's avatar
DonLakeFlyer committed
53 54 55 56

    QList<QueuedRequestInfo_t>  _requestQueue;
    State                       _state = State::Idle;
    QNetworkAccessManager       _networkManager;
57 58 59

    QMutex                      _tilesMutex;
    QHash<QString, TerrainTile> _tiles;
DonLakeFlyer's avatar
DonLakeFlyer committed
60
};
61 62 63 64 65 66 67

class ElevationProvider : public QObject
{
    Q_OBJECT
public:
    ElevationProvider(QObject* parent = NULL);

Andreas Bircher's avatar
Andreas Bircher committed
68 69 70
    /**
     * Async elevation query for a list of lon,lat coordinates. When the query is done, the terrainData() signal
     * is emitted. This call caches local elevation tables for faster lookup in the future.
71 72 73 74 75
     * @param coordinates
     * @return true on success
     */
    bool queryTerrainData(const QList<QGeoCoordinate>& coordinates);

76
    /// Internal method
DonLakeFlyer's avatar
DonLakeFlyer committed
77 78
    void _signalTerrainData(bool success, QList<float>& altitudes);

79
signals:
Andreas Bircher's avatar
Andreas Bircher committed
80
    /// signal returning requested elevation data
81 82
    void terrainData(bool success, QList<float> altitudes);
};