Skip to content

Commit

Permalink
Merge pull request #58264 from nyalldawson/arcgis_crs
Browse files Browse the repository at this point in the history
[arcgisrest] Don't set crs parameter for new layers
  • Loading branch information
alexbruy authored Aug 6, 2024
2 parents 590c213 + df3710b commit 88bbc4d
Show file tree
Hide file tree
Showing 6 changed files with 118 additions and 78 deletions.
20 changes: 10 additions & 10 deletions src/core/providers/arcgis/qgsarcgisrestquery.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -372,9 +372,9 @@ void QgsArcGisRestQueryUtils::visitServiceItems( const std::function<void ( cons
}
}

void QgsArcGisRestQueryUtils::addLayerItems( const std::function<void ( const QString &, ServiceTypeFilter, Qgis::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 )
void QgsArcGisRestQueryUtils::addLayerItems( const std::function<void ( const QString &, ServiceTypeFilter, Qgis::GeometryType, const QString &, const QString &, const QString &, const QString &, bool, const QgsCoordinateReferenceSystem &, 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();
const QgsCoordinateReferenceSystem crs = QgsArcGisRestUtils::convertSpatialReference( serviceData.value( QStringLiteral( "spatialReference" ) ).toMap() );

bool found = false;
const QList<QByteArray> supportedFormats = QImageReader::supportedImageFormats();
Expand Down Expand Up @@ -417,11 +417,11 @@ void QgsArcGisRestQueryUtils::addLayerItems( const std::function<void ( const QS
{
if ( !layerInfoMap.value( QStringLiteral( "subLayerIds" ) ).toList().empty() )
{
visitor( parentLayerId, ServiceTypeFilter::Raster, Qgis::GeometryType::Unknown, id, name, description, parentUrl + '/' + id, true, QString(), format );
visitor( parentLayerId, ServiceTypeFilter::Raster, Qgis::GeometryType::Unknown, id, name, description, parentUrl + '/' + id, true, QgsCoordinateReferenceSystem(), format );
}
else
{
visitor( parentLayerId, ServiceTypeFilter::Raster, Qgis::GeometryType::Unknown, id, name, description, parentUrl + '/' + id, false, authid, format );
visitor( parentLayerId, ServiceTypeFilter::Raster, Qgis::GeometryType::Unknown, id, name, description, parentUrl + '/' + id, false, crs, format );
}
}

Expand Down Expand Up @@ -450,11 +450,11 @@ void QgsArcGisRestQueryUtils::addLayerItems( const std::function<void ( const QS

if ( !layerInfoMap.value( QStringLiteral( "subLayerIds" ) ).toList().empty() )
{
visitor( parentLayerId, ServiceTypeFilter::Vector, QgsWkbTypes::geometryType( wkbType ), id, name, description, parentUrl + '/' + id, true, QString(), format );
visitor( parentLayerId, ServiceTypeFilter::Vector, QgsWkbTypes::geometryType( wkbType ), id, name, description, parentUrl + '/' + id, true, QgsCoordinateReferenceSystem(), format );
}
else
{
visitor( parentLayerId, ServiceTypeFilter::Vector, QgsWkbTypes::geometryType( wkbType ), id, name, description, parentUrl + '/' + id, false, authid, format );
visitor( parentLayerId, ServiceTypeFilter::Vector, QgsWkbTypes::geometryType( wkbType ), id, name, description, parentUrl + '/' + id, false, crs, format );
}
}
}
Expand All @@ -472,11 +472,11 @@ void QgsArcGisRestQueryUtils::addLayerItems( const std::function<void ( const QS
{
if ( !tableInfoMap.value( QStringLiteral( "subLayerIds" ) ).toList().empty() )
{
visitor( parentLayerId, ServiceTypeFilter::Vector, Qgis::GeometryType::Null, id, name, description, parentUrl + '/' + id, true, QString(), format );
visitor( parentLayerId, ServiceTypeFilter::Vector, Qgis::GeometryType::Null, id, name, description, parentUrl + '/' + id, true, QgsCoordinateReferenceSystem(), format );
}
else
{
visitor( parentLayerId, ServiceTypeFilter::Vector, Qgis::GeometryType::Null, id, name, description, parentUrl + '/' + id, false, authid, format );
visitor( parentLayerId, ServiceTypeFilter::Vector, Qgis::GeometryType::Null, id, name, description, parentUrl + '/' + id, false, crs, format );
}
}
}
Expand All @@ -486,15 +486,15 @@ void QgsArcGisRestQueryUtils::addLayerItems( const std::function<void ( const QS
{
const QString name = QStringLiteral( "(%1)" ).arg( QObject::tr( "All layers" ) );
const QString description = serviceData.value( QStringLiteral( "Comments" ) ).toString();
visitor( nullptr, ServiceTypeFilter::Raster, Qgis::GeometryType::Unknown, nullptr, name, description, parentUrl, false, authid, format );
visitor( nullptr, ServiceTypeFilter::Raster, Qgis::GeometryType::Unknown, nullptr, name, description, parentUrl, false, crs, format );
}

// Add root ImageServer as layer
if ( serviceData.value( QStringLiteral( "serviceDataType" ) ).toString().startsWith( QLatin1String( "esriImageService" ) ) )
{
const QString name = serviceData.value( QStringLiteral( "name" ) ).toString();
const QString description = serviceData.value( QStringLiteral( "description" ) ).toString();
visitor( nullptr, ServiceTypeFilter::Raster, Qgis::GeometryType::Unknown, nullptr, name, description, parentUrl, false, authid, format );
visitor( nullptr, ServiceTypeFilter::Raster, Qgis::GeometryType::Unknown, nullptr, name, description, parentUrl, false, crs, format );
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/core/providers/arcgis/qgsarcgisrestquery.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@

#include "qgis_core.h"
#include "qgsrectangle.h"
#include "qgswkbtypes.h"
#include "qgshttpheaders.h"

#include <QString>
#include <QVariantMap>

class QgsFeedback;
class QNetworkReply;
class QgsCoordinateReferenceSystem;

/**
* \ingroup core
Expand Down Expand Up @@ -109,7 +109,7 @@ class CORE_EXPORT QgsArcGisRestQueryUtils
/**
* 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, Qgis::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 = ServiceTypeFilter::AllTypes );
static void addLayerItems( const std::function<void ( const QString &parentLayerId, ServiceTypeFilter serviceType, Qgis::GeometryType geometryType, const QString &layerId, const QString &name, const QString &description, const QString &url, bool isParentLayer, const QgsCoordinateReferenceSystem &crs, const QString &format )> &visitor, const QVariantMap &serviceData, const QString &parentUrl, const QString &parentSupportedFormats, const ServiceTypeFilter filter = ServiceTypeFilter::AllTypes );

/**
* Parses and processes a \a url.
Expand Down
34 changes: 25 additions & 9 deletions src/providers/arcgisrest/qgsarcgisrestdataitems.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ void addLayerItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceD
QMultiMap< QString, QgsDataItem * > layerItems;
QMap< QString, QString > parents;

QgsArcGisRestQueryUtils::addLayerItems( [parent, &layerItems, &parents, authcfg, headers, urlPrefix, serviceTypeFilter, supportedFormats]( const QString & parentLayerId, QgsArcGisRestQueryUtils::ServiceTypeFilter serviceType, Qgis::GeometryType geometryType, const QString & id, const QString & name, const QString & description, const QString & url, bool isParent, const QString & authid, const QString & format )
QgsArcGisRestQueryUtils::addLayerItems( [parent, &layerItems, &parents, authcfg, headers, urlPrefix, serviceTypeFilter, supportedFormats]( const QString & parentLayerId, QgsArcGisRestQueryUtils::ServiceTypeFilter serviceType, Qgis::GeometryType geometryType, const QString & id, const QString & name, const QString & description, const QString & url, bool isParent, const QgsCoordinateReferenceSystem & crs, const QString & format )
{
Q_UNUSED( description )

Expand All @@ -143,14 +143,14 @@ void addLayerItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceD
switch ( serviceTypeFilter == QgsArcGisRestQueryUtils::ServiceTypeFilter::AllTypes ? serviceType : serviceTypeFilter )
{
case QgsArcGisRestQueryUtils::ServiceTypeFilter::Vector:
layerItem = std::make_unique< QgsArcGisFeatureServiceLayerItem >( parent, name, url, name, authid, authcfg, headers, urlPrefix, geometryType == Qgis::GeometryType::Polygon ? Qgis::BrowserLayerType::Polygon :
layerItem = std::make_unique< QgsArcGisFeatureServiceLayerItem >( parent, url, name, crs, authcfg, headers, urlPrefix, geometryType == Qgis::GeometryType::Polygon ? Qgis::BrowserLayerType::Polygon :
geometryType == Qgis::GeometryType::Line ? Qgis::BrowserLayerType::Line
: geometryType == Qgis::GeometryType::Point ? Qgis::BrowserLayerType::Point :
geometryType == Qgis::GeometryType::Null ? Qgis::BrowserLayerType::TableLayer : Qgis::BrowserLayerType::Vector );
break;

case QgsArcGisRestQueryUtils::ServiceTypeFilter::Raster:
layerItem = std::make_unique< QgsArcGisMapServiceLayerItem >( parent, name, url, id, name, authid, format, authcfg, headers, urlPrefix );
layerItem = std::make_unique< QgsArcGisMapServiceLayerItem >( parent, url, id, name, crs, format, authcfg, headers, urlPrefix );
static_cast< QgsArcGisMapServiceLayerItem * >( layerItem.get() )->setSupportedFormats( supportedFormats );
break;

Expand Down Expand Up @@ -567,15 +567,31 @@ bool QgsArcGisMapServiceItem::equal( const QgsDataItem *other )
return ( type() == other->type() && o && mPath == o->mPath && mName == o->mName );
}

//
// QgsArcGisRestLayerItem
//

QgsArcGisRestLayerItem::QgsArcGisRestLayerItem( QgsDataItem *parent, const QString &url, const QString &title, const QgsCoordinateReferenceSystem &crs, Qgis::BrowserLayerType layerType, const QString &providerId )
: QgsLayerItem( parent, title, url, QString(), layerType, providerId )
, mCrs( crs )
{

}

QgsCoordinateReferenceSystem QgsArcGisRestLayerItem::crs() const
{
return mCrs;
}


//
// QgsArcGisFeatureServiceLayerItem
//

QgsArcGisFeatureServiceLayerItem::QgsArcGisFeatureServiceLayerItem( QgsDataItem *parent, const QString &, const QString &url, const QString &title, const QString &authid, const QString &authcfg, const QgsHttpHeaders &headers, const QString urlPrefix, Qgis::BrowserLayerType geometryType )
: QgsLayerItem( parent, title, url, QString(), geometryType, QStringLiteral( "arcgisfeatureserver" ) )
QgsArcGisFeatureServiceLayerItem::QgsArcGisFeatureServiceLayerItem( QgsDataItem *parent, const QString &url, const QString &title, const QgsCoordinateReferenceSystem &crs, const QString &authcfg, const QgsHttpHeaders &headers, const QString urlPrefix, Qgis::BrowserLayerType geometryType )
: QgsArcGisRestLayerItem( parent, url, title, crs, geometryType, QStringLiteral( "arcgisfeatureserver" ) )
{
mUri = QStringLiteral( "crs='%1' url='%2'" ).arg( authid, url );
mUri = QStringLiteral( "url='%1'" ).arg( url );
if ( !authcfg.isEmpty() )
mUri += QStringLiteral( " authcfg='%1'" ).arg( authcfg );

Expand All @@ -592,11 +608,11 @@ QgsArcGisFeatureServiceLayerItem::QgsArcGisFeatureServiceLayerItem( QgsDataItem
// QgsArcGisMapServiceLayerItem
//

QgsArcGisMapServiceLayerItem::QgsArcGisMapServiceLayerItem( QgsDataItem *parent, const QString &, const QString &url, const QString &id, const QString &title, const QString &authid, const QString &format, const QString &authcfg, const QgsHttpHeaders &headers, const QString &urlPrefix )
: QgsLayerItem( parent, title, url, QString(), Qgis::BrowserLayerType::Raster, QStringLiteral( "arcgismapserver" ) )
QgsArcGisMapServiceLayerItem::QgsArcGisMapServiceLayerItem( QgsDataItem *parent, const QString &url, const QString &id, const QString &title, const QgsCoordinateReferenceSystem &crs, const QString &format, const QString &authcfg, const QgsHttpHeaders &headers, const QString &urlPrefix )
: QgsArcGisRestLayerItem( parent, url, title, crs, Qgis::BrowserLayerType::Raster, QStringLiteral( "arcgismapserver" ) )
{
const QString trimmedUrl = id.isEmpty() ? url : url.left( url.length() - 1 - id.length() ); // trim '/0' from end of url -- AMS provider requires this omitted
mUri = QStringLiteral( "crs='%1' format='%2' layer='%3' url='%4'" ).arg( authid, format, id, trimmedUrl );
mUri = QStringLiteral( "format='%1' layer='%2' url='%3'" ).arg( format, id, trimmedUrl );
if ( !authcfg.isEmpty() )
mUri += QStringLiteral( " authcfg='%1'" ).arg( authcfg );

Expand Down
31 changes: 27 additions & 4 deletions src/providers/arcgisrest/qgsarcgisrestdataitems.h
Original file line number Diff line number Diff line change
Expand Up @@ -231,16 +231,39 @@ class QgsArcGisRestParentLayerItem : public QgsDataItem

};

/**
* Represents a ArcGIS REST layer item.
*/
class QgsArcGisRestLayerItem : public QgsLayerItem
{
Q_OBJECT

public:

QgsArcGisRestLayerItem( QgsDataItem *parent, const QString &url, const QString &title, const QgsCoordinateReferenceSystem &crs,
Qgis::BrowserLayerType layerType, const QString &providerId );

/**
* Returns the CRS for the layer.
*/
QgsCoordinateReferenceSystem crs() const;

private:

QgsCoordinateReferenceSystem mCrs;
};


/**
* Represents a ArcGIS REST "Feature Service" layer item.
*/
class QgsArcGisFeatureServiceLayerItem : public QgsLayerItem
class QgsArcGisFeatureServiceLayerItem : public QgsArcGisRestLayerItem
{
Q_OBJECT

public:

QgsArcGisFeatureServiceLayerItem( QgsDataItem *parent, const QString &name, const QString &url, const QString &title, const QString &authid, const QString &authcfg, const QgsHttpHeaders &headers,
QgsArcGisFeatureServiceLayerItem( QgsDataItem *parent, const QString &url, const QString &title, const QgsCoordinateReferenceSystem &crs, const QString &authcfg, const QgsHttpHeaders &headers,
const QString urlPrefix, Qgis::BrowserLayerType geometryType );

};
Expand All @@ -249,12 +272,12 @@ class QgsArcGisFeatureServiceLayerItem : public QgsLayerItem
* Represents a ArcGIS REST "Map Service" (or "Image Service") layer item.
*/

class QgsArcGisMapServiceLayerItem : public QgsLayerItem
class QgsArcGisMapServiceLayerItem : public QgsArcGisRestLayerItem
{
Q_OBJECT

public:
QgsArcGisMapServiceLayerItem( QgsDataItem *parent, const QString &name, const QString &url, const QString &id, const QString &title, const QString &authid, const QString &format, const QString &authcfg, const QgsHttpHeaders &headers, const QString &urlPrefix );
QgsArcGisMapServiceLayerItem( QgsDataItem *parent, const QString &url, const QString &id, const QString &title, const QgsCoordinateReferenceSystem &crs, const QString &format, const QString &authcfg, const QgsHttpHeaders &headers, const QString &urlPrefix );
void setSupportedFormats( const QString &formats ) { mSupportedFormats = formats; }
QString supportedFormats() const { return mSupportedFormats; }

Expand Down
Loading

0 comments on commit 88bbc4d

Please sign in to comment.