Skip to content

Commit

Permalink
[arcgis] Browser and source selector should only return appropriate l…
Browse files Browse the repository at this point in the history
…ayer type
  • Loading branch information
nirvn committed Jun 13, 2019
1 parent ffe3c31 commit 9984dc7
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 13 deletions.
4 changes: 2 additions & 2 deletions src/providers/arcgisrest/qgsafsdataitems.cpp
Expand Up @@ -103,7 +103,7 @@ void addServiceItems( QVector< QgsDataItem * > &items, const QVariantMap &servic
{
std::unique_ptr< QgsAfsServiceItem > serviceItem = qgis::make_unique< QgsAfsServiceItem >( parent, name, url, url, authcfg, headers );
items.append( serviceItem.release() );
}, serviceData, baseUrl );
}, serviceData, baseUrl, QgsArcGisRestUtils::Vector );
}

void addLayerItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &parentUrl, const QString &authcfg, const QgsStringMap &headers, QgsDataItem *parent )
Expand All @@ -129,7 +129,7 @@ void addLayerItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceD
layerItems.insert( id, layerItem.release() );
}

}, serviceData, parentUrl );
}, serviceData, parentUrl, QgsArcGisRestUtils::Vector );

// create groups
for ( auto it = layerItems.constBegin(); it != layerItems.constEnd(); ++it )
Expand Down
4 changes: 2 additions & 2 deletions src/providers/arcgisrest/qgsafssourceselect.cpp
Expand Up @@ -82,7 +82,7 @@ bool QgsAfsSourceSelect::connectToService( const QgsOwsConnection &connection )

if ( !visitItemsRecursive( url, nameItem ) )
res = false;
}, serviceInfoMap, baseUrl );
}, serviceInfoMap, baseUrl, QgsArcGisRestUtils::Vector );

QMap< QString, QList<QStandardItem *> > layerItems;
QMap< QString, QString > parents;
Expand Down Expand Up @@ -121,7 +121,7 @@ bool QgsAfsSourceSelect::connectToService( const QgsOwsConnection &connection )

layerItems.insert( layerId, QList<QStandardItem *>() << idItem << nameItem << abstractItem << filterItem );
}
}, serviceInfoMap, baseItemUrl );
}, serviceInfoMap, baseItemUrl, QgsArcGisRestUtils::Vector );

// create layer groups
for ( auto it = layerItems.constBegin(); it != layerItems.constEnd(); ++it )
Expand Down
4 changes: 2 additions & 2 deletions src/providers/arcgisrest/qgsamsdataitems.cpp
Expand Up @@ -104,7 +104,7 @@ void addServiceItems( QVector< QgsDataItem * > &items, const QVariantMap &servic
{
std::unique_ptr< QgsAmsServiceItem > serviceItem = qgis::make_unique< QgsAmsServiceItem >( parent, name, url, url, authcfg, headers );
items.append( serviceItem.release() );
}, serviceData, baseUrl );
}, serviceData, baseUrl, QgsArcGisRestUtils::Raster );
}

void addLayerItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &parentUrl, const QString &authcfg, const QgsStringMap &headers, QgsDataItem *parent )
Expand All @@ -122,7 +122,7 @@ void addLayerItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceD
std::unique_ptr< QgsAmsLayerItem > layerItem = qgis::make_unique< QgsAmsLayerItem >( parent, name, url, id, name, authid, format, authcfg, headers );
layerItems.insert( id, layerItem.release() );

}, serviceData, parentUrl );
}, serviceData, parentUrl, QgsArcGisRestUtils::Raster );

// create groups
for ( auto it = layerItems.constBegin(); it != layerItems.constEnd(); ++it )
Expand Down
4 changes: 2 additions & 2 deletions src/providers/arcgisrest/qgsamssourceselect.cpp
Expand Up @@ -93,7 +93,7 @@ bool QgsAmsSourceSelect::connectToService( const QgsOwsConnection &connection )

if ( !visitItemsRecursive( url, nameItem ) )
res = false;
}, serviceInfoMap, baseUrl );
}, serviceInfoMap, baseUrl, QgsArcGisRestUtils::Raster );

QMap< QString, QList<QStandardItem *> > layerItems;
QMap< QString, QString > parents;
Expand Down Expand Up @@ -123,7 +123,7 @@ bool QgsAmsSourceSelect::connectToService( const QgsOwsConnection &connection )
mAvailableCRS[name] = QList<QString>() << authid;

layerItems.insert( layerId, QList<QStandardItem *>() << idItem << nameItem << abstractItem << filterItem );
}, serviceInfoMap, baseItemUrl );
}, serviceInfoMap, baseItemUrl, QgsArcGisRestUtils::Raster );

// create layer groups
for ( auto it = layerItems.constBegin(); it != layerItems.constEnd(); ++it )
Expand Down
17 changes: 14 additions & 3 deletions src/providers/arcgisrest/qgsarcgisrestutils.cpp
Expand Up @@ -1301,7 +1301,7 @@ void QgsArcGisRestUtils::visitFolderItems( const std::function< void( const QStr
}
}

void QgsArcGisRestUtils::visitServiceItems( const std::function< void( const QString &, const QString & ) > &visitor, const QVariantMap &serviceData, const QString &baseUrl )
void QgsArcGisRestUtils::visitServiceItems( const std::function< void( const QString &, const QString & ) > &visitor, const QVariantMap &serviceData, const QString &baseUrl, const ServiceTypeFilter filter )
{
QString base( baseUrl );
bool baseChecked = false;
Expand All @@ -1313,7 +1313,11 @@ void QgsArcGisRestUtils::visitServiceItems( const std::function< void( const QSt
{
const QVariantMap serviceMap = service.toMap();
const QString serviceType = serviceMap.value( QStringLiteral( "type" ) ).toString();
if ( serviceType != QLatin1String( "MapServer" ) && serviceType != QLatin1String( "FeatureServer" ) && serviceType != QLatin1String( "ImageServer" ) )
if ( serviceType != QLatin1String( "MapServer" ) && serviceType != QLatin1String( "ImageServer" ) && serviceType != QLatin1String( "FeatureServer" ) )
continue;

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

const QString serviceName = serviceMap.value( QStringLiteral( "name" ) ).toString();
Expand All @@ -1328,7 +1332,7 @@ void QgsArcGisRestUtils::visitServiceItems( const std::function< void( const QSt
}
}

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

Expand All @@ -1350,6 +1354,13 @@ void QgsArcGisRestUtils::addLayerItems( const std::function< void( const QString
if ( found )
break;
}
const QStringList capabilities = serviceData.value( QStringLiteral( "capabilities" ) ).toString().split( ',' );

// If the requested layer type is vector, do not show raster-only layers (i.e. non query-able layers)
const bool serviceMayHaveQueryCapability = capabilities.contains( QStringLiteral( "Query" ) ) ||
serviceData.value( QStringLiteral( "serviceDataType" ) ).toString().startsWith( QLatin1String( "esriImageService" ) );
if ( filter == QgsArcGisRestUtils::Vector && !serviceMayHaveQueryCapability )
return;

const QVariantList layerInfoList = serviceData.value( QStringLiteral( "layers" ) ).toList();
for ( const QVariant &layerInfo : layerInfoList )
Expand Down
15 changes: 13 additions & 2 deletions src/providers/arcgisrest/qgsarcgisrestutils.h
Expand Up @@ -51,6 +51,17 @@ class QgsFeatureRenderer;
class QgsArcGisRestUtils
{
public:

/**
* Service types
*/
enum ServiceTypeFilter
{
AllTypes, //!< All types
Vector, //!< Vector type
Raster //!< Raster type
};

static QVariant::Type mapEsriFieldType( const QString &esriFieldType );
static QgsWkbTypes::Type mapEsriGeometryType( const QString &esriGeometryType );
static std::unique_ptr< QgsAbstractGeometry > parseEsriGeoJSON( const QVariantMap &geometryData, const QString &esriGeometryType, bool readM, bool readZ, QgsCoordinateReferenceSystem *crs = nullptr );
Expand Down Expand Up @@ -96,8 +107,8 @@ class QgsArcGisRestUtils
static QUrl parseUrl( const QUrl &url );
static void adjustBaseUrl( QString &baseUrl, const QString name );
static void visitFolderItems( const std::function<void ( const QString &folderName, const QString &url )> &visitor, const QVariantMap &serviceData, const QString &baseUrl );
static void visitServiceItems( const std::function<void ( const QString &serviceName, const QString &url )> &visitor, const QVariantMap &serviceData, const QString &baseUrl );
static void addLayerItems( const std::function<void ( const QString &parentLayerId, 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 );
static void visitServiceItems( const std::function<void ( const QString &serviceName, const QString &url )> &visitor, const QVariantMap &serviceData, const QString &baseUrl, const ServiceTypeFilter filter = QgsArcGisRestUtils::AllTypes );
static void addLayerItems( const std::function<void ( const QString &parentLayerId, 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 = QgsArcGisRestUtils::AllTypes );
};

class QgsArcGisAsyncQuery : public QObject
Expand Down

0 comments on commit 9984dc7

Please sign in to comment.