30#include <QJsonDocument>
37using namespace Qt::StringLiterals;
59 QStringList lst = str.split(
'-' );
60 if ( lst.count() != 4 )
62 return QgsPointCloudNodeId( lst[0].toInt(), lst[1].toInt(), lst[2].toInt(), lst[3].toInt() );
67 return u
"%1-%2-%3-%4"_s.arg( mD ).arg( mX ).arg( mY ).arg( mZ );
100 , mSubsetString( subset )
105 return mNode == other.mNode && mUri == other.mUri && mRequest == other.mRequest && mSubsetString == other.mSubsetString;
121 const double dLevel = d / pow( 2,
id.d() );
123 const double xMin = rootBounds.
xMinimum() + dLevel *
id.x();
124 const double xMax = rootBounds.
xMinimum() + dLevel * (
id.x() + 1 );
125 const double yMin = rootBounds.
yMinimum() + dLevel *
id.y();
126 const double yMax = rootBounds.
yMinimum() + dLevel * (
id.y() + 1 );
127 const double zMin = rootBounds.
zMinimum() + dLevel *
id.z();
128 const double zMax = rootBounds.
zMinimum() + dLevel * (
id.z() + 1 );
130 return QgsBox3D( xMin, yMin, zMin, xMax, yMax, zMax );
167 QList<QgsPointCloudNodeId> children;
169 const int d =
id.d() + 1;
170 const int x =
id.x() * 2;
171 const int y =
id.y() * 2;
172 const int z =
id.z() * 2;
174 for (
int i = 0; i < 8; ++i )
176 int dx = i & 1, dy = !!( i & 2 ), dz = !!( i & 4 );
179 children.append( n2 );
248 QMap<QString, QgsPointCloudAttributeStatistics> statsMap;
250 statsMap[
"X"].maximum =
mExtent.xMaximum();
251 statsMap[
"Y"].minimum =
mExtent.yMinimum();
252 statsMap[
"Y"].maximum =
mExtent.yMinimum();
253 statsMap[
"Z"].minimum =
mZMin;
254 statsMap[
"Z"].maximum =
mZMax;
287 return cached ? cached->
clone() :
nullptr;
323 mIndex.reset( index );
326QgsPointCloudIndex::operator bool()
const
328 return mIndex !=
nullptr;
334 mIndex->load( url, authcfg );
339 return mIndex && mIndex->isValid();
344 return mIndex ? mIndex->error() : u
"Index is NULL"_s;
350 return mIndex->accessType();
356 return mIndex->crs();
362 return mIndex->pointCount();
368 return mIndex->originalMetadata();
374 return mIndex->metadataStatistics();
380 return mIndex->writeStatistics( stats );
386 return mIndex->root();
392 return mIndex->hasNode(
id );
398 return mIndex->getNode(
id );
404 return mIndex->attributes();
410 return mIndex->nodeData( n, request );
416 return mIndex->asyncNodeData( n, request );
422 return mIndex->updateNodeData( data );
428 return mIndex->extent();
434 return mIndex->zMin();
439 return mIndex->zMax();
445 return mIndex->rootNodeBounds();
451 return mIndex->scale();
457 return mIndex->offset();
463 return mIndex->span();
469 return mIndex->uri();
475 return mIndex->setSubsetString( subset );
481 return mIndex->subsetString();
487 return mIndex->getNodeDataFromCache( node, request );
493 mIndex->storeNodeDataToCache( data, node, request );
499 return mIndex->extraMetadata();
506 return index->commitChanges( errorMessage );
514 return index->isModified();
522 return index->updatedNodes();
524 return QList<QgsPointCloudNodeId>();
PointCloudAccessType
The access type of the data, local is for local files and remote for remote files (over HTTP).
Represents an indexed point clouds data in octree.
void setAttributes(const QgsPointCloudAttributeCollection &attributes)
Sets native attributes of the data.
QString uri() const
Returns the URI used to load the index.
virtual ~QgsAbstractPointCloudIndex()
virtual QgsPointCloudNode getNode(QgsPointCloudNodeId id) const
Returns object for a given node.
virtual qint64 pointCount() const =0
Returns the number of points in the point cloud.
QgsPointCloudAttributeCollection mAttributes
QHash< QgsPointCloudNodeId, int > mHierarchy
Data hierarchy.
virtual bool hasNode(QgsPointCloudNodeId n) const
Returns whether the octree contain given node.
void copyCommonProperties(QgsAbstractPointCloudIndex *destination) const
Copies common properties to the destination index.
virtual bool writeStatistics(QgsPointCloudStatistics &stats)
Writes the statistics object stats into the backing file, if possible.
QgsBox3D mRootBounds
Bounds of the root node's cube (in int32 coordinates).
virtual QVariantMap extraMetadata() const
Returns extra metadata that's not accessible through the other methods in an implementation-specific ...
static QMutex sBlockCacheMutex
QgsVector3D mOffset
Offset of our int32 coordinates compared to CRS coords.
QgsPointCloudBlock * getNodeDataFromCache(QgsPointCloudNodeId node, const QgsPointCloudRequest &request)
Fetches the requested node data from the cache for the specified node and request.
void storeNodeDataToCache(QgsPointCloudBlock *data, QgsPointCloudNodeId node, const QgsPointCloudRequest &request) const
Stores existing data to the cache for the specified node and request.
QgsPointCloudExpression mFilterExpression
The filter expression to be evaluated when fetching node data.
static void storeNodeDataToCacheStatic(QgsPointCloudBlock *data, QgsPointCloudNodeId node, const QgsPointCloudRequest &request, const QgsPointCloudExpression &expression, const QString &uri)
Stores existing data to the cache for the specified node, request, expression and uri.
QgsPointCloudAttributeCollection attributes() const
Returns all attributes that are stored in the file.
virtual bool updateNodeData(const QHash< QgsPointCloudNodeId, QByteArray > &data)
Tries to update the data for the specified nodes.
int span() const
Returns the number of points in one direction in a single node.
static QCache< QgsPointCloudCacheKey, QgsPointCloudBlock > sBlockCache
int mSpan
All native attributes stored in the file.
double mZMax
Vertical extent of data.
QgsRectangle mExtent
2D extent of data
QgsVector3D scale() const
Returns scale of data relative to CRS.
virtual QgsPointCloudStatistics metadataStatistics() const
Returns the object containing the statistics metadata extracted from the dataset.
QgsVector3D mScale
Scale of our int32 coordinates compared to CRS coords.
QgsAbstractPointCloudIndex()
Constructs index.
QgsVector3D offset() const
Returns offset of data from CRS.
virtual bool setSubsetString(const QString &subset)
Sets the string used to define a subset of the point cloud.
virtual QString subsetString() const
Returns the string used to define a subset of the point cloud.
A 3-dimensional box composed of x, y, z coordinates.
double xMinimum() const
Returns the minimum x value.
double xMaximum() const
Returns the maximum x value.
double width() const
Returns the width of the box.
double zMinimum() const
Returns the minimum z value.
double yMinimum() const
Returns the minimum y value.
Represents a coordinate reference system (CRS).
A collection of point cloud attributes.
Base class for handling loading QgsPointCloudBlock asynchronously.
Base class for storing raw data from point cloud nodes.
int pointCount() const
Returns number of points that are stored in the block.
int pointRecordSize() const
Returns the total size of each individual point record.
QgsPointCloudBlock * clone() const
Clones the QgsPointCloudBlock returning a new copy.
Container class for QgsPointCloudBlock cache keys.
QgsPointCloudNodeId node() const
Returns the key's QgsPointCloudNodeId.
bool operator==(const QgsPointCloudCacheKey &other) const
QString uri() const
Returns the key's uri.
QgsPointCloudCacheKey(QgsPointCloudNodeId n, const QgsPointCloudRequest &request, const QString &subset, const QString &uri)
Ctor.
A QgsPointCloudIndex that is used as an editing buffer when editing point cloud data.
int span() const
Returns the number of points in one direction in a single node.
double zMax() const
Returns z max.
bool isModified() const
Returns true if there are uncommitted changes, false otherwise.
bool writeStatistics(QgsPointCloudStatistics &stats)
Writes the statistics object stats into the backing file, if possible.
QgsBox3D rootNodeBounds() const
Returns bounding box of root node in CRS coords.
QString error() const
Returns the error that occurred during the loading of the index.
QString subsetString() const
Returns the string used to define a subset of the point cloud.
double zMin() const
Returns z min.
std::unique_ptr< QgsPointCloudBlock > nodeData(QgsPointCloudNodeId n, const QgsPointCloudRequest &request)
Returns node data block.
QgsVector3D offset() const
Returns offset of data from CRS.
QgsVector3D scale() const
Returns scale of data relative to CRS.
void load(const QString &url, const QString &authcfg=QString())
Loads the index from a url.
QgsPointCloudNode getNode(QgsPointCloudNodeId id) const
Returns object for a given node.
bool setSubsetString(const QString &subset)
Sets the string used to define a subset of the point cloud.
bool hasNode(QgsPointCloudNodeId id) const
Returns whether the octree contain given node.
bool isValid() const
Returns whether index is loaded and valid.
QgsRectangle extent() const
Returns extent of the data.
QgsCoordinateReferenceSystem crs() const
Returns the coordinate reference system of the point cloud index.
qint64 pointCount() const
Returns the number of points in the point cloud.
QgsPointCloudStatistics metadataStatistics() const
Returns the object containing the statistics metadata extracted from the dataset.
bool commitChanges(QString *errorMessage=nullptr)
Tries to store pending changes to the data provider.
QVariantMap extraMetadata() const
Returns extra metadata that's not accessible through the other methods in an implementation-specific ...
bool updateNodeData(const QHash< QgsPointCloudNodeId, QByteArray > &data)
Tries to update the data for the specified nodes.
QgsPointCloudNodeId root() const
Returns root node of the index.
void storeNodeDataToCache(QgsPointCloudBlock *data, QgsPointCloudNodeId node, const QgsPointCloudRequest &request)
Stores existing data to the cache for the specified node and request.
QgsPointCloudIndex(QgsAbstractPointCloudIndex *index=nullptr)
Construct wrapper, takes ownership of index.
QgsPointCloudBlockRequest * asyncNodeData(QgsPointCloudNodeId n, const QgsPointCloudRequest &request)
Returns a handle responsible for loading a node data block.
QList< QgsPointCloudNodeId > updatedNodes() const
Returns a list of node IDs that have been modified.
QString uri() const
Returns the uri used to load the index.
QVariantMap originalMetadata() const
Returns the original metadata map.
QgsPointCloudAttributeCollection attributes() const
Returns all attributes that are stored in the file.
Qgis::PointCloudAccessType accessType() const
Returns the access type of the data If the access type is Remote, data will be fetched from an HTTP s...
QgsPointCloudBlock * getNodeDataFromCache(QgsPointCloudNodeId node, const QgsPointCloudRequest &request)
Fetches the requested node data from the cache for the specified node and request.
Represents an indexed point cloud node's position in octree.
QgsPointCloudNodeId()
Constructs invalid node.
static QgsPointCloudNodeId fromString(const QString &str)
Creates node from string.
QString toString() const
Encode node to string.
QgsPointCloudNodeId parentNode() const
Returns the parent of the node.
Keeps metadata for an indexed point cloud node.
float error() const
Returns node's error in map units (used to determine in whether the node has enough detail for the cu...
QgsBox3D bounds() const
Returns node's bounding cube in CRS coords.
Point cloud data request.
Used to store statistics of a point cloud dataset.
double minimum(const QString &attribute) const
Returns the minimum value for the attribute attribute If no matching statistic is available then NaN ...
A rectangle specified with double values.
A 3D vector (similar to QVector3D) with the difference that it uses double precision instead of singl...
#define QgsDebugMsgLevel(str, level)