You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.8 KiB
135 lines
3.8 KiB
#ifndef TERRAINTILE_H |
|
#define TERRAINTILE_H |
|
|
|
#include "QGCLoggingCategory.h" |
|
|
|
#include <QGeoCoordinate> |
|
|
|
Q_DECLARE_LOGGING_CATEGORY(TerrainTileLog) |
|
|
|
/** |
|
* @brief The TerrainTile class |
|
* |
|
* Implements an interface for https://developers.airmap.com/v2.0/docs/elevation-api |
|
*/ |
|
|
|
class TerrainTile |
|
{ |
|
public: |
|
TerrainTile(); |
|
~TerrainTile(); |
|
|
|
/** |
|
* Constructor from json doc with elevation data (either from file or web) |
|
* |
|
* @param document |
|
*/ |
|
TerrainTile(QJsonDocument document); |
|
|
|
/** |
|
* Constructor from serialized elevation data (either from file or web) |
|
* |
|
* @param document |
|
*/ |
|
TerrainTile(QByteArray byteArray); |
|
|
|
/** |
|
* Check for whether a coordinate lies within this tile |
|
* |
|
* @param coordinate |
|
* @return true if within |
|
*/ |
|
bool isIn(const QGeoCoordinate& coordinate) const; |
|
|
|
/** |
|
* Check whether valid data is loaded |
|
* |
|
* @return true if data is valid |
|
*/ |
|
bool isValid(void) const { return _isValid; } |
|
|
|
/** |
|
* Evaluates the elevation at the given coordinate |
|
* |
|
* @param coordinate |
|
* @return elevation |
|
*/ |
|
double elevation(const QGeoCoordinate& coordinate) const; |
|
|
|
/** |
|
* Accessor for the minimum elevation of the tile |
|
* |
|
* @return minimum elevation |
|
*/ |
|
double minElevation(void) const { return _minElevation; } |
|
|
|
/** |
|
* Accessor for the maximum elevation of the tile |
|
* |
|
* @return maximum elevation |
|
*/ |
|
double maxElevation(void) const { return _maxElevation; } |
|
|
|
/** |
|
* Accessor for the average elevation of the tile |
|
* |
|
* @return average elevation |
|
*/ |
|
double avgElevation(void) const { return _avgElevation; } |
|
|
|
/** |
|
* Accessor for the center coordinate |
|
* |
|
* @return center coordinate |
|
*/ |
|
QGeoCoordinate centerCoordinate(void) const; |
|
|
|
/** |
|
* Serialize data |
|
* |
|
* @return serialized data |
|
*/ |
|
static QByteArray serialize(QByteArray input); |
|
|
|
/// Approximate spacing of the elevation data measurement points |
|
static constexpr double terrainAltitudeSpacing = 30.0; |
|
|
|
private: |
|
typedef struct { |
|
double swLat,swLon, neLat, neLon; |
|
int16_t minElevation; |
|
int16_t maxElevation; |
|
double avgElevation; |
|
int16_t gridSizeLat; |
|
int16_t gridSizeLon; |
|
} TileInfo_t; |
|
|
|
inline int _latToDataIndex(double latitude) const; |
|
inline int _lonToDataIndex(double longitude) const; |
|
|
|
QGeoCoordinate _southWest; /// South west corner of the tile |
|
QGeoCoordinate _northEast; /// North east corner of the tile |
|
|
|
int16_t _minElevation; /// Minimum elevation in tile |
|
int16_t _maxElevation; /// Maximum elevation in tile |
|
double _avgElevation; /// Average elevation of the tile |
|
|
|
int16_t** _data; /// 2D elevation data array |
|
int16_t _gridSizeLat; /// data grid size in latitude direction |
|
int16_t _gridSizeLon; /// data grid size in longitude direction |
|
bool _isValid; /// data loaded is valid |
|
|
|
// Json keys |
|
static const char* _jsonStatusKey; |
|
static const char* _jsonDataKey; |
|
static const char* _jsonBoundsKey; |
|
static const char* _jsonSouthWestKey; |
|
static const char* _jsonNorthEastKey; |
|
static const char* _jsonStatsKey; |
|
static const char* _jsonMaxElevationKey; |
|
static const char* _jsonMinElevationKey; |
|
static const char* _jsonAvgElevationKey; |
|
static const char* _jsonCarpetKey; |
|
}; |
|
|
|
#endif // TERRAINTILE_H
|
|
|