28 #include <QtConcurrent/QtConcurrentMap>
33 QgsDataProvider::ReadFlags flags )
67 static QMap< int, QString > sCodes
69 {0, QStringLiteral(
"Created, Never Classified" )},
70 {1, QStringLiteral(
"Unclassified" )},
71 {2, QStringLiteral(
"Ground" )},
72 {3, QStringLiteral(
"Low Vegetation" )},
73 {4, QStringLiteral(
"Medium Vegetation" )},
74 {5, QStringLiteral(
"High Vegetation" )},
75 {6, QStringLiteral(
"Building" )},
76 {7, QStringLiteral(
"Low Point (Low Noise)" )},
77 {8, QStringLiteral(
"Reserved" )},
78 {9, QStringLiteral(
"Water" )},
79 {10, QStringLiteral(
"Rail" )},
80 {11, QStringLiteral(
"Road Surface" )},
81 {12, QStringLiteral(
"Reserved" )},
82 {13, QStringLiteral(
"Wire - Guard (Shield)" )},
83 {14, QStringLiteral(
"Wire - Conductor (Phase)" )},
84 {15, QStringLiteral(
"Transmission Tower" )},
85 {16, QStringLiteral(
"Wire-Structure Connector (Insulator)" )},
86 {17, QStringLiteral(
"Bridge Deck" )},
87 {18, QStringLiteral(
"High Noise" )},
90 static std::once_flag initialized;
91 std::call_once( initialized, [ = ]( )
93 for (
int i = 19; i <= 63; ++i )
94 sCodes.insert( i, QStringLiteral(
"Reserved" ) );
95 for (
int i = 64; i <= 255; ++i )
96 sCodes.insert( i, QStringLiteral(
"User Definable" ) );
104 static QMap< int, QString > sCodes
106 {0, QObject::tr(
"Created, Never Classified" )},
107 {1, QObject::tr(
"Unclassified" )},
108 {2, QObject::tr(
"Ground" )},
109 {3, QObject::tr(
"Low Vegetation" )},
110 {4, QObject::tr(
"Medium Vegetation" )},
111 {5, QObject::tr(
"High Vegetation" )},
112 {6, QObject::tr(
"Building" )},
113 {7, QObject::tr(
"Low Point (Noise)" )},
114 {8, QObject::tr(
"Reserved" )},
115 {9, QObject::tr(
"Water" )},
116 {10, QObject::tr(
"Rail" )},
117 {11, QObject::tr(
"Road Surface" )},
118 {12, QObject::tr(
"Reserved" )},
119 {13, QObject::tr(
"Wire - Guard (Shield)" )},
120 {14, QObject::tr(
"Wire - Conductor (Phase)" )},
121 {15, QObject::tr(
"Transmission Tower" )},
122 {16, QObject::tr(
"Wire-Structure Connector (Insulator)" )},
123 {17, QObject::tr(
"Bridge Deck" )},
124 {18, QObject::tr(
"High Noise" )},
127 static std::once_flag initialized;
128 std::call_once( initialized, [ = ]( )
130 for (
int i = 19; i <= 63; ++i )
131 sCodes.insert( i, QObject::tr(
"Reserved" ) );
132 for (
int i = 64; i <= 255; ++i )
133 sCodes.insert( i, QObject::tr(
"User Definable" ) );
141 static QMap< int, QString > sCodes
143 {0, QStringLiteral(
"No color or time stored" )},
144 {1, QStringLiteral(
"Time is stored" )},
145 {2, QStringLiteral(
"Color is stored" )},
146 {3, QStringLiteral(
"Color and time are stored" )},
147 {6, QStringLiteral(
"Time is stored" )},
148 {7, QStringLiteral(
"Time and color are stored)" )},
149 {8, QStringLiteral(
"Time, color and near infrared are stored" )},
157 static QMap< int, QString > sCodes
159 {0, QObject::tr(
"No color or time stored" )},
160 {1, QObject::tr(
"Time is stored" )},
161 {2, QObject::tr(
"Color is stored" )},
162 {3, QObject::tr(
"Color and time are stored" )},
163 {6, QObject::tr(
"Time is stored" )},
164 {7, QObject::tr(
"Time and color are stored)" )},
165 {8, QObject::tr(
"Time, color and near infrared are stored" )},
178 return QVariantList();
197 QVector<QVariantMap> acceptedPoints;
201 return acceptedPoints;
203 const char *ptr = block->data();
206 int xOffset = 0, yOffset = 0, zOffset = 0;
211 extentEngine->prepareGeometry();
215 QgsPointCloudAttribute::getPointXYZ( ptr, i, recordSize, xOffset, xType, yOffset, yType, zOffset, zType,
mIndexScale,
mIndexOffset, x, y, z );
221 pointAttr[ QStringLiteral(
"X" ) ] = x;
222 pointAttr[ QStringLiteral(
"Y" ) ] = y;
223 pointAttr[ QStringLiteral(
"Z" ) ] = z;
225 acceptedPoints.push_back( pointAttr );
228 return acceptedPoints;
246 QVector<QVariantMap> acceptedPoints;
254 QVector<IndexedPointCloudNode> nodes = traverseTree(
index, root, maxError, rootError, extentGeometry, extentZRange );
260 acceptedPoints = QtConcurrent::blockingMappedReduced( nodes,
262 qgis::overload<
const QVector<QMap<QString, QVariant>>&>::of( &QVector<QMap<QString, QVariant>>::append ),
263 QtConcurrent::UnorderedReduce );
265 return acceptedPoints;
268 QVector<IndexedPointCloudNode> QgsPointCloudDataProvider::traverseTree(
276 QVector<IndexedPointCloudNode> nodes;
279 if ( !extentZRange.
overlaps( nodeZRange ) )
287 double childrenError = nodeError / 2.0;
288 if ( childrenError < maxError )
291 const QList<IndexedPointCloudNode> children = pc->
nodeChildren( n );
295 nodes += traverseTree( pc, nn, maxError, childrenError, extentGeometry, extentZRange );
Represents a indexed point cloud node in octree.
Abstract base class for spatial data provider implementations.
virtual QgsRectangle extent() const =0
Returns the extent of the layer.
QgsRange which stores a range of double values.
A geometry is the spatial representation of a feature.
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
static QgsGeometry fromRect(const QgsRectangle &rect) SIP_HOLDGIL
Creates a new geometry from a QgsRectangle.
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry)
Creates and returns a new geometry engine.
bool intersects(const QgsRectangle &rectangle) const
Returns true if this geometry exactly intersects with a rectangle.
Collection of point cloud attributes.
int pointRecordSize() const
Returns total size of record.
const QgsPointCloudAttribute * find(const QString &attributeName, int &offset) const
Finds the attribute with the name.
QVector< QgsPointCloudAttribute > attributes() const
Returns all attributes.
DataType
Systems of unit measurement.
static void getPointXYZ(const char *ptr, int i, std::size_t pointRecordSize, int xOffset, QgsPointCloudAttribute::DataType xType, int yOffset, QgsPointCloudAttribute::DataType yType, int zOffset, QgsPointCloudAttribute::DataType zType, const QgsVector3D &indexScale, const QgsVector3D &indexOffset, double &x, double &y, double &z)
Retrieves the x, y, z values for the point at index i.
static QVariantMap getAttributeMap(const char *data, std::size_t recordOffset, const QgsPointCloudAttributeCollection &attributeCollection)
Retrieves all the attributes of a point.
DataType type() const
Returns the data type.
@ NoCapabilities
Provider has no capabilities.
~QgsPointCloudDataProvider() override
static QMap< int, QString > dataFormatIds()
Returns the map of LAS data format ID to untranslated string value.
virtual QVariant metadataClassStatistic(const QString &attribute, const QVariant &value, QgsStatisticalSummary::Statistic statistic) const
Returns a statistic for one class value from the specified attribute, taken only from the metadata of...
QVector< QVariantMap > identify(double maxError, const QgsGeometry &extentGeometry, const QgsDoubleRange &extentZRange=QgsDoubleRange(), int pointsLimit=1000)
Returns the list of points of the point cloud according to a zoom level defined by maxError (in layer...
QgsPointCloudDataProvider(const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions, QgsDataProvider::ReadFlags flags=QgsDataProvider::ReadFlags())
Ctor.
virtual QgsPointCloudIndex * index() const
Returns the point cloud index associated with the provider.
virtual QVariant metadataStatistic(const QString &attribute, QgsStatisticalSummary::Statistic statistic) const
Returns a statistic for the specified attribute, taken only from the metadata of the point cloud data...
static QMap< int, QString > translatedDataFormatIds()
Returns the map of LAS data format ID to translated string value.
virtual QgsPointCloudDataProvider::Capabilities capabilities() const
Returns flags containing the supported capabilities for the data provider.
static QMap< int, QString > translatedLasClassificationCodes()
Returns the map of LAS classification code to translated string value, corresponding to the ASPRS Sta...
static QMap< int, QString > lasClassificationCodes()
Returns the map of LAS classification code to untranslated string value, corresponding to the ASPRS S...
virtual QgsPointCloudRenderer * createRenderer(const QVariantMap &configuration=QVariantMap()) const
Creates a new 2D point cloud renderer, using provider backend specific information.
bool hasValidIndex() const
Returns whether provider has index which is valid.
virtual QVariantMap originalMetadata() const
Returns a representation of the original metadata included in a point cloud dataset.
virtual QgsGeometry polygonBounds() const
Returns the polygon bounds of the layer.
virtual QVariantList metadataClasses(const QString &attribute) const
Returns a list of existing classes which are present for the specified attribute, taken only from the...
Represents a indexed point clouds data in octree.
int span() const
Returns the number of points in one direction in a single node.
QgsRectangle nodeMapExtent(const IndexedPointCloudNode &node) const
Returns the extent of a node in map coordinates.
QList< IndexedPointCloudNode > nodeChildren(const IndexedPointCloudNode &n) const
Returns all children of node.
QgsVector3D offset() const
Returns offset.
QgsVector3D scale() const
Returns scale.
virtual QgsPointCloudBlock * nodeData(const IndexedPointCloudNode &n, const QgsPointCloudRequest &request)=0
Returns node data block.
virtual bool isValid() const =0
Returns whether index is loaded and valid.
IndexedPointCloudNode root()
Returns root node of the index.
QgsDoubleRange nodeZRange(const IndexedPointCloudNode &node) const
Returns the z range of a node.
QgsPointCloudAttributeCollection attributes() const
Returns all attributes that are stored in the file.
Abstract base class for 2d point cloud renderers.
Point cloud data request.
void setAttributes(const QgsPointCloudAttributeCollection &attributes)
Set attributes filter in the request.
Point geometry type, with support for z-dimension and m-values.
bool overlaps(const QgsRange< T > &other) const
Returns true if this range overlaps another range.
bool contains(const QgsRange< T > &other) const
Returns true if this range contains another range.
A rectangle specified with double values.
double width() const SIP_HOLDGIL
Returns the width of the rectangle.
Statistic
Enumeration of flags that specify statistics to be calculated.
QVector< QMap< QString, QVariant > > result_type
MapIndexedPointCloudNode(QgsPointCloudRequest &request, const QgsVector3D &indexScale, const QgsVector3D &indexOffset, const QgsGeometry &extentGeometry, const QgsDoubleRange &zRange, QgsPointCloudIndex *index, int pointsLimit)
const QgsGeometry & mExtentGeometry
QgsPointCloudIndex * mIndex
const QgsDoubleRange & mZRange
QVector< QVariantMap > operator()(IndexedPointCloudNode n)
QgsPointCloudRequest & mRequest
Setting options for creating vector data providers.