Skip to content

Commit

Permalink
[arcgisrest] Hardcode a list of supported image formats for ImageServer
Browse files Browse the repository at this point in the history
services, to ensure that we always have a valid list of available
formats when layers from a ImageServer are selected in data source manager/browser

This also ensures that we select the default JPGPNG format when an
ImageServer layer is added via browser

Fixes #41126
  • Loading branch information
nyalldawson committed Jan 30, 2021
1 parent 39e8b8a commit 9fb554f
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 18 deletions.
13 changes: 5 additions & 8 deletions src/core/providers/arcgis/qgsarcgisrestquery.cpp
Expand Up @@ -285,7 +285,7 @@ void QgsArcGisRestQueryUtils::visitFolderItems( const std::function< void( const
}
}

void QgsArcGisRestQueryUtils::visitServiceItems( const std::function<void ( const QString &, const QString &, const ServiceTypeFilter )> &visitor, const QVariantMap &serviceData, const QString &baseUrl, const ServiceTypeFilter filter )
void QgsArcGisRestQueryUtils::visitServiceItems( const std::function<void ( const QString &, const QString &, const QString &, const ServiceTypeFilter )> &visitor, const QVariantMap &serviceData, const QString &baseUrl )
{
QString base( baseUrl );
bool baseChecked = false;
Expand All @@ -300,10 +300,7 @@ void QgsArcGisRestQueryUtils::visitServiceItems( const std::function<void ( cons
if ( serviceType != QLatin1String( "MapServer" ) && serviceType != QLatin1String( "ImageServer" ) && serviceType != QLatin1String( "FeatureServer" ) )
continue;

// If the requested service type is raster, do not show vector-only services
const ServiceTypeFilter type = serviceType == QLatin1String( "FeatureServer" ) ? Vector : Raster;
if ( type == Raster && ( filter != Raster && filter != AllTypes ) )
continue;

const QString serviceName = serviceMap.value( QStringLiteral( "name" ) ).toString();
QString displayName = serviceName.split( '/' ).last();
Expand All @@ -313,18 +310,18 @@ void QgsArcGisRestQueryUtils::visitServiceItems( const std::function<void ( cons
baseChecked = true;
}

visitor( displayName, base + serviceName + '/' + serviceType, type );
visitor( displayName, base + serviceName + '/' + serviceType, serviceType, type );
}
}

void QgsArcGisRestQueryUtils::addLayerItems( const std::function<void ( const QString &, ServiceTypeFilter, QgsWkbTypes::GeometryType, const QString &, const QString &, const QString &, const QString &, bool, const QString &, const QString & )> &visitor, const QVariantMap &serviceData, const QString &parentUrl, const ServiceTypeFilter filter )
void QgsArcGisRestQueryUtils::addLayerItems( const std::function<void ( const QString &, ServiceTypeFilter, QgsWkbTypes::GeometryType, const QString &, const QString &, const QString &, const QString &, bool, const QString &, const QString & )> &visitor, const QVariantMap &serviceData, const QString &parentUrl, const QString &parentSupportedFormats, const ServiceTypeFilter filter )
{
const QString authid = QgsArcGisRestUtils::convertSpatialReference( serviceData.value( QStringLiteral( "spatialReference" ) ).toMap() ).authid();

QString format = QStringLiteral( "jpg" );
bool found = false;
const QList<QByteArray> supportedFormats = QImageReader::supportedImageFormats();
const QStringList supportedImageFormatTypes = serviceData.value( QStringLiteral( "supportedImageFormatTypes" ) ).toString().split( ',' );
const QStringList supportedImageFormatTypes = serviceData.value( QStringLiteral( "supportedImageFormatTypes" ) ).toString().isEmpty() ? parentSupportedFormats.split( ',' ) : serviceData.value( QStringLiteral( "supportedImageFormatTypes" ) ).toString().split( ',' );
QString format = supportedImageFormatTypes.value( 0 );
for ( const QString &encoding : supportedImageFormatTypes )
{
for ( const QByteArray &fmt : supportedFormats )
Expand Down
4 changes: 2 additions & 2 deletions src/core/providers/arcgis/qgsarcgisrestquery.h
Expand Up @@ -93,12 +93,12 @@ class CORE_EXPORT QgsArcGisRestQueryUtils
/**
* Calls the specified \a visitor function on all service items found within the given service data.
*/
static void visitServiceItems( const std::function<void ( const QString &serviceName, const QString &url, ServiceTypeFilter serviceType )> &visitor, const QVariantMap &serviceData, const QString &baseUrl, const ServiceTypeFilter filter = AllTypes );
static void visitServiceItems( const std::function<void ( const QString &serviceName, const QString &url, const QString &service, ServiceTypeFilter serviceType )> &visitor, const QVariantMap &serviceData, const QString &baseUrl );

/**
* Calls the specified \a visitor function on all layer items found within the given service data.
*/
static void addLayerItems( const std::function<void ( const QString &parentLayerId, ServiceTypeFilter serviceType, QgsWkbTypes::GeometryType geometryType, const QString &layerId, const QString &name, const QString &description, const QString &url, bool isParentLayer, const QString &authid, const QString &format )> &visitor, const QVariantMap &serviceData, const QString &parentUrl, const ServiceTypeFilter filter = AllTypes );
static void addLayerItems( const std::function<void ( const QString &parentLayerId, ServiceTypeFilter serviceType, QgsWkbTypes::GeometryType geometryType, const QString &layerId, const QString &name, const QString &description, const QString &url, bool isParentLayer, const QString &authid, const QString &format )> &visitor, const QVariantMap &serviceData, const QString &parentUrl, const QString &parentSupportedFormats, const ServiceTypeFilter filter = AllTypes );

private:

Expand Down
17 changes: 10 additions & 7 deletions src/providers/arcgisrest/qgsarcgisrestdataitems.cpp
Expand Up @@ -87,13 +87,13 @@ void addServiceItems( QVector< QgsDataItem * > &items, const QVariantMap &servic
const QString &supportedFormats )
{
QgsArcGisRestQueryUtils::visitServiceItems(
[&items, parent, authcfg, headers, supportedFormats]( const QString & name, const QString & url, QgsArcGisRestQueryUtils::ServiceTypeFilter serviceType )
[&items, parent, authcfg, headers, supportedFormats]( const QString & name, const QString & url, const QString & service, QgsArcGisRestQueryUtils::ServiceTypeFilter serviceType )
{
switch ( serviceType )
{
case QgsArcGisRestQueryUtils::Raster:
{
std::unique_ptr< QgsArcGisMapServiceItem > serviceItem = qgis::make_unique< QgsArcGisMapServiceItem >( parent, name, url, url, authcfg, headers );
std::unique_ptr< QgsArcGisMapServiceItem > serviceItem = qgis::make_unique< QgsArcGisMapServiceItem >( parent, name, url, url, authcfg, headers, service );
items.append( serviceItem.release() );
break;
}
Expand All @@ -109,7 +109,7 @@ void addServiceItems( QVector< QgsDataItem * > &items, const QVariantMap &servic
case QgsArcGisRestQueryUtils::AllTypes:
break;
}
}, serviceData, baseUrl, QgsArcGisRestQueryUtils::AllTypes );
}, serviceData, baseUrl );
}

void addLayerItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &parentUrl, const QString &authcfg, const QgsStringMap &headers, QgsDataItem *parent, QgsArcGisRestQueryUtils::ServiceTypeFilter serviceTypeFilter,
Expand Down Expand Up @@ -156,7 +156,7 @@ void addLayerItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceD
layerItems.insert( id, layerItem.release() );
}

}, serviceData, parentUrl, serviceTypeFilter );
}, serviceData, parentUrl, supportedFormats, serviceTypeFilter );

// create groups
for ( auto it = layerItems.constBegin(); it != layerItems.constEnd(); ++it )
Expand Down Expand Up @@ -349,7 +349,7 @@ QVector<QgsDataItem *> QgsArcGisPortalGroupItem::createChildren()
{
items << new QgsArcGisMapServiceItem( this, itemData.value( QStringLiteral( "title" ) ).toString(),
itemData.value( QStringLiteral( "url" ) ).toString(),
itemData.value( QStringLiteral( "url" ) ).toString(), mAuthCfg, mHeaders );
itemData.value( QStringLiteral( "url" ) ).toString(), mAuthCfg, mHeaders, itemData.value( QStringLiteral( "type" ) ).toString().compare( QStringLiteral( "Map Service" ), Qt::CaseInsensitive ) == 0 ? QStringLiteral( "MapServer" ) : QStringLiteral( "ImageServer" ) );
}
}

Expand Down Expand Up @@ -514,11 +514,12 @@ bool QgsArcGisFeatureServiceItem::equal( const QgsDataItem *other )
// QgsArcGisMapServiceItem
//

QgsArcGisMapServiceItem::QgsArcGisMapServiceItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg, const QgsStringMap &headers )
QgsArcGisMapServiceItem::QgsArcGisMapServiceItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg, const QgsStringMap &headers, const QString &serviceType )
: QgsDataCollectionItem( parent, name, path, QStringLiteral( "AMS" ) )
, mBaseUrl( baseUrl )
, mAuthCfg( authcfg )
, mHeaders( headers )
, mServiceType( serviceType )
{
mIconName = QStringLiteral( "mIconDbSchema.svg" );
mCapabilities |= Collapse;
Expand All @@ -544,7 +545,9 @@ QVector<QgsDataItem *> QgsArcGisMapServiceItem::createChildren()
return items;
}

const QString supportedFormats = serviceData.value( QStringLiteral( "supportedImageFormatTypes" ) ).toString();
const QString supportedFormats = mServiceType == QLatin1String( "ImageServer" ) ?
QStringLiteral( "JPGPNG,PNG,PNG8,PNG24,JPG,BMP,GIF,TIFF,PNG32,BIP,BSQ,LERC" ) // ImageServer supported formats
: serviceData.value( QStringLiteral( "supportedImageFormatTypes" ) ).toString();

addFolderItems( items, serviceData, mBaseUrl, mAuthCfg, mHeaders, this, supportedFormats );
addServiceItems( items, serviceData, mBaseUrl, mAuthCfg, mHeaders, this, supportedFormats );
Expand Down
3 changes: 2 additions & 1 deletion src/providers/arcgisrest/qgsarcgisrestdataitems.h
Expand Up @@ -190,7 +190,7 @@ class QgsArcGisMapServiceItem : public QgsDataCollectionItem
{
Q_OBJECT
public:
QgsArcGisMapServiceItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg, const QgsStringMap &headers );
QgsArcGisMapServiceItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg, const QgsStringMap &headers, const QString &serviceType );
QVector<QgsDataItem *> createChildren() override;
bool equal( const QgsDataItem *other ) override;

Expand All @@ -199,6 +199,7 @@ class QgsArcGisMapServiceItem : public QgsDataCollectionItem
QString mBaseUrl;
QString mAuthCfg;
QgsStringMap mHeaders;
QString mServiceType;
};

/**
Expand Down

0 comments on commit 9fb554f

Please sign in to comment.