20#include "nlohmann/json.hpp"
27#include <QtCore/QBuffer>
37 const double west = region[0].get<
double>() * 180 / M_PI;
38 const double south = region[1].get<
double>() * 180 / M_PI;
39 const double east = region[2].get<
double>() * 180 / M_PI;
40 const double north = region[3].get<
double>() * 180 / M_PI;
41 double minHeight = region[4].get<
double>();
42 double maxHeight = region[5].get<
double>();
44 return QgsBox3D( west, south, minHeight, east, north, maxHeight );
46 catch ( nlohmann::json::exception & )
54 if ( region.size() != 6 )
62 if ( box.size() != 12 )
68 for (
int i = 0; i < 3; ++i )
70 res.mCenter[i] = box[i].get<
double>();
72 for (
int i = 0; i < 9; ++i )
74 res.mHalfAxes[i] = box[i + 3].get<
double>();
78 catch ( nlohmann::json::exception & )
86 if ( box.size() != 12 )
94 if ( sphere.size() != 4 )
99 const double centerX = sphere[0].get<
double>();
100 const double centerY = sphere[1].get<
double>();
101 const double centerZ = sphere[2].get<
double>();
102 const double radius = sphere[3].get<
double>();
103 return QgsSphere( centerX, centerY, centerZ, radius );
105 catch ( nlohmann::json::exception & )
113 if ( sphere.size() != 4 )
126 const double uniformScale = std::max(
141 return QgsSphere( center.
x(), center.
y(), center.
z(), sphere.
radius() * uniformScale );
150 unsigned char magic[4];
153 quint32 featureTableJsonByteLength;
154 quint32 featureTableBinaryByteLength;
155 quint32 batchTableJsonByteLength;
156 quint32 batchTableBinaryByteLength;
160 if ( tileContent.size() <
static_cast<int>(
sizeof( b3dmHeader ) ) )
164 memcpy( &hdr, tileContent.constData(),
sizeof( b3dmHeader ) );
166 const QString featureTableJson( tileContent.mid(
sizeof( b3dmHeader ), hdr.featureTableJsonByteLength ) );
167 if ( !featureTableJson.isEmpty() )
171 const json featureTable = json::parse( featureTableJson.toStdString() );
172 if ( featureTable.contains(
"RTC_CENTER" ) )
174 const auto &rtcCenterJson = featureTable[
"RTC_CENTER" ];
175 if ( rtcCenterJson.is_array() && rtcCenterJson.size() == 3 )
183 QgsDebugError( QStringLiteral(
"Invalid RTC_CENTER value" ) );
187 catch ( json::parse_error &ex )
189 QgsDebugError( QStringLiteral(
"Error parsing feature table JSON: %1" ).arg( ex.what() ) );
193 res.
gltf = tileContent.mid(
sizeof( b3dmHeader ) +
194 hdr.featureTableJsonByteLength + hdr.featureTableBinaryByteLength +
195 hdr.batchTableJsonByteLength + hdr.batchTableBinaryByteLength );
202 if ( tileContent.startsWith( QByteArray(
"b3dm" ) ) )
209 else if ( tileContent.startsWith( QByteArray(
"glTF" ) ) )
211 res.
gltf = tileContent;
A 3-dimensional box composed of x, y, z coordinates.
static QgsSphere parseSphere(const json &sphere)
Parses a sphere object from a Cesium JSON document.
static B3DMContents extractGltfFromB3dm(const QByteArray &tileContent)
Extracts GLTF binary data and other contents from the legacy b3dm (Batched 3D Model) tile format.
static QgsOrientedBox3D parseBox(const json &box)
Parses a box object from a Cesium JSON document to an oriented bounding box.
static QgsBox3D parseRegion(const json ®ion)
Parses a region object from a Cesium JSON object to a 3D box.
static QgsSphere transformSphere(const QgsSphere &sphere, const QgsMatrix4x4 &transform)
Applies a transform to a sphere.
static TileContents extractGltfFromTileContent(const QByteArray &tileContent)
Parses tile content.
static json jsonFromVariant(const QVariant &v)
Converts a QVariant v to a json object.
A simple 4x4 matrix implementation useful for transformation in 3D space.
bool isIdentity() const
Returns whether this matrix is an identity matrix.
QgsVector3D map(const QgsVector3D &vector) const
Matrix-vector multiplication (vector is converted to homogeneous coordinates [X,Y,...
const double * constData() const
Returns pointer to the matrix data (stored in column-major order)
Represents a oriented (rotated) box in 3 dimensions.
A spherical geometry object.
QgsVector3D centerVector() const
Returns the vector to the center of the sphere.
double radius() const
Returns the radius of the sphere.
A 3D vector (similar to QVector3D) with the difference that it uses double precision instead of singl...
double y() const
Returns Y coordinate.
double z() const
Returns Z coordinate.
void setZ(double z)
Sets Z coordinate.
double x() const
Returns X coordinate.
void setX(double x)
Sets X coordinate.
void setY(double y)
Sets Y coordinate.
#define QgsDebugError(str)
Encapsulates the contents of a B3DM file.
QByteArray gltf
GLTF binary content.
QgsVector3D rtcCenter
Optional RTC center.
Encapsulates the contents of a 3D tile.
QgsVector3D rtcCenter
Center position of relative-to-center coordinates (when used)
QByteArray gltf
GLTF binary content.