QGIS API Documentation 3.32.0-Lima (311a8cb8a6)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
qgscopcpointcloudblockrequest.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 "qgslazdecoder.h"
22#include "qgsapplication.h"
24
25//
26// QgsCopcPointCloudBlockRequest
27//
28
30
32 const QgsPointCloudAttributeCollection &attributes, const QgsPointCloudAttributeCollection &requestedAttributes,
33 const QgsVector3D &scale, const QgsVector3D &offset, const QgsPointCloudExpression &filterExpression, const QgsRectangle &filterRect,
34 uint64_t blockOffset, int32_t blockSize, int pointCount, const QgsLazInfo &lazInfo )
35 : QgsPointCloudBlockRequest( node, uri, attributes, requestedAttributes, scale, offset, filterExpression, filterRect ),
36 mBlockOffset( blockOffset ), mBlockSize( blockSize ), mPointCount( pointCount ), mLazInfo( lazInfo )
37{
38 QNetworkRequest nr( mUri );
39 QgsSetRequestInitiatorClass( nr, QStringLiteral( "QgsCopcPointCloudBlockRequest" ) );
41 nr.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache );
42 nr.setAttribute( QNetworkRequest::CacheSaveControlAttribute, true );
43
44 QByteArray queryRange = QStringLiteral( "bytes=%1-%2" ).arg( mBlockOffset ).arg( ( int64_t ) mBlockOffset + mBlockSize - 1 ).toLocal8Bit();
45 nr.setRawHeader( "Range", queryRange );
46
47 mTileDownloadManagerReply.reset( QgsApplication::tileDownloadManager()->get( nr ) );
48 connect( mTileDownloadManagerReply.get(), &QgsTileDownloadManagerReply::finished, this, &QgsCopcPointCloudBlockRequest::blockFinishedLoading );
49}
50
51void QgsCopcPointCloudBlockRequest::blockFinishedLoading()
52{
53 mBlock = nullptr;
54 QString error;
55 if ( mTileDownloadManagerReply->error() == QNetworkReply::NetworkError::NoError )
56 {
57 if ( mBlockSize != mTileDownloadManagerReply->data().size() )
58 {
59 error = QStringLiteral( "Returned HTTP range is incorrect, requested %1 bytes but got %2 bytes" ).arg( mBlockSize ).arg( mTileDownloadManagerReply->data().size() );
60 }
61 else
62 {
63 try
64 {
65 mBlock = QgsLazDecoder::decompressCopc( mTileDownloadManagerReply->data(), mLazInfo, mPointCount, mRequestedAttributes, mFilterExpression, mFilterRect );
66 }
67 catch ( std::exception &e )
68 {
69 error = QStringLiteral( "Decompression error: %1" ).arg( e.what() );
70 }
71 }
72 }
73 else
74 {
75 error = QStringLiteral( "Network request error: %1" ).arg( mTileDownloadManagerReply->errorString() );
76 }
77 if ( !error.isEmpty() )
78 {
79 mErrorStr = QStringLiteral( "Error loading point tile %1: \"%2\"" ).arg( mNode.toString(), error );
80 }
81 emit finished();
82}
83
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.
QgsCopcPointCloudBlockRequest(const IndexedPointCloudNode &node, const QString &Uri, const QgsPointCloudAttributeCollection &attributes, const QgsPointCloudAttributeCollection &requestedAttributes, const QgsVector3D &scale, const QgsVector3D &offset, const QgsPointCloudExpression &filterExpression, const QgsRectangle &filterRect, uint64_t blockOffset, int32_t blockSize, int pointCount, const QgsLazInfo &lazInfo)
QgsPointCloudBlockRequest constructor Requests the block data of size blockSize at offset blockOffset...
Class for extracting information contained in LAZ file such as the public header block and variable l...
Definition: qgslazinfo.h:39
Collection of point cloud attributes.
Base class for handling loading QgsPointCloudBlock asynchronously.
QgsPointCloudAttributeCollection mRequestedAttributes
std::unique_ptr< QgsTileDownloadManagerReply > mTileDownloadManagerReply
QgsPointCloudExpression mFilterExpression
void finished()
Emitted when the request processing has finished.
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)
#define QgsSetRequestInitiatorClass(request, _class)
#define QgsSetRequestInitiatorId(request, str)