diff --git a/src/3d/symbols/qgspointcloud3dsymbol_p.cpp b/src/3d/symbols/qgspointcloud3dsymbol_p.cpp index e58ed16d8f0a..be64d38785f5 100644 --- a/src/3d/symbols/qgspointcloud3dsymbol_p.cpp +++ b/src/3d/symbols/qgspointcloud3dsymbol_p.cpp @@ -525,6 +525,9 @@ std::unique_ptr QgsPointCloud3DSymbolHandler::pointCloudBloc } else if ( pc->accessType() == QgsPointCloudIndex::AccessType::Remote ) { + if ( pc->nodePointCount( n ) < 1 ) + return block; + bool loopAborted = false; QEventLoop loop; QgsPointCloudBlockRequest *req = pc->asyncNodeData( n, request ); diff --git a/src/core/pointcloud/qgscopcpointcloudblockrequest.cpp b/src/core/pointcloud/qgscopcpointcloudblockrequest.cpp index 6d842ed3c98c..c2568c175a94 100644 --- a/src/core/pointcloud/qgscopcpointcloudblockrequest.cpp +++ b/src/core/pointcloud/qgscopcpointcloudblockrequest.cpp @@ -35,6 +35,9 @@ QgsCopcPointCloudBlockRequest::QgsCopcPointCloudBlockRequest( const IndexedPoint : QgsPointCloudBlockRequest( node, uri, attributes, requestedAttributes, scale, offset, filterExpression, filterRect ), mBlockOffset( blockOffset ), mBlockSize( blockSize ), mPointCount( pointCount ), mLazInfo( lazInfo ) { + // an empty block size will create an invalid range, causing a full request to the server + Q_ASSERT( mBlockSize > 0 ); + QNetworkRequest nr = QNetworkRequest( QUrl( mUri ) ); QgsSetRequestInitiatorClass( nr, QStringLiteral( "QgsCopcPointCloudBlockRequest" ) ); QgsSetRequestInitiatorId( nr, node.toString() ); diff --git a/src/core/pointcloud/qgspointcloudlayerprofilegenerator.cpp b/src/core/pointcloud/qgspointcloudlayerprofilegenerator.cpp index b5f561253ce4..c38090e5c64a 100644 --- a/src/core/pointcloud/qgspointcloudlayerprofilegenerator.cpp +++ b/src/core/pointcloud/qgspointcloudlayerprofilegenerator.cpp @@ -591,7 +591,8 @@ QVector QgsPointCloudLayerProfileGenerator::traverseTree( if ( !mSearchGeometryInLayerCrsGeometryEngine->intersects( nodeMapGeometry.constGet() ) ) return nodes; - nodes.append( n ); + if ( pc->nodePointCount( n ) > 0 ) + nodes.append( n ); double childrenErrorPixels = nodeErrorPixels / 2.0; if ( childrenErrorPixels < maxErrorPixels ) diff --git a/src/core/pointcloud/qgspointcloudstatscalculator.cpp b/src/core/pointcloud/qgspointcloudstatscalculator.cpp index 15b5d4e19999..6db2204203eb 100644 --- a/src/core/pointcloud/qgspointcloudstatscalculator.cpp +++ b/src/core/pointcloud/qgspointcloudstatscalculator.cpp @@ -58,6 +58,9 @@ struct StatsProcessor QgsPointCloudStatistics operator()( IndexedPointCloudNode node ) { + if ( mIndex->nodePointCount( node ) < 1 ) + return QgsPointCloudStatistics(); + std::unique_ptr block = nullptr; if ( mIndex->accessType() == QgsPointCloudIndex::Local ) { diff --git a/src/core/pointcloud/qgsremotecopcpointcloudindex.cpp b/src/core/pointcloud/qgsremotecopcpointcloudindex.cpp index 22826bec145c..65987d368af4 100644 --- a/src/core/pointcloud/qgsremotecopcpointcloudindex.cpp +++ b/src/core/pointcloud/qgsremotecopcpointcloudindex.cpp @@ -188,6 +188,8 @@ bool QgsRemoteCopcPointCloudIndex::isValid() const void QgsRemoteCopcPointCloudIndex::fetchHierarchyPage( uint64_t offset, uint64_t byteSize ) const { + Q_ASSERT( byteSize > 0 ); + QNetworkRequest nr = QNetworkRequest( QUrl( mUri ) ); QgsSetRequestInitiatorClass( nr, QStringLiteral( "QgsRemoteCopcPointCloudIndex" ) ); nr.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache );