31#include <QtConcurrent/QtConcurrentMap> 
   36  QgsDataProvider::ReadFlags flags )
 
   55  return lIndex && lIndex->isValid();
 
   81  static QMap< int, QString > sCodes
 
   83    {0, QStringLiteral( 
"Created, Never Classified" )},
 
   84    {1, QStringLiteral( 
"Unclassified" )},
 
   85    {2, QStringLiteral( 
"Ground" )},
 
   86    {3, QStringLiteral( 
"Low Vegetation" )},
 
   87    {4, QStringLiteral( 
"Medium Vegetation" )},
 
   88    {5, QStringLiteral( 
"High Vegetation" )},
 
   89    {6, QStringLiteral( 
"Building" )},
 
   90    {7, QStringLiteral( 
"Low Point (Low Noise)" )},
 
   91    {8, QStringLiteral( 
"Reserved" )},
 
   92    {9, QStringLiteral( 
"Water" )},
 
   93    {10, QStringLiteral( 
"Rail" )},
 
   94    {11, QStringLiteral( 
"Road Surface" )},
 
   95    {12, QStringLiteral( 
"Reserved" )},
 
   96    {13, QStringLiteral( 
"Wire - Guard (Shield)" )},
 
   97    {14, QStringLiteral( 
"Wire - Conductor (Phase)" )},
 
   98    {15, QStringLiteral( 
"Transmission Tower" )},
 
   99    {16, QStringLiteral( 
"Wire-Structure Connector (Insulator)" )},
 
  100    {17, QStringLiteral( 
"Bridge Deck" )},
 
  101    {18, QStringLiteral( 
"High Noise" )},
 
  104  static std::once_flag initialized;
 
  105  std::call_once( initialized, [ = ]( )
 
  107    for ( 
int i = 19; i <= 63; ++i )
 
  108      sCodes.insert( i, QStringLiteral( 
"Reserved" ) );
 
  109    for ( 
int i = 64; i <= 255; ++i )
 
  110      sCodes.insert( i, QStringLiteral( 
"User Definable" ) );
 
  118  static QMap< int, QString > sCodes
 
  120    {0, QObject::tr( 
"Created, Never Classified" )},
 
  121    {1, QObject::tr( 
"Unclassified" )},
 
  122    {2, QObject::tr( 
"Ground" )},
 
  123    {3, QObject::tr( 
"Low Vegetation" )},
 
  124    {4, QObject::tr( 
"Medium Vegetation" )},
 
  125    {5, QObject::tr( 
"High Vegetation" )},
 
  126    {6, QObject::tr( 
"Building" )},
 
  127    {7, QObject::tr( 
"Low Point (Noise)" )},
 
  128    {8, QObject::tr( 
"Reserved" )},
 
  129    {9, QObject::tr( 
"Water" )},
 
  130    {10, QObject::tr( 
"Rail" )},
 
  131    {11, QObject::tr( 
"Road Surface" )},
 
  132    {12, QObject::tr( 
"Reserved" )},
 
  133    {13, QObject::tr( 
"Wire - Guard (Shield)" )},
 
  134    {14, QObject::tr( 
"Wire - Conductor (Phase)" )},
 
  135    {15, QObject::tr( 
"Transmission Tower" )},
 
  136    {16, QObject::tr( 
"Wire-Structure Connector (Insulator)" )},
 
  137    {17, QObject::tr( 
"Bridge Deck" )},
 
  138    {18, QObject::tr( 
"High Noise" )},
 
  141  static std::once_flag initialized;
 
  142  std::call_once( initialized, [ = ]( )
 
  144    for ( 
int i = 19; i <= 63; ++i )
 
  145      sCodes.insert( i, QObject::tr( 
"Reserved" ) );
 
  146    for ( 
int i = 64; i <= 255; ++i )
 
  147      sCodes.insert( i, QObject::tr( 
"User Definable" ) );
 
  155  static const QMap< int, QString > sCodes
 
  157    {0, QStringLiteral( 
"No color or time stored" )},
 
  158    {1, QStringLiteral( 
"Time is stored" )},
 
  159    {2, QStringLiteral( 
"Color is stored" )},
 
  160    {3, QStringLiteral( 
"Color and time are stored" )},
 
  161    {6, QStringLiteral( 
"Time is stored" )},
 
  162    {7, QStringLiteral( 
"Time and color are stored)" )},
 
  163    {8, QStringLiteral( 
"Time, color and near infrared are stored" )},
 
  171  static const QMap< int, QString > sCodes
 
  173    {0, QObject::tr( 
"No color or time stored" )},
 
  174    {1, QObject::tr( 
"Time is stored" )},
 
  175    {2, QObject::tr( 
"Color is stored" )},
 
  176    {3, QObject::tr( 
"Color and time are stored" )},
 
  177    {6, QObject::tr( 
"Time is stored" )},
 
  178    {7, QObject::tr( 
"Time and color are stored)" )},
 
  179    {8, QObject::tr( 
"Time, color and near infrared are stored" )},
 
  199    return pcIndex->metadataStatistic( attribute, statistic );
 
  211    return pcIndex->metadataClasses( attribute );
 
  213  return QVariantList();
 
  223    return pcIndex->metadataClassStatistic( attribute, value, statistic );
 
  235    return pcIndex->metadataStatistics();
 
  251    QVector<QVariantMap> acceptedPoints;
 
  255      return acceptedPoints;
 
  257    const char *ptr = block->data();
 
  260    int xOffset = 0, yOffset = 0, zOffset = 0;
 
  265    extentEngine->prepareGeometry();
 
  269      QgsPointCloudAttribute::getPointXYZ( ptr, i, recordSize, xOffset, xType, yOffset, yType, zOffset, zType, block->scale(), block->offset(), x, y, z );
 
  275        pointAttr[ QStringLiteral( 
"X" ) ] = x;
 
  276        pointAttr[ QStringLiteral( 
"Y" ) ] = y;
 
  277        pointAttr[ QStringLiteral( 
"Z" ) ] = z;
 
  279        acceptedPoints.push_back( pointAttr );
 
  282    return acceptedPoints;
 
  302  QVector<QVariantMap> acceptedPoints;
 
  307    return acceptedPoints;
 
  314  const QVector<IndexedPointCloudNode> nodes = traverseTree( 
index, root, maxError, rootError, extentGeometry, extentZRange );
 
  320  acceptedPoints = QtConcurrent::blockingMappedReduced( nodes,
 
  322                   qOverload<
const QVector<QMap<QString, QVariant>>&>( &QVector<QMap<QString, QVariant>>::append ),
 
  323                   QtConcurrent::UnorderedReduce );
 
  325  return acceptedPoints;
 
  328QVector<IndexedPointCloudNode> QgsPointCloudDataProvider::traverseTree(
 
  338  QVector<IndexedPointCloudNode> nodes;
 
  341  if ( !extentZRange.
overlaps( nodeZRange ) )
 
  349  const double childrenError = nodeError / 2.0;
 
  350  if ( childrenError < maxError )
 
  353  const QList<IndexedPointCloudNode> children = pc->
nodeChildren( n );
 
  357      nodes += traverseTree( pc, nn, maxError, childrenError, extentGeometry, extentZRange );
 
  367  Q_UNUSED( updateFeatureCount )
 
  368  const auto i = 
index();
 
  372  if ( !i->setSubsetString( subset ) )
 
Represents a indexed point cloud node in octree.
 
Abstract base class for spatial data provider implementations.
 
void dataChanged()
Emitted whenever a change is made to the data provider which may have caused changes in the provider'...
 
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 representing the specified geometry.
 
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.
 
bool setSubsetString(const QString &subset, bool updateFeatureCount=false) override
Set the subset string used to create a subset of features in the layer.
 
~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.
 
QgsPointCloudStatistics metadataStatistics()
Returns the object containings the statistics metadata extracted from the dataset.
 
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...
 
QString subsetString() const override
Returns the subset definition string (typically sql) currently in use by the layer and used by the pr...
 
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...
 
QString mSubsetString
String used to define a subset of the layer.
 
static QMap< int, QString > lasClassificationCodes()
Returns the map of LAS classification code to untranslated string value, corresponding to the ASPRS S...
 
virtual bool hasStatisticsMetadata() const
Returns whether the dataset contains statistics metadata.
 
virtual QgsPointCloudIndex * index() const
Returns the point cloud index associated with the provider.
 
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.
 
virtual QList< IndexedPointCloudNode > nodeChildren(const IndexedPointCloudNode &n) const
Returns all children of node.
 
QgsVector3D offset() const
Returns offset.
 
QgsVector3D scale() const
Returns scale.
 
virtual bool isValid() const =0
Returns whether index is loaded and valid.
 
virtual QgsPointCloudBlock * nodeData(const IndexedPointCloudNode &n, const QgsPointCloudRequest &request)=0
Returns node data block.
 
IndexedPointCloudNode root()
Returns root node of the index.
 
virtual bool hasStatisticsMetadata() const =0
Returns whether the dataset contains metadata of statistics.
 
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.
 
Class used to store statistics of a point cloud dataset.
 
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.
 
#define QGIS_PROTECT_QOBJECT_THREAD_ACCESS
 
QVector< QVariantMap > operator()(IndexedPointCloudNode n)
 
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
 
QgsPointCloudRequest & mRequest
 
Setting options for creating vector data providers.