/
qgsarcgisrestquery.h
152 lines (125 loc) · 6.24 KB
/
qgsarcgisrestquery.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/***************************************************************************
qgsarcgisrestquery.h
--------------------
begin : December 2020
copyright : (C) 2020 by Nyall Dawson
email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSARCGISRESTQUERY_H
#define QGSARCGISRESTQUERY_H
#define SIP_NO_FILE
#include "qgis_core.h"
#include "qgsrectangle.h"
#include <QString>
#include <QVariantMap>
class QgsFeedback;
class QNetworkReply;
/**
* \ingroup core
* Utility functions for querying ArcGIS REST services.
*
* \since QGIS 3.18
*/
class CORE_EXPORT QgsArcGisRestQueryUtils
{
public:
/**
* Service types
*/
enum ServiceTypeFilter
{
AllTypes, //!< All types
Vector, //!< Vector type
Raster //!< Raster type
};
/**
* Retrieves JSON service info for the specified base URL.
*/
static QVariantMap getServiceInfo( const QString &baseurl, const QString &authcfg, QString &errorTitle, QString &errorText, const QMap< QString, QString > &requestHeaders = QMap< QString, QString >() );
/**
* Retrieves JSON layer info for the specified layer URL.
*/
static QVariantMap getLayerInfo( const QString &layerurl, const QString &authcfg, QString &errorTitle, QString &errorText, const QMap< QString, QString > &requestHeaders = QMap< QString, QString >() );
/**
* Retrieves all object IDs for the specified layer URL.
*/
static QVariantMap getObjectIds( const QString &layerurl, const QString &authcfg, QString &errorTitle, QString &errorText, const QMap< QString, QString > &requestHeaders = QMap< QString, QString >(),
const QgsRectangle &bbox = QgsRectangle() );
/**
* Retrieves all matching objects from the specified layer URL.
*/
static QVariantMap getObjects( const QString &layerurl, const QString &authcfg, const QList<quint32> &objectIds, const QString &crs,
bool fetchGeometry, const QStringList &fetchAttributes, bool fetchM, bool fetchZ,
const QgsRectangle &filterRect, QString &errorTitle, QString &errorText, const QgsStringMap &requestHeaders = QgsStringMap(), QgsFeedback *feedback = nullptr );
/**
* Gets a list of object IDs which fall within the specified extent.
*/
static QList<quint32> getObjectIdsByExtent( const QString &layerurl, const QgsRectangle &filterRect, QString &errorTitle, QString &errorText, const QString &authcfg, const QgsStringMap &requestHeaders = QgsStringMap(), QgsFeedback *feedback = nullptr );
/**
* Performs a blocking request to a URL and returns the retrieved data.
*/
static QByteArray queryService( const QUrl &url, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsStringMap &requestHeaders = QgsStringMap(), QgsFeedback *feedback = nullptr, QString *contentType = nullptr );
/**
* Performs a blocking request to a URL and returns the retrieved JSON content.
*/
static QVariantMap queryServiceJSON( const QUrl &url, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsStringMap &requestHeaders = QgsStringMap(), QgsFeedback *feedback = nullptr );
/**
* Calls the specified \a visitor function on all folder items found within the given service data.
*/
static void visitFolderItems( const std::function<void ( const QString &folderName, const QString &url )> &visitor, const QVariantMap &serviceData, const QString &baseUrl );
/**
* 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 )> &visitor, const QVariantMap &serviceData, const QString &baseUrl, const ServiceTypeFilter filter = AllTypes );
/**
* 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, 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 );
private:
static QUrl parseUrl( const QUrl &url );
static void adjustBaseUrl( QString &baseUrl, const QString name );
friend class TestQgsArcGisRestUtils;
};
///@cond PRIVATE
class CORE_EXPORT QgsArcGisAsyncQuery : public QObject
{
Q_OBJECT
public:
QgsArcGisAsyncQuery( QObject *parent = nullptr );
~QgsArcGisAsyncQuery() override;
void start( const QUrl &url, const QString &authCfg, QByteArray *result, bool allowCache = false, const QgsStringMap &headers = QgsStringMap() );
signals:
void finished();
void failed( QString errorTitle, QString errorName );
private slots:
void handleReply();
private:
QNetworkReply *mReply = nullptr;
QByteArray *mResult = nullptr;
};
class CORE_EXPORT QgsArcGisAsyncParallelQuery : public QObject
{
Q_OBJECT
public:
QgsArcGisAsyncParallelQuery( const QString &authcfg, const QgsStringMap &requestHeaders, QObject *parent = nullptr );
void start( const QVector<QUrl> &urls, QVector<QByteArray> *results, bool allowCache = false );
signals:
void finished( QStringList errors );
private slots:
void handleReply();
private:
QVector<QByteArray> *mResults = nullptr;
int mPendingRequests = 0;
QStringList mErrors;
QString mAuthCfg;
QgsStringMap mRequestHeaders;
};
///@endcond
#endif // QGSARCGISRESTQUERY_H