QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgseptpointcloudblockrequest.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgscopcpointcloudblockrequest.cpp
3 --------------------
4 begin : March 2022
5 copyright : (C) 2022 by Belgacem Nedjima
6 email : belgacem dot nedjima 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
19
21#include "qgseptdecoder.h"
22#include "qgslazdecoder.h"
23#include "qgsapplication.h"
26
27//
28// QgsEptPointCloudBlockRequest
29//
30
32
33QgsEptPointCloudBlockRequest::QgsEptPointCloudBlockRequest( const IndexedPointCloudNode &node, const QString &uri, const QString &dataType,
34 const QgsPointCloudAttributeCollection &attributes, const QgsPointCloudAttributeCollection &requestedAttributes,
35 const QgsVector3D &scale, const QgsVector3D &offset, const QgsPointCloudExpression &filterExpression, const QgsRectangle &filterRect )
36 : QgsPointCloudBlockRequest( node, uri, attributes, requestedAttributes, scale, offset, filterExpression, filterRect ),
37 mDataType( dataType )
38{
39 QNetworkRequest nr = QNetworkRequest( QUrl( mUri ) );
40 QgsSetRequestInitiatorClass( nr, QStringLiteral( "QgsEptPointCloudBlockRequest" ) );
42 nr.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache );
43 nr.setAttribute( QNetworkRequest::CacheSaveControlAttribute, true );
44 mTileDownloadManagerReply.reset( QgsApplication::tileDownloadManager()->get( nr ) );
45 connect( mTileDownloadManagerReply.get(), &QgsTileDownloadManagerReply::finished, this, &QgsEptPointCloudBlockRequest::blockFinishedLoading );
46}
47
48void QgsEptPointCloudBlockRequest::blockFinishedLoading()
49{
50 mBlock = nullptr;
51 QString error;
52 if ( mTileDownloadManagerReply->error() == QNetworkReply::NetworkError::NoError )
53 {
54 try
55 {
56 mBlock = nullptr;
57 if ( mDataType == QLatin1String( "binary" ) )
58 {
60 }
61 else if ( mDataType == QLatin1String( "zstandard" ) )
62 {
64 }
65 else if ( mDataType == QLatin1String( "laszip" ) )
66 {
67 mBlock = QgsLazDecoder::decompressLaz( mTileDownloadManagerReply->data(), mRequestedAttributes, mFilterExpression, mFilterRect );
68 }
69 else
70 {
71 error = QStringLiteral( "Unknown data type %1;" ).arg( mDataType );
72 }
73 if ( mBlock )
74 {
79 }
80 }
81 catch ( std::exception &e )
82 {
83 error = QStringLiteral( "Decompression error: %1" ).arg( e.what() );
84 }
85 }
86 else
87 {
88 error = QStringLiteral( "Network request error: %1" ).arg( mTileDownloadManagerReply->errorString() );
89 }
90 if ( !error.isEmpty() )
91 {
92 mErrorStr = QStringLiteral( "Error loading point cloud tile %1: \" %2 \"" ).arg( mNode.toString(), error );
93 }
94 emit finished();
95}
96
Represents a indexed point cloud node in octree.
QString toString() const
Encode node to string.
static QgsTileDownloadManager * tileDownloadManager()
Returns the application's tile download manager, used for download of map tiles when rendering.
QgsEptPointCloudBlockRequest(const IndexedPointCloudNode &node, const QString &Uri, const QString &dataType, const QgsPointCloudAttributeCollection &attributes, const QgsPointCloudAttributeCollection &requestedAttributes, const QgsVector3D &scale, const QgsVector3D &offset, const QgsPointCloudExpression &filterExpression, const QgsRectangle &filterRect)
QgsPointCloudBlockRequest constructor Requests the block data of size blockSize at offset blockOffset...
Collection of point cloud attributes.
Base class for handling loading QgsPointCloudBlock asynchronously.
QgsPointCloudAttributeCollection mRequestedAttributes
std::unique_ptr< QgsTileDownloadManagerReply > mTileDownloadManagerReply
QgsPointCloudAttributeCollection mAttributes
std::unique_ptr< QgsPointCloudBlock > mBlock
QgsPointCloudExpression mFilterExpression
void finished()
Emitted when the request processing has finished.
static void storeNodeDataToCacheStatic(QgsPointCloudBlock *data, const IndexedPointCloudNode &node, const QgsPointCloudRequest &request, const QgsPointCloudExpression &expression, const QString &uri)
Stores existing data to the cache for the specified node, request, expression and uri.
Point cloud data request.
void setFilterRect(QgsRectangle extent)
Sets the rectangle from which points will be taken, in point cloud's crs.
void setAttributes(const QgsPointCloudAttributeCollection &attributes)
Set attributes filter in the request.
A rectangle specified with double values.
Definition: qgsrectangle.h:42
void finished()
Emitted when the reply has finished (either with a success or with a failure)
Class for storage of 3D vectors similar to QVector3D, with the difference that it uses double precisi...
Definition: qgsvector3d.h:31
#define QgsSetRequestInitiatorClass(request, _class)
#define QgsSetRequestInitiatorId(request, str)