/**************************************************************************** * * (c) 2017 QGROUNDCONTROL PROJECT * * QGroundControl is licensed according to the terms in the file * COPYING.md in the root of the source code directory. * ****************************************************************************/ #pragma once #include "TerrainTile.h" #include "QGCLoggingCategory.h" #include #include #include #include #include /* usage example: ElevationProvider *p = new ElevationProvider(); QList coordinates; QGeoCoordinate c(47.379243, 8.548265); coordinates.push_back(c); c.setLatitude(c.latitude()+0.01); coordinates.push_back(c); p->queryTerrainData(coordinates); */ Q_DECLARE_LOGGING_CATEGORY(TerrainLog) class ElevationProvider : public QObject { Q_OBJECT public: ElevationProvider(QObject* parent = NULL); /** * Async elevation query for a list of lon,lat coordinates. When the query is done, the terrainData() signal * is emitted. This call directly looks elevations up online. * @param coordinates * @return true on success */ bool queryTerrainDataPoints(const QList& coordinates); /** * 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. * @param coordinates * @return true on success */ bool queryTerrainData(const QList& coordinates); /** * Cache all data in rectangular region given by south west and north east corner. * * @param southWest * @param northEast * @return true on successful scheduling for download */ bool cacheTerrainTiles(const QGeoCoordinate& southWest, const QGeoCoordinate& northEast); signals: /// signal returning requested elevation data void terrainData(bool success, QList altitudes); private slots: void _requestFinished(); /// slot to handle download of elevation of list of coordinates void _requestFinishedTile(); /// slot to handle download of elevation tiles private: QString _uniqueTileId(const QGeoCoordinate& coordinate); /// Method to create a unique string for each tile. Format: south_west_north_east as floats. void _downloadTiles(void); /// Method to trigger download of queued tiles, eventually emitting the requested altitudes (if any). enum class State { Idle, Downloading, }; State _state = State::Idle; QNetworkAccessManager _networkManager; QList _coordinates; static QMutex _tilesMutex; static QHash _tiles; static QStringList _downloadQueue; };