Skip to content

Commit

Permalink
Implement querySublayers for ept provider
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Jul 23, 2021
1 parent b7addc2 commit ae980c5
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 1 deletion.
24 changes: 23 additions & 1 deletion src/core/providers/ept/qgseptprovider.cpp
Expand Up @@ -24,6 +24,8 @@
#include "qgseptdataitems.h"
#include "qgsruntimeprofiler.h"
#include "qgsapplication.h"
#include "qgsprovidersublayerdetails.h"
#include "qgsproviderutils.h"

#include <QFileInfo>

Expand Down Expand Up @@ -142,6 +144,25 @@ QList<QgsDataItemProvider *> QgsEptProviderMetadata::dataItemProviders() const
return providers;
}

QList<QgsProviderSublayerDetails> QgsEptProviderMetadata::querySublayers( const QString &uri, Qgis::SublayerQueryFlags, QgsFeedback * ) const
{
const QVariantMap parts = decodeUri( uri );
const QFileInfo fi( parts.value( QStringLiteral( "path" ) ).toString() );
if ( fi.fileName().compare( QLatin1String( "ept.json" ), Qt::CaseInsensitive ) == 0 )
{
QgsProviderSublayerDetails details;
details.setUri( uri );
details.setProviderKey( QStringLiteral( "ept" ) );
details.setType( QgsMapLayerType::PointCloudLayer );
details.setName( QgsProviderUtils::suggestLayerNameFromFilePath( uri ) );
return {details};
}
else
{
return {};
}
}

int QgsEptProviderMetadata::priorityForUri( const QString &uri ) const
{
const QVariantMap parts = decodeUri( uri );
Expand Down Expand Up @@ -215,7 +236,8 @@ QString QgsEptProviderMetadata::encodeUri( const QVariantMap &parts ) const
QgsProviderMetadata::ProviderMetadataCapabilities QgsEptProviderMetadata::capabilities() const
{
return ProviderMetadataCapability::LayerTypesForUri
| ProviderMetadataCapability::PriorityForUri;
| ProviderMetadataCapability::PriorityForUri
| ProviderMetadataCapability::QuerySublayers;
}
///@endcond

1 change: 1 addition & 0 deletions src/core/providers/ept/qgseptprovider.h
Expand Up @@ -70,6 +70,7 @@ class QgsEptProviderMetadata : public QgsProviderMetadata
QgsProviderMetadata::ProviderMetadataCapabilities capabilities() const override;
QgsEptProvider *createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() ) override;
QList< QgsDataItemProvider * > dataItemProviders() const override;
QList< QgsProviderSublayerDetails > querySublayers( const QString &uri, Qgis::SublayerQueryFlags flags = Qgis::SublayerQueryFlags(), QgsFeedback *feedback = nullptr ) const override;
int priorityForUri( const QString &uri ) const override;
QList< QgsMapLayerType > validLayerTypesForUri( const QString &uri ) const override;
bool uriIsBlocklisted( const QString &uri ) const override;
Expand Down
29 changes: 29 additions & 0 deletions tests/src/providers/testqgseptprovider.cpp
Expand Up @@ -31,6 +31,7 @@
#include "qgspointcloudlayer.h"
#include "qgspointcloudindex.h"
#include "qgspointcloudlayerelevationproperties.h"
#include "qgsprovidersublayerdetails.h"

/**
* \ingroup UnitTests
Expand All @@ -52,6 +53,7 @@ class TestQgsEptProvider : public QObject
void preferredUri();
void layerTypesForUri();
void uriIsBlocklisted();
void querySublayers();
void brokenPath();
void validLayer();
void validLayerWithEptHierarchy();
Expand Down Expand Up @@ -155,6 +157,33 @@ void TestQgsEptProvider::uriIsBlocklisted()
QVERIFY( QgsProviderRegistry::instance()->uriIsBlocklisted( QStringLiteral( "/home/nyall/ept-build.json" ) ) );
}

void TestQgsEptProvider::querySublayers()
{
// test querying sub layers for a ept layer
QgsProviderMetadata *eptMetadata = QgsProviderRegistry::instance()->providerMetadata( QStringLiteral( "ept" ) );

// invalid uri
QList< QgsProviderSublayerDetails >res = eptMetadata->querySublayers( QString() );
QVERIFY( res.empty() );

// not a ept layer
res = eptMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/lines.shp" );
QVERIFY( res.empty() );

// valid ept layer
res = eptMetadata->querySublayers( mTestDataDir + "/point_clouds/ept/sunshine-coast/ept.json" );
QCOMPARE( res.count(), 1 );
QCOMPARE( res.at( 0 ).name(), QStringLiteral( "sunshine-coast" ) );
QCOMPARE( res.at( 0 ).uri(), mTestDataDir + "/point_clouds/ept/sunshine-coast/ept.json" );
QCOMPARE( res.at( 0 ).providerKey(), QStringLiteral( "ept" ) );
QCOMPARE( res.at( 0 ).type(), QgsMapLayerType::PointCloudLayer );

// make sure result is valid to load layer from
QgsProviderSublayerDetails::LayerOptions options{ QgsCoordinateTransformContext() };
std::unique_ptr< QgsPointCloudLayer > ml( qgis::down_cast< QgsPointCloudLayer * >( res.at( 0 ).toLayer( options ) ) );
QVERIFY( ml->isValid() );
}

void TestQgsEptProvider::brokenPath()
{
// test loading a bad layer URI
Expand Down

0 comments on commit ae980c5

Please sign in to comment.