Branch data Line data Source code
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 : : 28 : : #include "qgis_core.h" 29 : : #include "qgsrectangle.h" 30 : : #include "qgsvector3d.h" 31 : : #include "qgis_sip.h" 32 : : #include "qgspointcloudblock.h" 33 : : #include "qgsrange.h" 34 : : 35 : : #define SIP_NO_FILE 36 : : 37 : : class QgsPointCloudRequest; 38 : : class QgsPointCloudAttributeCollection; 39 : : 40 : : /** 41 : : * \ingroup core 42 : : * 43 : : * \brief Represents a indexed point cloud node in octree 44 : : * 45 : : * \note The API is considered EXPERIMENTAL and can be changed without a notice 46 : : * 47 : : * \since QGIS 3.18 48 : : */ 49 : : class CORE_EXPORT IndexedPointCloudNode 50 : : { 51 : : public: 52 : : //! Constructs invalid node 53 : : IndexedPointCloudNode(); 54 : : //! Constructs valid node 55 : : IndexedPointCloudNode( int _d, int _x, int _y, int _z ); 56 : : 57 : : //! Returns whether node is valid 58 : : bool isValid() const { return mD >= 0; } 59 : : 60 : : //! Compares nodes 61 : 0 : bool operator==( IndexedPointCloudNode other ) const 62 : : { 63 : 0 : return mD == other.d() && mX == other.x() && mY == other.y() && mZ == other.z(); 64 : : } 65 : : 66 : : //! Creates node from string 67 : : static IndexedPointCloudNode fromString( const QString &str ); 68 : : 69 : : //! Encode node to string 70 : : QString toString() const; 71 : : 72 : : //! Returns d 73 : : int d() const; 74 : : 75 : : //! Returns x 76 : : int x() const; 77 : : 78 : : //! Returns y 79 : : int y() const; 80 : : 81 : : //! Returns z 82 : : int z() const; 83 : : 84 : : private: 85 : : int mD = -1, mX = -1, mY = -1, mZ = -1; 86 : : }; 87 : : 88 : : Q_DECLARE_TYPEINFO( IndexedPointCloudNode, Q_PRIMITIVE_TYPE ); 89 : : 90 : : //! Hash function for indexed nodes 91 : : CORE_EXPORT uint qHash( IndexedPointCloudNode id ); 92 : : 93 : : /** 94 : : * \ingroup core 95 : : * 96 : : * \brief Represents packaged data bounds 97 : : * 98 : : * \note The API is considered EXPERIMENTAL and can be changed without a notice 99 : : * 100 : : * \since QGIS 3.18 101 : : */ 102 : : class CORE_EXPORT QgsPointCloudDataBounds 103 : : { 104 : : public: 105 : : //! Constructs invalid bounds 106 : : QgsPointCloudDataBounds(); 107 : : //! Constructs bounds 108 : : QgsPointCloudDataBounds( qint32 xmin, qint32 ymin, qint32 zmin, qint32 xmax, qint32 ymax, qint32 zmax ); 109 : : 110 : : //! Returns x min 111 : : qint32 xMin() const; 112 : : 113 : : //! Returns y min 114 : : qint32 yMin() const; 115 : : 116 : : //! Returns z min 117 : : qint32 zMin() const; 118 : : 119 : : //! Returns x max 120 : : qint32 xMax() const; 121 : : 122 : : //! Returns y max 123 : : qint32 yMax() const; 124 : : 125 : : //! Returns z max 126 : : qint32 zMax() const; 127 : : 128 : : //! Returns 2D rectangle in map coordinates 129 : : QgsRectangle mapExtent( const QgsVector3D &offset, const QgsVector3D &scale ) const; 130 : : 131 : : //! Returns the z range, applying the specified \a offset and \a scale. 132 : : QgsDoubleRange zRange( const QgsVector3D &offset, const QgsVector3D &scale ) const; 133 : : 134 : : private: 135 : : qint32 mXMin, mYMin, mZMin, mXMax, mYMax, mZMax; 136 : : }; 137 : : 138 : : 139 : : /** 140 : : * \ingroup core 141 : : * 142 : : * \brief Represents a indexed point clouds data in octree 143 : : * 144 : : * \note The API is considered EXPERIMENTAL and can be changed without a notice 145 : : * 146 : : * \since QGIS 3.18 147 : : */ 148 : : class CORE_EXPORT QgsPointCloudIndex: public QObject 149 : : { 150 : : Q_OBJECT 151 : : public: 152 : : //! Constructs index 153 : : explicit QgsPointCloudIndex(); 154 : : ~QgsPointCloudIndex(); 155 : : 156 : : //! Loads the index from the file 157 : : virtual void load( const QString &fileName ) = 0; 158 : : 159 : : //! Returns whether index is loaded and valid 160 : : virtual bool isValid() const = 0; 161 : : 162 : : //! Returns root node of the index 163 : 0 : IndexedPointCloudNode root() { return IndexedPointCloudNode( 0, 0, 0, 0 ); } 164 : : 165 : : //! Returns whether the octree contain given node 166 : : bool hasNode( const IndexedPointCloudNode &n ) const { return mHierarchy.contains( n ); } 167 : : 168 : : //! Returns all children of node 169 : : QList<IndexedPointCloudNode> nodeChildren( const IndexedPointCloudNode &n ) const; 170 : : 171 : : //! Returns all attributes that are stored in the file 172 : : QgsPointCloudAttributeCollection attributes() const; 173 : : 174 : : /** 175 : : * Returns node data block 176 : : * 177 : : * e.g. positions (needs to be scaled and offset applied to get coordinates) or 178 : : * classification, intensity or custom attributes 179 : : * 180 : : * It is caller responsibility to free the block. 181 : : * 182 : : * May return nullptr in case the node is not present or any other problem with loading 183 : : */ 184 : : virtual QgsPointCloudBlock *nodeData( const IndexedPointCloudNode &n, const QgsPointCloudRequest &request ) = 0; 185 : : 186 : : //! Returns extent of the data 187 : 0 : QgsRectangle extent() const { return mExtent; } 188 : : 189 : : //! Returns z min 190 : : double zMin() const { return mZMin; } 191 : : //! Returns z max 192 : : double zMax() const { return mZMax; } 193 : : 194 : : //! Returns bounds of particular \a node 195 : : QgsPointCloudDataBounds nodeBounds( const IndexedPointCloudNode &node ) const; 196 : : 197 : : /** 198 : : * Returns the extent of a \a node in map coordinates. 199 : : * 200 : : * \see nodeZRange() 201 : : */ 202 : : QgsRectangle nodeMapExtent( const IndexedPointCloudNode &node ) const; 203 : : 204 : : /** 205 : : * Returns the z range of a \a node. 206 : : * 207 : : * \see nodeMapExtent() 208 : : */ 209 : : QgsDoubleRange nodeZRange( const IndexedPointCloudNode &node ) const; 210 : : 211 : : //! Returns node's error in map units (used to determine in whether the node has enough detail for the current view) 212 : : float nodeError( const IndexedPointCloudNode &n ) const; 213 : : 214 : : //! Returns scale 215 : : QgsVector3D scale() const; 216 : : 217 : : //! Returns offset 218 : : QgsVector3D offset() const; 219 : : 220 : : /** 221 : : * Returns the number of points in one direction in a single node. 222 : : */ 223 : : int span() const; 224 : : 225 : : /** 226 : : * Returns the number of poiny of indexed point cloud node \a n 227 : : */ 228 : : int nodePointCount( const IndexedPointCloudNode &n ); 229 : : 230 : : protected: //TODO private 231 : : //! Sets native attributes of the data 232 : : void setAttributes( const QgsPointCloudAttributeCollection &attributes ); 233 : : 234 : : QgsRectangle mExtent; //!< 2D extent of data 235 : : double mZMin = 0, mZMax = 0; //!< Vertical extent of data 236 : : 237 : : QHash<IndexedPointCloudNode, int> mHierarchy; //!< Data hierarchy 238 : : QgsVector3D mScale; //!< Scale of our int32 coordinates compared to CRS coords 239 : : QgsVector3D mOffset; //!< Offset of our int32 coordinates compared to CRS coords 240 : : QgsPointCloudDataBounds mRootBounds; //!< Bounds of the root node's cube (in int32 coordinates) 241 : : QgsPointCloudAttributeCollection mAttributes; //! All native attributes stored in the file 242 : : int mSpan; //!< Number of points in one direction in a single node 243 : : }; 244 : : 245 : : #endif // QGSPOINTCLOUDINDEX_H