25 QJsonParseError parseError;
27 if (parseError.error != QJsonParseError::NoError) {
28 qCWarning(TerrainTileCopernicusLog)
29 <<
"Terrain tile json doc parse error" << parseError.errorString();
33 if (!document.isObject()) {
34 qCWarning(TerrainTileCopernicusLog) <<
"Terrain tile json doc is no object";
38 const QJsonObject rootObject = document.object();
40 static const QList<JsonHelper::KeyValidateInfo> rootVersionKeyInfoList = {
41 {_jsonStatusKey, QJsonValue::String,
true},
42 {_jsonDataKey, QJsonValue::Object,
true},
46 qCWarning(TerrainTileCopernicusLog) <<
"Error in reading json: " <<
errorString;
50 if (rootObject[_jsonStatusKey].toString() !=
"success") {
51 qCWarning(TerrainTileCopernicusLog) <<
"Invalid terrain tile.";
55 const QJsonValue& jsonData = rootObject[_jsonDataKey];
56 const QJsonObject& dataObject = jsonData.toObject();
58 QList<JsonHelper::KeyValidateInfo> dataVersionKeyInfoList = {
59 {_jsonBoundsKey, QJsonValue::Object,
true},
60 {_jsonStatsKey, QJsonValue::Object,
true},
61 {_jsonCarpetKey, QJsonValue::Array,
true},
65 qCWarning(TerrainTileCopernicusLog) <<
"Error in reading json: " <<
errorString;
75 if (jsonData.isNull()) {
79 const QJsonObject& dataObject = jsonData.toObject();
81 const QJsonObject& boundsObject = dataObject[_jsonBoundsKey].toObject();
82 static const QList<JsonHelper::KeyValidateInfo> boundsVersionKeyInfoList = {
83 {_jsonSouthWestKey, QJsonValue::Array,
true},
84 {_jsonNorthEastKey, QJsonValue::Array,
true},
88 qCWarning(TerrainTileCopernicusLog) <<
"Error in reading json: " <<
errorString;
92 const QJsonArray& swArray = boundsObject[_jsonSouthWestKey].toArray();
93 const QJsonArray& neArray = boundsObject[_jsonNorthEastKey].toArray();
94 if ((swArray.count() < 2) || (neArray.count() < 2)) {
95 qCWarning(TerrainTileCopernicusLog) <<
"Incomplete bounding location";
99 const QJsonObject& statsObject = dataObject[_jsonStatsKey].toObject();
100 static const QList<JsonHelper::KeyValidateInfo> statsVersionKeyInfoList = {
101 {_jsonMinElevationKey, QJsonValue::Double,
true},
102 {_jsonMaxElevationKey, QJsonValue::Double,
true},
103 {_jsonAvgElevationKey, QJsonValue::Double,
true},
106 qCWarning(TerrainTileCopernicusLog) <<
"Error in reading json: " <<
errorString;
110 const QJsonArray& carpetArray = dataObject[_jsonCarpetKey].toArray();
112 if (carpetArray.isEmpty()) {
113 qCWarning(TerrainTileCopernicusLog) <<
"Empty carpet array in terrain data";
117 const QJsonArray& firstRow = carpetArray[0].toArray();
118 if (firstRow.isEmpty()) {
119 qCWarning(TerrainTileCopernicusLog) <<
"Empty first row in carpet array";
124 tileInfo.
swLat = swArray[0].toDouble();
125 tileInfo.
swLon = swArray[1].toDouble();
126 tileInfo.
neLat = neArray[0].toDouble();
127 tileInfo.
neLon = neArray[1].toDouble();
128 tileInfo.
minElevation =
static_cast<int16_t
>(statsObject[_jsonMinElevationKey].toInt());
129 tileInfo.
maxElevation =
static_cast<int16_t
>(statsObject[_jsonMaxElevationKey].toInt());
130 tileInfo.
avgElevation = statsObject[_jsonAvgElevationKey].toDouble();
131 tileInfo.
gridSizeLat =
static_cast<int16_t
>(carpetArray.count());
132 tileInfo.
gridSizeLon =
static_cast<int16_t
>(firstRow.count());
134 qCDebug(TerrainTileCopernicusLog) <<
"Serialize: TileInfo: south west:" << tileInfo.
swLat << tileInfo.
swLon;
135 qCDebug(TerrainTileCopernicusLog) <<
"Serialize: TileInfo: north east:" << tileInfo.
neLat << tileInfo.
neLon;
137 constexpr int cTileNumHeaderBytes =
static_cast<int>(
sizeof(
TileInfo_t));
138 const int cTileNumDataBytes =
static_cast<int>(
sizeof(int16_t)) * tileInfo.
gridSizeLat * tileInfo.
gridSizeLon;
140 QByteArray result(cTileNumHeaderBytes + cTileNumDataBytes, Qt::Uninitialized);
142 int16_t*
const pTileData =
143 reinterpret_cast<int16_t*
>(&
reinterpret_cast<uint8_t*
>(result.data())[cTileNumHeaderBytes]);
145 *pTileInfo = tileInfo;
148 for (qsizetype i = 0; i < static_cast<qsizetype>(tileInfo.
gridSizeLat); i++) {
149 const QJsonArray& row = carpetArray[i].toArray();
151 qCDebug(TerrainTileCopernicusLog)
152 <<
"Expected row array of" << tileInfo.
gridSizeLon <<
", instead got" << row.count();
156 for (qsizetype j = 0; j < static_cast<qsizetype>(tileInfo.
gridSizeLon); j++) {
157 pTileData[valueIndex++] =
static_cast<int16_t
>(row[j].toDouble());