From 300be4973b6f253689b1a7899d2738b56cf44780 Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Sat, 17 Mar 2018 11:23:45 -0700 Subject: [PATCH] Add TerrainCarpetQuery Simplified error reporting --- src/Terrain/TerrainQuery.cc | 134 ++++++++++++++++++++---------------- src/Terrain/TerrainQuery.h | 67 +++++++++++------- 2 files changed, 119 insertions(+), 82 deletions(-) diff --git a/src/Terrain/TerrainQuery.cc b/src/Terrain/TerrainQuery.cc index 38096f319..8ec04efa4 100644 --- a/src/Terrain/TerrainQuery.cc +++ b/src/Terrain/TerrainQuery.cc @@ -42,7 +42,8 @@ void TerrainQuery::_sendQuery(const QString& path, const QUrlQuery& urlQuery) QNetworkReply* networkReply = _networkManager.get(request); if (!networkReply) { - _getNetworkReplyFailed(); + qCDebug(TerrainQueryLog) << "QNetworkManager::Get did not return QNetworkReply"; + _terrainData(false /* success */ , QJsonValue()); return; } @@ -55,8 +56,8 @@ void TerrainQuery::_requestFinished(void) if (reply->error() != QNetworkReply::NoError) { qCDebug(TerrainQueryLog) << "_requestFinished error:" << reply->error(); - _requestFailed(reply->error()); reply->deleteLater(); + _terrainData(false /* success */ , QJsonValue()); return; } @@ -68,7 +69,7 @@ void TerrainQuery::_requestFinished(void) QJsonDocument responseJson = QJsonDocument::fromJson(responseBytes, &parseError); if (parseError.error != QJsonParseError::NoError) { qCDebug(TerrainQueryLog) << "_requestFinished unable to parse json:" << parseError.errorString(); - _requestJsonParseFailed(parseError.errorString()); + _terrainData(false /* success */ , QJsonValue()); return; } @@ -77,12 +78,12 @@ void TerrainQuery::_requestFinished(void) QString status = rootObject["status"].toString(); if (status != "success") { qCDebug(TerrainQueryLog) << "_requestFinished status != success:" << status; - _requestAirmapStatusFailed(status); + _terrainData(false /* success */ , QJsonValue()); return; } // Send back data - _requestSucess(rootObject["data"]); + _terrainData(true /* success */ , rootObject["data"]); } TerrainAtCoordinateBatchManager::TerrainAtCoordinateBatchManager(void) @@ -194,35 +195,14 @@ QString TerrainAtCoordinateBatchManager::_stateToString(State state) return QStringLiteral("State unknown"); } -void TerrainAtCoordinateBatchManager::_getNetworkReplyFailed(void) +void TerrainAtCoordinateBatchManager::_terrainData(bool success, const QJsonValue& dataJsonValue) { - _batchFailed(); -} - -void TerrainAtCoordinateBatchManager::_requestFailed(QNetworkReply::NetworkError error) -{ - Q_UNUSED(error); - _state = State::Idle; - _batchFailed(); -} - -void TerrainAtCoordinateBatchManager::_requestJsonParseFailed(const QString& errorString) -{ - Q_UNUSED(errorString); - _state = State::Idle; - _batchFailed(); -} - -void TerrainAtCoordinateBatchManager::_requestAirmapStatusFailed(const QString& status) -{ - Q_UNUSED(status); _state = State::Idle; - _batchFailed(); -} -void TerrainAtCoordinateBatchManager::_requestSucess(const QJsonValue& dataJsonValue) -{ - _state = State::Idle; + if (!success) { + _batchFailed(); + return; + } QList altitudes; const QJsonArray& dataArray = dataJsonValue.toArray(); @@ -285,35 +265,13 @@ void TerrainPathQuery::requestData(const QGeoCoordinate& fromCoord, const QGeoCo _sendQuery(QStringLiteral("/path"), query); } -void TerrainPathQuery::_getNetworkReplyFailed(void) +void TerrainPathQuery::_terrainData(bool success, const QJsonValue& dataJsonValue) { - PathHeightInfo_t pathHeightInfo; - emit terrainData(false, pathHeightInfo); -} - -void TerrainPathQuery::_requestFailed(QNetworkReply::NetworkError error) -{ - Q_UNUSED(error); - PathHeightInfo_t pathHeightInfo; - emit terrainData(false, pathHeightInfo); -} - -void TerrainPathQuery::_requestJsonParseFailed(const QString& errorString) -{ - Q_UNUSED(errorString); - PathHeightInfo_t pathHeightInfo; - emit terrainData(false, pathHeightInfo); -} - -void TerrainPathQuery::_requestAirmapStatusFailed(const QString& status) -{ - Q_UNUSED(status); - PathHeightInfo_t pathHeightInfo; - emit terrainData(false, pathHeightInfo); -} + if (!success) { + emit terrainData(false /* success */, PathHeightInfo_t()); + return; + } -void TerrainPathQuery::_requestSucess(const QJsonValue& dataJsonValue) -{ QJsonObject jsonObject = dataJsonValue.toArray()[0].toObject(); QJsonArray stepArray = jsonObject["step"].toArray(); QJsonArray profileArray = jsonObject["profile"].toArray(); @@ -371,3 +329,63 @@ void TerrainPolyPathQuery::_terrainDataReceived(bool success, const TerrainPathQ _pathQuery.requestData(_rgCoords[_curIndex], _rgCoords[_curIndex+1]); } } + +TerrainCarpetQuery::TerrainCarpetQuery(QObject* parent) + : TerrainQuery(parent) +{ + +} + +void TerrainCarpetQuery::requestData(const QGeoCoordinate& swCoord, const QGeoCoordinate& neCoord, bool statsOnly) +{ + if (!swCoord.isValid() || !neCoord.isValid()) { + return; + } + + _statsOnly = statsOnly; + + QString points; + points += QString::number(swCoord.latitude(), 'f', 10) + "," + + QString::number(swCoord.longitude(), 'f', 10) + ","; + points += QString::number(neCoord.latitude(), 'f', 10) + "," + + QString::number(neCoord.longitude(), 'f', 10); + + QUrlQuery query; + query.addQueryItem(QStringLiteral("points"), points); + + _sendQuery(QStringLiteral("/carpet"), query); +} + +void TerrainCarpetQuery::_terrainData(bool success, const QJsonValue& dataJsonValue) +{ + if (!success) { + emit terrainData(false /* success */, qQNaN() /* minHeight */ , qQNaN() /* maxHeight */, QList>() /* carpet */); + return; + } + + qDebug() << dataJsonValue; + + QJsonObject jsonObject = dataJsonValue.toArray()[0].toObject(); + + QJsonObject statsObject = jsonObject["stats"].toObject(); + double minHeight = statsObject["min"].toDouble(); + double maxHeight = statsObject["min"].toDouble(); + + QList> carpet; + if (!_statsOnly) { + QJsonArray carpetArray = jsonObject["carpet"].toArray(); + + for (int i=0; i()); + + for (int j=0; j& coordinates); protected: - void _getNetworkReplyFailed (void) final; - void _requestFailed (QNetworkReply::NetworkError error) final; - void _requestJsonParseFailed (const QString& errorString) final; - void _requestAirmapStatusFailed (const QString& status) final; - void _requestSucess (const QJsonValue& dataJsonValue) final; + // Overrides from TerrainQuery + void _terrainData(bool success, const QJsonValue& dataJsonValue) final; private slots: void _sendNextBatch (void); @@ -102,9 +96,9 @@ class TerrainAtCoordinateQuery : public QObject public: TerrainAtCoordinateQuery(QObject* parent = NULL); - /// Async terrain query for a list of lon,lat coordinates. When the query is done, the terrainData() signal - /// is emitted. - /// @param coordinates to query + /// Async terrain query for a list of lon,lat coordinates. When the query is done, the terrainData() signal + /// is emitted. + /// @param coordinates to query void requestData(const QList& coordinates); // Internal method @@ -121,9 +115,9 @@ class TerrainPathQuery : public TerrainQuery public: TerrainPathQuery(QObject* parent = NULL); - /// Async terrain query for terrain heights between two lat/lon coordinates. When the query is done, the terrainData() signal - /// is emitted. - /// @param coordinates to query + /// Async terrain query for terrain heights between two lat/lon coordinates. When the query is done, the terrainData() signal + /// is emitted. + /// @param coordinates to query void requestData(const QGeoCoordinate& fromCoord, const QGeoCoordinate& toCoord); typedef struct { @@ -137,11 +131,8 @@ signals: void terrainData(bool success, const PathHeightInfo_t& pathHeightInfo); protected: - void _getNetworkReplyFailed (void) final; - void _requestFailed (QNetworkReply::NetworkError error) final; - void _requestJsonParseFailed (const QString& errorString) final; - void _requestAirmapStatusFailed (const QString& status) final; - void _requestSucess (const QJsonValue& dataJsonValue) final; + // Overrides from TerrainQuery + void _terrainData(bool success, const QJsonValue& dataJsonValue) final; }; Q_DECLARE_METATYPE(TerrainPathQuery::PathHeightInfo_t) @@ -153,9 +144,9 @@ class TerrainPolyPathQuery : public QObject public: TerrainPolyPathQuery(QObject* parent = NULL); - /// Async terrain query for terrain heights for the paths between each specified QGeoCoordinate. - /// When the query is done, the terrainData() signal is emitted. - /// @param polyPath List of QGeoCoordinate + /// Async terrain query for terrain heights for the paths between each specified QGeoCoordinate. + /// When the query is done, the terrainData() signal is emitted. + /// @param polyPath List of QGeoCoordinate void requestData(const QVariantList& polyPath); void requestData(const QList& polyPath); @@ -173,3 +164,31 @@ private: TerrainPathQuery _pathQuery; }; + +class TerrainCarpetQuery : public TerrainQuery +{ + Q_OBJECT + +public: + TerrainCarpetQuery(QObject* parent = NULL); + + /// Async terrain query for terrain information bounded by the specifed corners. + /// When the query is done, the terrainData() signal is emitted. + /// @param swCoord South-West bound of rectangular area to query + /// @param neCoord North-East bound of rectangular area to query + /// @param statsOnly true: Return only stats, no carpet data + void requestData(const QGeoCoordinate& swCoord, const QGeoCoordinate& neCoord, bool statsOnly); + +signals: + /// Signalled when terrain data comes back from server + void terrainData(bool success, double minHeight, double maxHeight, const QList>& carpet); + + +protected: + // Overrides from TerrainQuery + void _terrainData(bool success, const QJsonValue& dataJsonValue) final; + +private: + bool _statsOnly; +}; + -- 2.22.0