Commit b91d7290 authored by Andreas Bircher's avatar Andreas Bircher

online version

parent 8b7553b5
...@@ -30,39 +30,9 @@ ElevationProvider::ElevationProvider(QObject* parent) ...@@ -30,39 +30,9 @@ ElevationProvider::ElevationProvider(QObject* parent)
} }
bool ElevationProvider::queryTerrainData(const QList<QGeoCoordinate>& coordinates) bool ElevationProvider::queryTerrainDataPoints(const QList<QGeoCoordinate>& coordinates)
{ {
if (coordinates.length() == 0) { if (_state != State::Idle || coordinates.length() == 0) {
return false;
}
bool fallBackToOnline = false;
QList<float> altitudes;
foreach (QGeoCoordinate coordinate, coordinates) {
QString uniqueTileId = _uniqueTileId(coordinate);
_tilesMutex.lock();
if (!_tiles.contains(uniqueTileId)) {
_tilesMutex.unlock();
fallBackToOnline = true;
break;
} else {
if (_tiles[uniqueTileId].isIn(coordinate)) {
altitudes.push_back(_tiles[uniqueTileId].elevation(coordinate));
} else {
qCDebug(TerrainLog) << "Error: coordinate not in tile region";
altitudes.push_back(-1.0);
}
}
_tilesMutex.unlock();
}
if (!fallBackToOnline) {
qCDebug(TerrainLog) << "All altitudes taken from cached data";
emit terrainData(true, altitudes);
return true;
}
if (_state != State::Idle) {
return false; return false;
} }
...@@ -95,6 +65,47 @@ bool ElevationProvider::queryTerrainData(const QList<QGeoCoordinate>& coordinate ...@@ -95,6 +65,47 @@ bool ElevationProvider::queryTerrainData(const QList<QGeoCoordinate>& coordinate
return true; return true;
} }
bool ElevationProvider::queryTerrainData(const QList<QGeoCoordinate>& coordinates)
{
if (_state != State::Idle || coordinates.length() == 0) {
return false;
}
QList<float> altitudes;
bool needToDownload = false;
foreach (QGeoCoordinate coordinate, coordinates) {
QString uniqueTileId = _uniqueTileId(coordinate);
_tilesMutex.lock();
if (!_tiles.contains(uniqueTileId)) {
qCDebug(TerrainLog) << "Need to download tile " << uniqueTileId;
_downloadQueue.append(uniqueTileId);
needToDownload = true;
} else {
if (!needToDownload) {
if (_tiles[uniqueTileId].isIn(coordinate)) {
altitudes.push_back(_tiles[uniqueTileId].elevation(coordinate));
} else {
qCDebug(TerrainLog) << "Error: coordinate not in tile region";
altitudes.push_back(-1.0);
}
}
}
_tilesMutex.unlock();
}
if (!needToDownload) {
qCDebug(TerrainLog) << "All altitudes taken from cached data";
emit terrainData(true, altitudes);
_coordinates.clear();
return true;
}
_coordinates = coordinates;
_downloadTiles();
return true;
}
bool ElevationProvider::cacheTerrainTiles(const QGeoCoordinate& southWest, const QGeoCoordinate& northEast) bool ElevationProvider::cacheTerrainTiles(const QGeoCoordinate& southWest, const QGeoCoordinate& northEast)
{ {
qCDebug(TerrainLog) << "Cache terrain tiles southWest:northEast" << southWest << northEast; qCDebug(TerrainLog) << "Cache terrain tiles southWest:northEast" << southWest << northEast;
...@@ -116,7 +127,7 @@ bool ElevationProvider::cacheTerrainTiles(const QGeoCoordinate& southWest, const ...@@ -116,7 +127,7 @@ bool ElevationProvider::cacheTerrainTiles(const QGeoCoordinate& southWest, const
_tilesMutex.unlock(); _tilesMutex.unlock();
continue; continue;
} }
_downloadQueue.append(uniqueTileId.replace("_", ",")); _downloadQueue.append(uniqueTileId);
_tilesMutex.unlock(); _tilesMutex.unlock();
qCDebug(TerrainLog) << "Adding tile to download queue: " << uniqueTileId; qCDebug(TerrainLog) << "Adding tile to download queue: " << uniqueTileId;
} }
...@@ -139,7 +150,7 @@ bool ElevationProvider::cacheTerrainTiles(const QList<QGeoCoordinate>& coordinat ...@@ -139,7 +150,7 @@ bool ElevationProvider::cacheTerrainTiles(const QList<QGeoCoordinate>& coordinat
_tilesMutex.unlock(); _tilesMutex.unlock();
continue; continue;
} }
_downloadQueue.append(uniqueTileId.replace("_", ",")); _downloadQueue.append(uniqueTileId);
_tilesMutex.unlock(); _tilesMutex.unlock();
qCDebug(TerrainLog) << "Adding tile to download queue: " << uniqueTileId; qCDebug(TerrainLog) << "Adding tile to download queue: " << uniqueTileId;
} }
...@@ -233,12 +244,13 @@ void ElevationProvider::_downloadTiles(void) ...@@ -233,12 +244,13 @@ void ElevationProvider::_downloadTiles(void)
QUrlQuery query; QUrlQuery query;
_tilesMutex.lock(); _tilesMutex.lock();
qCDebug(TerrainLog) << "Starting download for " << _downloadQueue.first(); qCDebug(TerrainLog) << "Starting download for " << _downloadQueue.first();
query.addQueryItem(QStringLiteral("points"), _downloadQueue.first()); query.addQueryItem(QStringLiteral("points"), _downloadQueue.first().replace("_", ","));
_downloadQueue.pop_front(); _downloadQueue.pop_front();
_tilesMutex.unlock(); _tilesMutex.unlock();
QUrl url(QStringLiteral("https://api.airmap.com/elevation/stage/srtm1/ele/carpet")); QUrl url(QStringLiteral("https://api.airmap.com/elevation/stage/srtm1/ele/carpet"));
url.setQuery(query); url.setQuery(query);
qWarning() << "url" << url;
QNetworkRequest request(url); QNetworkRequest request(url);
QNetworkProxy tProxy; QNetworkProxy tProxy;
...@@ -253,6 +265,8 @@ void ElevationProvider::_downloadTiles(void) ...@@ -253,6 +265,8 @@ void ElevationProvider::_downloadTiles(void)
connect(networkReply, &QNetworkReply::finished, this, &ElevationProvider::_requestFinishedTile); connect(networkReply, &QNetworkReply::finished, this, &ElevationProvider::_requestFinishedTile);
_state = State::Downloading; _state = State::Downloading;
} else if (_state == State::Idle) {
queryTerrainData(_coordinates);
} }
} }
......
...@@ -38,7 +38,15 @@ public: ...@@ -38,7 +38,15 @@ public:
/** /**
* Async elevation query for a list of lon,lat coordinates. When the query is done, the terrainData() signal * Async elevation query for a list of lon,lat coordinates. When the query is done, the terrainData() signal
* is emitted. * is emitted. This call directly looks elevations up online.
* @param coordinates
* @return true on success
*/
bool queryTerrainDataPoints(const QList<QGeoCoordinate>& 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 * @param coordinates
* @return true on success * @return true on success
*/ */
...@@ -80,6 +88,7 @@ private: ...@@ -80,6 +88,7 @@ private:
State _state = State::Idle; State _state = State::Idle;
QNetworkAccessManager _networkManager; QNetworkAccessManager _networkManager;
QList<QGeoCoordinate> _coordinates;
static QMutex _tilesMutex; static QMutex _tilesMutex;
static QHash<QString, TerrainTile> _tiles; static QHash<QString, TerrainTile> _tiles;
......
...@@ -141,8 +141,8 @@ float TerrainTile::elevation(const QGeoCoordinate& coordinate) const ...@@ -141,8 +141,8 @@ float TerrainTile::elevation(const QGeoCoordinate& coordinate) const
if (_isValid) { if (_isValid) {
qCDebug(TerrainTileLog) << "elevation: " << coordinate << " , in sw " << _southWest << " , ne " << _northEast; qCDebug(TerrainTileLog) << "elevation: " << coordinate << " , in sw " << _southWest << " , ne " << _northEast;
// Get the index at resolution of 1 arc second // Get the index at resolution of 1 arc second
int indexLat = std::round((coordinate.latitude() - _southWest.latitude()) * gridSize / srtm1TileSize); int indexLat = round((coordinate.latitude() - _southWest.latitude()) * (gridSize - 1) / srtm1TileSize);
int indexLon = std::round((coordinate.longitude() - _southWest.longitude()) * gridSize / srtm1TileSize); int indexLon = round((coordinate.longitude() - _southWest.longitude()) * (gridSize - 1) / srtm1TileSize);
qCDebug(TerrainTileLog) << "indexLat:indexLon" << indexLat << indexLon; // TODO (birchera): Move this down to the next debug output, once this is all properly working. qCDebug(TerrainTileLog) << "indexLat:indexLon" << indexLat << indexLon; // TODO (birchera): Move this down to the next debug output, once this is all properly working.
Q_ASSERT(indexLat >= 0); Q_ASSERT(indexLat >= 0);
Q_ASSERT(indexLat < gridSize); Q_ASSERT(indexLat < gridSize);
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#include <QGeoCoordinate> #include <QGeoCoordinate>
#define TERRAIN_TILE_SIZE 90 #define TERRAIN_TILE_SIZE 91
Q_DECLARE_LOGGING_CATEGORY(TerrainTileLog) Q_DECLARE_LOGGING_CATEGORY(TerrainTileLog)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment