11 qCDebug(TerrainTileLog) <<
this;
13 constexpr int cTileHeaderBytes =
static_cast<int>(
sizeof(
TileInfo_t));
14 const int cTileBytesAvailable = byteArray.size();
16 if (cTileBytesAvailable < cTileHeaderBytes) {
17 qCWarning(TerrainTileLog) <<
"Terrain tile binary data too small for TileInfo_t header";
21 _tileInfo = *
reinterpret_cast<const TileInfo_t*
>(byteArray.constData());
28 constexpr int16_t kMaxGridSize = 10000;
30 qCWarning(TerrainTileLog) <<
"Grid dimensions exceed safety limits:" << _tileInfo.
gridSizeLat << _tileInfo.
gridSizeLon;
34 const int cTileDataBytes =
static_cast<int>(
sizeof(int16_t)) * _tileInfo.
gridSizeLat * _tileInfo.
gridSizeLon;
35 if (cTileBytesAvailable < cTileHeaderBytes + cTileDataBytes) {
36 qCWarning(TerrainTileLog) <<
"Terrain tile binary data too small for tile data";
40 if (((_tileInfo.
neLon - _tileInfo.
swLon) < 0.0) || ((_tileInfo.
neLat - _tileInfo.
swLat) < 0.0)) {
41 qCWarning(TerrainTileLog) <<
this <<
"Tile extent is infeasible";
48 qCDebug(TerrainTileLog) <<
this <<
"TileInfo: south west:" << _tileInfo.
swLat << _tileInfo.
swLon;
49 qCDebug(TerrainTileLog) <<
this <<
"TileInfo: north east:" << _tileInfo.
neLat << _tileInfo.
neLon;
50 qCDebug(TerrainTileLog) <<
this <<
"TileInfo: dimensions:" << _tileInfo.
gridSizeLat <<
"by" << _tileInfo.
gridSizeLon;
52 qCDebug(TerrainTileLog) <<
this <<
"TileInfo: cell size:" << _cellSizeLat << _cellSizeLon;
60 const int16_t*
const pTileData =
reinterpret_cast<const int16_t*
>(&
reinterpret_cast<const uint8_t*
>(byteArray.constData())[cTileHeaderBytes]);
63 _elevationData[i][j] = pTileData[valueIndex++];
78 qCWarning(TerrainTileLog) <<
this <<
"Request for elevation, but tile is invalid.";
82 const double latDeltaSw = coordinate.latitude() - _tileInfo.
swLat;
83 const double lonDeltaSw = coordinate.longitude() - _tileInfo.
swLon;
85 const int16_t latIndex = qFloor(latDeltaSw / _cellSizeLat);
86 const int16_t lonIndex = qFloor(lonDeltaSw / _cellSizeLon);
88 const bool latIndexInvalid = (latIndex < 0) || (latIndex > (_tileInfo.
gridSizeLat - 1));
89 const bool lonIndexInvalid = (lonIndex < 0) || (lonIndex > (_tileInfo.
gridSizeLon - 1));
91 if (latIndexInvalid || lonIndexInvalid) {
92 qCWarning(TerrainTileLog) <<
this <<
"Internal error: coordinate" << coordinate <<
"outside tile bounds";
96 if ((latIndex >= _elevationData.size()) || (lonIndex >= _elevationData[latIndex].size())) {
97 qCWarning(TerrainTileLog).noquote() <<
this <<
"Internal error: _elevationData size inconsistent _tileInfo << coordinate" << coordinate
98 <<
"\n\t_tileInfo.gridSizeLat:" << _tileInfo.
gridSizeLat <<
"_tileInfo.gridSizeLon:" << _tileInfo.
gridSizeLon
99 <<
"\n\t_data.size():" << _elevationData.size() <<
"_elevationData[latIndex].size():" << _elevationData[latIndex].size();
103 const int16_t
elevation = _elevationData[latIndex][lonIndex];
105 qCWarning(TerrainTileLog) <<
this <<
"Warning: elevation read is below min elevation in tile:" <<
elevation <<
"<" << _tileInfo.
minElevation;
107 qCWarning(TerrainTileLog) <<
this <<
"Warning: elevation read is above max elevation in tile:" <<
elevation <<
">" << _tileInfo.
maxElevation;
110 qCDebug(TerrainTileLog) <<
this <<
"latIndex, lonIndex:" << latIndex << lonIndex <<
"elevation:" <<
elevation;