QGIS API Documentation  3.21.0-Master (56b4176581)
qgspointcloudindex.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgspointcloudindex.h
3  --------------------
4  begin : October 2020
5  copyright : (C) 2020 by Peter Petrik
6  email : zilolv at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #ifndef QGSPOINTCLOUDINDEX_H
19 #define QGSPOINTCLOUDINDEX_H
20 
21 #include <QObject>
22 #include <QString>
23 #include <QHash>
24 #include <QStringList>
25 #include <QVector>
26 #include <QList>
27 #include <QMutex>
28 
29 #include "qgis_core.h"
30 #include "qgsrectangle.h"
31 #include "qgsvector3d.h"
32 #include "qgis_sip.h"
33 #include "qgspointcloudblock.h"
34 #include "qgsrange.h"
35 #include "qgspointcloudattribute.h"
36 #include "qgsstatisticalsummary.h"
37 
38 #define SIP_NO_FILE
39 
44 
54 class CORE_EXPORT IndexedPointCloudNode
55 {
56  public:
60  IndexedPointCloudNode( int _d, int _x, int _y, int _z );
61 
63  bool isValid() const { return mD >= 0; }
64 
65  // TODO c++20 - replace with = default
66 
68  bool operator==( IndexedPointCloudNode other ) const
69  {
70  return mD == other.d() && mX == other.x() && mY == other.y() && mZ == other.z();
71  }
72 
77  IndexedPointCloudNode parentNode() const;
78 
80  static IndexedPointCloudNode fromString( const QString &str );
81 
83  QString toString() const;
84 
86  int d() const;
87 
89  int x() const;
90 
92  int y() const;
93 
95  int z() const;
96 
97  private:
98  int mD = -1, mX = -1, mY = -1, mZ = -1;
99 };
100 
102 
104 CORE_EXPORT uint qHash( IndexedPointCloudNode id );
105 
115 class CORE_EXPORT QgsPointCloudDataBounds
116 {
117  public:
121  QgsPointCloudDataBounds( qint32 xmin, qint32 ymin, qint32 zmin, qint32 xmax, qint32 ymax, qint32 zmax );
122 
124  qint32 xMin() const;
125 
127  qint32 yMin() const;
128 
130  qint32 zMin() const;
131 
133  qint32 xMax() const;
134 
136  qint32 yMax() const;
137 
139  qint32 zMax() const;
140 
142  QgsRectangle mapExtent( const QgsVector3D &offset, const QgsVector3D &scale ) const;
143 
145  QgsDoubleRange zRange( const QgsVector3D &offset, const QgsVector3D &scale ) const;
146 
147  private:
148  qint32 mXMin, mYMin, mZMin, mXMax, mYMax, mZMax;
149 };
150 
160 class CORE_EXPORT QgsPointCloudIndex: public QObject
161 {
162  Q_OBJECT
163  public:
166  {
168  Remote
169  };
170 
172  explicit QgsPointCloudIndex();
174 
176  virtual void load( const QString &fileName ) = 0;
177 
179  virtual bool isValid() const = 0;
180 
187  virtual AccessType accessType() const = 0;
188 
190  virtual QgsCoordinateReferenceSystem crs() const = 0;
192  virtual qint64 pointCount() const = 0;
194  virtual QVariant metadataStatistic( const QString &attribute, QgsStatisticalSummary::Statistic statistic ) const = 0;
196  virtual QVariantList metadataClasses( const QString &attribute ) const = 0;
198  virtual QVariant metadataClassStatistic( const QString &attribute, const QVariant &value, QgsStatisticalSummary::Statistic statistic ) const = 0;
200  virtual QVariantMap originalMetadata() const = 0;
201 
204 
206  virtual bool hasNode( const IndexedPointCloudNode &n ) const;
207 
209  virtual QList<IndexedPointCloudNode> nodeChildren( const IndexedPointCloudNode &n ) const;
210 
212  QgsPointCloudAttributeCollection attributes() const;
213 
224  virtual QgsPointCloudBlock *nodeData( const IndexedPointCloudNode &n, const QgsPointCloudRequest &request ) = 0;
225 
237 
239  QgsRectangle extent() const { return mExtent; }
240 
242  double zMin() const { return mZMin; }
244  double zMax() const { return mZMax; }
245 
247  QgsPointCloudDataBounds nodeBounds( const IndexedPointCloudNode &node ) const;
248 
254  QgsRectangle nodeMapExtent( const IndexedPointCloudNode &node ) const;
255 
261  QgsDoubleRange nodeZRange( const IndexedPointCloudNode &node ) const;
262 
264  float nodeError( const IndexedPointCloudNode &n ) const;
265 
267  QgsVector3D scale() const;
268 
270  QgsVector3D offset() const;
271 
275  int span() const;
276 
280  int nodePointCount( const IndexedPointCloudNode &n );
281 
282  protected: //TODO private
284  void setAttributes( const QgsPointCloudAttributeCollection &attributes );
285 
287  double mZMin = 0, mZMax = 0;
288 
289  mutable QMutex mHierarchyMutex;
290  mutable QHash<IndexedPointCloudNode, int> mHierarchy;
295  int mSpan;
296 };
297 
298 #endif // QGSPOINTCLOUDINDEX_H
Represents a indexed point cloud node in octree.
int y() const
Returns y.
bool isValid() const
Returns whether node is valid.
int x() const
Returns x.
int d() const
Returns d.
bool operator==(IndexedPointCloudNode other) const
Compares nodes.
int z() const
Returns z.
This class represents a coordinate reference system (CRS).
QgsRange which stores a range of double values.
Definition: qgsrange.h:203
Collection of point cloud attributes.
Base class for handling loading QgsPointCloudBlock asynchronously.
Base class for storing raw data from point cloud nodes.
Represents packaged data bounds.
qint32 xMax() const
Returns x max.
QgsPointCloudDataBounds(qint32 xmin, qint32 ymin, qint32 zmin, qint32 xmax, qint32 ymax, qint32 zmax)
Constructs bounds.
qint32 xMin() const
Returns x min.
qint32 yMax() const
Returns y max.
QgsDoubleRange zRange(const QgsVector3D &offset, const QgsVector3D &scale) const
Returns the z range, applying the specified offset and scale.
QgsPointCloudDataBounds()
Constructs invalid bounds.
qint32 zMax() const
Returns z max.
QgsRectangle mapExtent(const QgsVector3D &offset, const QgsVector3D &scale) const
Returns 2D rectangle in map coordinates.
qint32 yMin() const
Returns y min.
qint32 zMin() const
Returns z min.
Represents a indexed point clouds data in octree.
double zMax() const
Returns z max.
QgsPointCloudIndex()
Constructs index.
double zMin() const
Returns z min.
AccessType
The access type of the data, local is for local files and remote for remote files (over HTTP)
virtual qint64 pointCount() const =0
Returns the number of points in the point cloud.
virtual QgsPointCloudBlock * nodeData(const IndexedPointCloudNode &n, const QgsPointCloudRequest &request)=0
Returns node data block.
virtual AccessType accessType() const =0
Returns the access type of the data If the access type is Remote, data will be fetched from an HTTP s...
QHash< IndexedPointCloudNode, int > mHierarchy
Data hierarchy.
virtual bool isValid() const =0
Returns whether index is loaded and valid.
QgsRectangle extent() const
Returns extent of the data.
virtual QgsCoordinateReferenceSystem crs() const =0
Returns the coordinate reference system of the point cloud index.
QgsPointCloudDataBounds mRootBounds
Bounds of the root node's cube (in int32 coordinates)
QgsRectangle mExtent
2D extent of data
QgsPointCloudAttributeCollection mAttributes
QgsVector3D mOffset
Offset of our int32 coordinates compared to CRS coords.
virtual void load(const QString &fileName)=0
Loads the index from the file.
IndexedPointCloudNode root()
Returns root node of the index.
virtual QVariant metadataClassStatistic(const QString &attribute, const QVariant &value, QgsStatisticalSummary::Statistic statistic) const =0
Returns the statistic statistic of the class value of the attribute attribute.
virtual QVariant metadataStatistic(const QString &attribute, QgsStatisticalSummary::Statistic statistic) const =0
Returns the statistic statistic of attribute.
virtual QgsPointCloudBlockRequest * asyncNodeData(const IndexedPointCloudNode &n, const QgsPointCloudRequest &request)=0
Returns a handle responsible for loading a node data block.
int mSpan
All native attributes stored in the file.
QgsVector3D mScale
Scale of our int32 coordinates compared to CRS coords.
virtual QVariantMap originalMetadata() const =0
Returns the original metadata map.
virtual QVariantList metadataClasses(const QString &attribute) const =0
Returns the classes of attribute.
Point cloud data request.
A rectangle specified with double values.
Definition: qgsrectangle.h:42
Statistic
Enumeration of flags that specify statistics to be calculated.
#define str(x)
Definition: qgis.cpp:37
Q_DECLARE_TYPEINFO(IndexedPointCloudNode, Q_PRIMITIVE_TYPE)
CORE_EXPORT uint qHash(IndexedPointCloudNode id)
Hash function for indexed nodes.