7#include <QtCore/QJsonArray>
8#include <QtCore/QJsonDocument>
9#include <QtCore/QJsonObject>
11#include <QtCore/QUrlQuery>
12#include <QtNetwork/QNetworkAccessManager>
13#include <QtNetwork/QNetworkReply>
14#include <QtNetwork/QNetworkRequest>
15#include <QtNetwork/QSslConfiguration>
16#include <QtPositioning/QGeoCoordinate>
23 qCDebug(TerrainQueryCopernicusLog) <<
this;
28 qCDebug(TerrainQueryCopernicusLog) <<
this;
33 if (coordinates.isEmpty()) {
38 for (
const QGeoCoordinate &coord: coordinates) {
39 const QString point = QString::number(coord.latitude(),
'f', 10) +
"," + QString::number(coord.longitude(),
'f', 10);
40 points += (point +
",");
42 points = points.mid(0, points.length() - 1);
45 query.addQueryItem(QStringLiteral(
"points"), points);
48 _sendQuery(QString(), query);
54 points += QString::number(fromCoord.latitude(),
'f', 10) +
","
55 + QString::number(fromCoord.longitude(),
'f', 10) +
",";
56 points += QString::number(toCoord.latitude(),
'f', 10) +
","
57 + QString::number(toCoord.longitude(),
'f', 10);
60 query.addQueryItem(QStringLiteral(
"points"), points);
63 _sendQuery(QStringLiteral(
"/path"), query);
69 points += QString::number(swCoord.latitude(),
'f', 10) +
","
70 + QString::number(swCoord.longitude(),
'f', 10) +
",";
71 points += QString::number(neCoord.latitude(),
'f', 10) +
","
72 + QString::number(neCoord.longitude(),
'f', 10);
75 query.addQueryItem(QStringLiteral(
"points"), points);
78 _carpetStatsOnly = statsOnly;
80 _sendQuery(QStringLiteral(
"/carpet"), query);
83void TerrainQueryCopernicus::_sendQuery(
const QString &path,
const QUrlQuery &urlQuery)
86 url.setQuery(urlQuery);
87 qCDebug(TerrainQueryCopernicusLog) << url;
89 QNetworkRequest request(url);
91 QSslConfiguration sslConf = request.sslConfiguration();
92 sslConf.setPeerVerifyMode(QSslSocket::VerifyNone);
93 request.setSslConfiguration(sslConf);
98 qCWarning(TerrainQueryCopernicusLog) <<
"QNetworkManager::Get did not return QNetworkReply";
105 (void) connect(networkReply, &QNetworkReply::finished,
this, &TerrainQueryCopernicus::_requestFinished);
110void TerrainQueryCopernicus::_requestFinished()
112 QNetworkReply*
const reply = qobject_cast<QNetworkReply*>(QObject::sender());
114 qCWarning(TerrainQueryCopernicusLog) <<
"null reply";
118 if (reply->error() != QNetworkReply::NoError) {
119 qCWarning(TerrainQueryCopernicusLog) <<
"error:url:data" << reply->error() << reply->url() << reply->readAll();
120 reply->deleteLater();
125 const QByteArray responseBytes = reply->readAll();
126 reply->deleteLater();
129 if (jsonData.isNull()) {
134 qCDebug(TerrainQueryCopernicusLog) <<
"success";
137 _parseCoordinateData(jsonData);
140 _parsePathData(jsonData);
143 _parseCarpetData(jsonData);
150void TerrainQueryCopernicus::_parseCoordinateData(
const QJsonValue &coordinateJson)
152 const QJsonArray dataArray = coordinateJson.toArray();
154 QList<double> heights;
155 for (
const QJsonValue &dataValue: dataArray) {
156 (void) heights.append(dataValue.toDouble());
162void TerrainQueryCopernicus::_parsePathData(
const QJsonValue &pathJson)
164 const QJsonArray pathArray = pathJson.toArray();
165 if (pathArray.isEmpty()) {
170 const QJsonObject jsonObject = pathArray[0].toObject();
171 const QJsonArray stepArray = jsonObject[
"step"].toArray();
172 const QJsonArray profileArray = jsonObject[
"profile"].toArray();
174 if (stepArray.count() < 2) {
179 const double latStep = stepArray[0].toDouble();
180 const double lonStep = stepArray[1].toDouble();
182 QList<double> heights;
183 for (
const QJsonValue &profileValue: profileArray) {
184 (void) heights.append(profileValue.toDouble());
193void TerrainQueryCopernicus::_parseCarpetData(
const QJsonValue &carpetJson)
195 const QJsonArray carpetArray = carpetJson.toArray();
196 if (carpetArray.isEmpty()) {
201 const QJsonObject jsonObject = carpetArray[0].toObject();
203 const QJsonObject statsObject = jsonObject[
"stats"].toObject();
204 const double minHeight = statsObject[
"min"].toDouble();
205 const double maxHeight = statsObject[
"max"].toDouble();
207 QList<QList<double>> carpet;
208 if (!_carpetStatsOnly) {
209 const QJsonArray carpetDataArray = jsonObject[
"carpet"].toArray();
211 for (qsizetype i = 0; i < carpetDataArray.count(); i++) {
212 const QJsonArray rowArray = carpetDataArray[i].toArray();
213 (void) carpet.append(QList<double>());
215 for (qsizetype j = 0; j < rowArray.count(); j++) {
216 const double height = rowArray[j].toDouble();
217 (void) carpet.last().append(height);
#define QGC_LOGGING_CATEGORY(name, categoryStr)
static constexpr const char * kProviderURL
QNetworkAccessManager * _networkManager
virtual void _requestError(QNetworkReply::NetworkError code)
virtual void _sslErrors(const QList< QSslError > &errors)
void requestPathHeights(const QGeoCoordinate &fromCoord, const QGeoCoordinate &toCoord) final
void requestCoordinateHeights(const QList< QGeoCoordinate > &coordinates) final
void requestCarpetHeights(const QGeoCoordinate &swCoord, const QGeoCoordinate &neCoord, bool statsOnly) final
~TerrainQueryCopernicus()
TerrainQuery::QueryMode _queryMode
void pathHeightsReceived(bool success, double distanceBetween, double finalDistanceBetween, const QList< double > &heights)
virtual void _requestFailed()
void carpetHeightsReceived(bool success, double minHeight, double maxHeight, const QList< QList< double > > &carpet)
void coordinateHeightsReceived(bool success, const QList< double > &heights)
static QJsonValue getJsonFromData(const QByteArray &input)
void ignoreSslErrorsIfNeeded(QNetworkReply *reply)