From ac9fbc8aa2ce0ff892627c228a4972ce9f33c4f3 Mon Sep 17 00:00:00 2001 From: Andreas Bircher Date: Wed, 21 Mar 2018 09:37:23 +0100 Subject: [PATCH] remove deadlock and enable path queries --- src/Terrain/TerrainQuery.cc | 43 ++++++++++++++++++++++++++++++++----- src/Terrain/TerrainQuery.h | 5 +++-- src/TerrainTile.h | 3 +++ 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/Terrain/TerrainQuery.cc b/src/Terrain/TerrainQuery.cc index 3c63063cd..bcb70a7a6 100644 --- a/src/Terrain/TerrainQuery.cc +++ b/src/Terrain/TerrainQuery.cc @@ -237,12 +237,16 @@ void TerrainOfflineAirMapQuery::requestCoordinateHeights(const QListaddPathQuery(this, fromCoord, toCoord); } void TerrainOfflineAirMapQuery::requestCarpetHeights(const QGeoCoordinate& swCoord, const QGeoCoordinate& neCoord, bool statsOnly) { // TODO + Q_UNUSED(swCoord); + Q_UNUSED(neCoord); + Q_UNUSED(statsOnly); + qWarning() << "Carpet queries are currently not supported from offline air map data"; } void TerrainOfflineAirMapQuery::_signalCoordinateHeights(bool success, QList heights) @@ -252,12 +256,12 @@ void TerrainOfflineAirMapQuery::_signalCoordinateHeights(bool success, QList& heights) { - // TODO + emit pathHeights(success, latStep, lonStep, heights); } void TerrainOfflineAirMapQuery::_signalCarpetHeights(bool success, double minHeight, double maxHeight, const QList>& carpet) { - // TODO + emit carpetHeights(success, minHeight, maxHeight, carpet); } TerrainTileManager::TerrainTileManager(void) @@ -271,7 +275,7 @@ void TerrainTileManager::addCoordinateQuery(TerrainOfflineAirMapQuery* terrainQu QList altitudes; if (!_getAltitudesForCoordinates(coordinates, altitudes)) { - QueuedRequestInfo_t queuedRequestInfo = { terrainQueryInterface, coordinates, QueryMode::QueryModeCoordinates }; + QueuedRequestInfo_t queuedRequestInfo = { terrainQueryInterface, QueryMode::QueryModeCoordinates, coordinates }; _requestQueue.append(queuedRequestInfo); return; } @@ -281,6 +285,35 @@ void TerrainTileManager::addCoordinateQuery(TerrainOfflineAirMapQuery* terrainQu } } +void TerrainTileManager::addPathQuery(TerrainOfflineAirMapQuery* terrainQueryInterface, const QGeoCoordinate &startPoint, const QGeoCoordinate &endPoint) +{ + QList coordinates; + double lat = startPoint.latitude(); + double lon = startPoint.longitude(); + double latDiff = endPoint.latitude() - lat; + double lonDiff = endPoint.longitude() - lon; + double steps = ceil(endPoint.distanceTo(startPoint) / TerrainTile::terrainAltitudeSpacing); + for (double i = 0.0; i <= steps; i = i + 1) { + coordinates.append(QGeoCoordinate(lat + latDiff * i / steps, lon + lonDiff * i / steps)); + } + + QList altitudes; + if (!_getAltitudesForCoordinates(coordinates, altitudes)) { + QueuedRequestInfo_t queuedRequestInfo = { terrainQueryInterface, QueryMode::QueryModePath, coordinates }; + _requestQueue.append(queuedRequestInfo); + return; + } + + qCDebug(TerrainQueryLog) << "All altitudes taken from cached data"; + double stepLat = 0; + double stepLon = 0; + if (coordinates.count() > 1) { + stepLat = coordinates[1].latitude() - coordinates[0].latitude(); + stepLon = coordinates[1].longitude() - coordinates[0].longitude(); + } + terrainQueryInterface->_signalPathHeights(coordinates.count() == altitudes.count(), stepLat, stepLon, altitudes); +} + bool TerrainTileManager::_getAltitudesForCoordinates(const QList& coordinates, QList& altitudes) { foreach (const QGeoCoordinate& coordinate, coordinates) { @@ -457,8 +490,8 @@ void TerrainAtCoordinateBatchManager::_sendNextBatch(void) } _requestQueue.clear(); - _terrainQuery.requestCoordinateHeights(coords); _state = State::Downloading; + _terrainQuery.requestCoordinateHeights(coords); } void TerrainAtCoordinateBatchManager::_batchFailed(void) diff --git a/src/Terrain/TerrainQuery.h b/src/Terrain/TerrainQuery.h index d79910dac..96d98e24c 100644 --- a/src/Terrain/TerrainQuery.h +++ b/src/Terrain/TerrainQuery.h @@ -114,7 +114,8 @@ class TerrainTileManager : public QObject { public: TerrainTileManager(void); - void addCoordinateQuery(TerrainOfflineAirMapQuery* terrainQueryInterface, const QList& coordinates); + void addCoordinateQuery (TerrainOfflineAirMapQuery* terrainQueryInterface, const QList& coordinates); + void addPathQuery (TerrainOfflineAirMapQuery* terrainQueryInterface, const QGeoCoordinate& startPoint, const QGeoCoordinate& endPoint); private slots: void _fetchedTile (void); /// slot to handle fetched elevation tiles @@ -133,8 +134,8 @@ private: typedef struct { TerrainOfflineAirMapQuery* terrainQueryInterface; - QList coordinates; QueryMode queryMode; + QList coordinates; } QueuedRequestInfo_t; void _tileFailed(void); diff --git a/src/TerrainTile.h b/src/TerrainTile.h index 200a24d92..f8c8c9ed6 100644 --- a/src/TerrainTile.h +++ b/src/TerrainTile.h @@ -77,6 +77,9 @@ public: */ QGeoCoordinate centerCoordinate(void) const; + /// Approximate spacing of the elevation data measurement points + static constexpr double terrainAltitudeSpacing = 30.0; + private: inline int _latToDataIndex(double latitude) const; inline int _lonToDataIndex(double longitude) const; -- 2.22.0