Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgseptdataprovider.cpp 3 : : ----------------------- 4 : : begin : October 2020 5 : : copyright : (C) 2020 by Peter Petrik 6 : : email : zilolv 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 : : 18 : : #include "qgis.h" 19 : : #include "qgseptprovider.h" 20 : : #include "qgseptpointcloudindex.h" 21 : : #include "qgseptdataitems.h" 22 : : #include "qgsruntimeprofiler.h" 23 : : #include "qgsapplication.h" 24 : : 25 : : #include <QFileInfo> 26 : : 27 : : ///@cond PRIVATE 28 : : 29 : : #define PROVIDER_KEY QStringLiteral( "ept" ) 30 : : #define PROVIDER_DESCRIPTION QStringLiteral( "EPT point cloud data provider" ) 31 : : 32 : 0 : QgsEptProvider::QgsEptProvider( 33 : : const QString &uri, 34 : : const QgsDataProvider::ProviderOptions &options, 35 : : QgsDataProvider::ReadFlags flags ) 36 : 0 : : QgsPointCloudDataProvider( uri, options, flags ) 37 : 0 : , mIndex( new QgsEptPointCloudIndex ) 38 : 0 : { 39 : 0 : std::unique_ptr< QgsScopedRuntimeProfile > profile; 40 : 0 : if ( QgsApplication::profiler()->groupIsActive( QStringLiteral( "projectload" ) ) ) 41 : 0 : profile = std::make_unique< QgsScopedRuntimeProfile >( tr( "Open data source" ), QStringLiteral( "projectload" ) ); 42 : : 43 : 0 : loadIndex( ); 44 : 0 : } 45 : : 46 : 0 : QgsEptProvider::~QgsEptProvider() = default; 47 : : 48 : 0 : QgsCoordinateReferenceSystem QgsEptProvider::crs() const 49 : : { 50 : 0 : return mIndex->crs(); 51 : : } 52 : : 53 : 0 : QgsRectangle QgsEptProvider::extent() const 54 : : { 55 : 0 : return mIndex->extent(); 56 : : } 57 : : 58 : 0 : QgsPointCloudAttributeCollection QgsEptProvider::attributes() const 59 : : { 60 : 0 : return mIndex->attributes(); 61 : : } 62 : : 63 : 0 : bool QgsEptProvider::isValid() const 64 : : { 65 : 0 : return mIndex->isValid(); 66 : : } 67 : : 68 : 0 : QString QgsEptProvider::name() const 69 : : { 70 : 0 : return QStringLiteral( "ept" ); 71 : : } 72 : : 73 : 0 : QString QgsEptProvider::description() const 74 : : { 75 : 0 : return QStringLiteral( "Point Clouds EPT" ); 76 : : } 77 : : 78 : 0 : QgsPointCloudIndex *QgsEptProvider::index() const 79 : : { 80 : 0 : return mIndex.get(); 81 : : } 82 : : 83 : 0 : int QgsEptProvider::pointCount() const 84 : : { 85 : 0 : return mIndex->pointCount(); 86 : : } 87 : : 88 : 0 : QVariantList QgsEptProvider::metadataClasses( const QString &attribute ) const 89 : : { 90 : 0 : return mIndex->metadataClasses( attribute ); 91 : : } 92 : : 93 : 0 : QVariant QgsEptProvider::metadataClassStatistic( const QString &attribute, const QVariant &value, QgsStatisticalSummary::Statistic statistic ) const 94 : : { 95 : 0 : return mIndex->metadataClassStatistic( attribute, value, statistic ); 96 : : } 97 : : 98 : 0 : void QgsEptProvider::loadIndex( ) 99 : : { 100 : 0 : if ( mIndex->isValid() ) 101 : 0 : return; 102 : : 103 : 0 : mIndex->load( dataSourceUri() ); 104 : 0 : } 105 : : 106 : 0 : QVariantMap QgsEptProvider::originalMetadata() const 107 : : { 108 : 0 : return mIndex->originalMetadata(); 109 : : } 110 : : 111 : 0 : void QgsEptProvider::generateIndex() 112 : : { 113 : : //no-op, index is always generated 114 : 0 : } 115 : : 116 : 0 : QVariant QgsEptProvider::metadataStatistic( const QString &attribute, QgsStatisticalSummary::Statistic statistic ) const 117 : : { 118 : 0 : return mIndex->metadataStatistic( attribute, statistic ); 119 : : } 120 : : 121 : 3 : QgsEptProviderMetadata::QgsEptProviderMetadata(): 122 : 9 : QgsProviderMetadata( PROVIDER_KEY, PROVIDER_DESCRIPTION ) 123 : 3 : { 124 : 3 : } 125 : : 126 : 0 : QgsEptProvider *QgsEptProviderMetadata::createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags ) 127 : : { 128 : 0 : return new QgsEptProvider( uri, options, flags ); 129 : 0 : } 130 : : 131 : 3 : QList<QgsDataItemProvider *> QgsEptProviderMetadata::dataItemProviders() const 132 : : { 133 : 3 : QList< QgsDataItemProvider * > providers; 134 : 3 : providers << new QgsEptDataItemProvider; 135 : 3 : return providers; 136 : 3 : } 137 : : 138 : 0 : int QgsEptProviderMetadata::priorityForUri( const QString &uri ) const 139 : : { 140 : 0 : const QVariantMap parts = decodeUri( uri ); 141 : 0 : QFileInfo fi( parts.value( QStringLiteral( "path" ) ).toString() ); 142 : 0 : if ( fi.fileName().compare( QLatin1String( "ept.json" ), Qt::CaseInsensitive ) == 0 ) 143 : 0 : return 100; 144 : : 145 : 0 : return 0; 146 : 0 : } 147 : : 148 : 0 : QList<QgsMapLayerType> QgsEptProviderMetadata::validLayerTypesForUri( const QString &uri ) const 149 : : { 150 : 0 : const QVariantMap parts = decodeUri( uri ); 151 : 0 : QFileInfo fi( parts.value( QStringLiteral( "path" ) ).toString() ); 152 : 0 : if ( fi.fileName().compare( QLatin1String( "ept.json" ), Qt::CaseInsensitive ) == 0 ) 153 : 0 : return QList< QgsMapLayerType>() << QgsMapLayerType::PointCloudLayer; 154 : : 155 : 0 : return QList< QgsMapLayerType>(); 156 : 0 : } 157 : : 158 : 0 : bool QgsEptProviderMetadata::uriIsBlocklisted( const QString &uri ) const 159 : : { 160 : 0 : const QVariantMap parts = decodeUri( uri ); 161 : 0 : if ( !parts.contains( QStringLiteral( "path" ) ) ) 162 : 0 : return false; 163 : : 164 : 0 : QFileInfo fi( parts.value( QStringLiteral( "path" ) ).toString() ); 165 : : 166 : : // internal details only 167 : 0 : if ( fi.fileName().compare( QLatin1String( "ept-build.json" ), Qt::CaseInsensitive ) == 0 ) 168 : 0 : return true; 169 : : 170 : 0 : return false; 171 : 0 : } 172 : : 173 : 0 : QVariantMap QgsEptProviderMetadata::decodeUri( const QString &uri ) const 174 : : { 175 : 0 : const QString path = uri; 176 : 0 : QVariantMap uriComponents; 177 : 0 : uriComponents.insert( QStringLiteral( "path" ), path ); 178 : 0 : return uriComponents; 179 : 0 : } 180 : : 181 : 18 : QString QgsEptProviderMetadata::filters( QgsProviderMetadata::FilterType type ) 182 : : { 183 : 18 : switch ( type ) 184 : : { 185 : : case QgsProviderMetadata::FilterType::FilterVector: 186 : : case QgsProviderMetadata::FilterType::FilterRaster: 187 : : case QgsProviderMetadata::FilterType::FilterMesh: 188 : : case QgsProviderMetadata::FilterType::FilterMeshDataset: 189 : 12 : return QString(); 190 : : 191 : : case QgsProviderMetadata::FilterType::FilterPointCloud: 192 : 12 : return QObject::tr( "Entwine Point Clouds" ) + QStringLiteral( " (ept.json EPT.JSON)" ); 193 : : } 194 : 0 : return QString(); 195 : 18 : } 196 : : 197 : 0 : QgsProviderMetadata::ProviderCapabilities QgsEptProviderMetadata::providerCapabilities() const 198 : : { 199 : 0 : return FileBasedUris; 200 : : } 201 : : 202 : 0 : QString QgsEptProviderMetadata::encodeUri( const QVariantMap &parts ) const 203 : : { 204 : 0 : const QString path = parts.value( QStringLiteral( "path" ) ).toString(); 205 : 0 : return path; 206 : 0 : } 207 : : 208 : 0 : QgsProviderMetadata::ProviderMetadataCapabilities QgsEptProviderMetadata::capabilities() const 209 : : { 210 : 0 : return ProviderMetadataCapability::LayerTypesForUri 211 : 0 : | ProviderMetadataCapability::PriorityForUri; 212 : : } 213 : : ///@endcond 214 : :