QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
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,
34 uint64_t blockOffset, int32_t blockSize, int pointCount, const QgsLazInfo &lazInfo )
35 : QgsPointCloudBlockRequest( node, uri, attributes, requestedAttributes, scale, offset, filterExpression ),
36 mBlockOffset( blockOffset ), mBlockSize( blockSize ), mPointCount( pointCount ), mLazInfo( lazInfo )
37{
38 QNetworkRequest nr( mUri );
39 nr.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache );
40 nr.setAttribute( QNetworkRequest::CacheSaveControlAttribute, true );
41
42 QByteArray queryRange = QStringLiteral( "bytes=%1-%2" ).arg( mBlockOffset ).arg( ( int64_t ) mBlockOffset + mBlockSize - 1 ).toLocal8Bit();
43 nr.setRawHeader( "Range", queryRange );
44
45 mTileDownloadManagerReply.reset( QgsApplication::tileDownloadManager()->get( nr ) );
46 connect( mTileDownloadManagerReply.get(), &QgsTileDownloadManagerReply::finished, this, &QgsCopcPointCloudBlockRequest::blockFinishedLoading );
47}
48
49void QgsCopcPointCloudBlockRequest::blockFinishedLoading()
50{
51 mBlock = nullptr;
52 QString error;
53 if ( mTileDownloadManagerReply->error() == QNetworkReply::NetworkError::NoError )
54 {
55 if ( mBlockSize != mTileDownloadManagerReply->data().size() )
56 {
57 error = QStringLiteral( "Returned HTTP range is incorrect, requested %1 bytes but got %2 bytes" ).arg( mBlockSize ).arg( mTileDownloadManagerReply->data().size() );
58 }
59 else
60 {
61 try
62 {
63 mBlock = QgsLazDecoder::decompressCopc( mTileDownloadManagerReply->data(), mLazInfo, mPointCount, mRequestedAttributes, mFilterExpression );
64 }
65 catch ( std::exception &e )
66 {
67 error = QStringLiteral( "Decompression error: %1" ).arg( e.what() );
68 }
69 }
70 }
71 else
72 {
73 error = QStringLiteral( "Network request error: %1" ).arg( mTileDownloadManagerReply->errorString() );
74 }
75 if ( !error.isEmpty() )
76 {
77 mErrorStr = QStringLiteral( "Error loading point tile %1: \"%2\"" ).arg( mNode.toString(), error );
78 }
79 emit finished();
80}
81
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, 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.
void finished()
Emitted when the reply has finished (either with a success or with a failure)