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