File indexing completed on 2024-04-21 03:49:49
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2023 Torsten Rahn <rahn@kde.org> 0004 // 0005 0006 #ifndef OWSSERVICEMANAGER_H 0007 #define OWSSERVICEMANAGER_H 0008 0009 #include <QObject> 0010 #include <QNetworkAccessManager> 0011 #include <QImage> 0012 #include <QDomDocument> 0013 0014 class QNetworkReply; 0015 0016 namespace Marble 0017 { 0018 0019 enum OwsServiceType { 0020 NoOwsType, 0021 WmsType, 0022 WmtsType, 0023 WfsType, 0024 WcsType 0025 }; 0026 0027 enum OwsCapabilitiesStatus { 0028 OwsCapabilitiesNone, 0029 OwsCapabilitiesSuccess, 0030 OwsCapabilitiesNoOwsServer, 0031 OwsCapabilitiesReplyUnreadable, 0032 OwsCapabilitiesFailed 0033 }; 0034 0035 0036 enum WmsImageStatus { 0037 WmsImageNone, 0038 WmsImageSuccess, 0039 WmsImageFailed, 0040 WmsImageFailedServerMessage 0041 }; 0042 0043 class OwsMappingCapabilities { 0044 0045 public: 0046 OwsMappingCapabilities(); 0047 0048 void setVersion(const QString& version); 0049 QString version() const; // "1.1.1" or "1.3.0" 0050 0051 void setTitle(const QString& title); 0052 QString title() const; 0053 0054 void setAbstract(const QString& abstract); 0055 QString abstract() const; 0056 0057 QStringList layers() const; 0058 0059 QString title(const QString& layer); 0060 QString abstract(const QString& layer); 0061 QString style(const QString& layer); 0062 0063 void setOwsLayerMetaInfo(const QMap<QString, QStringList>& wmsLayerMetaInfo); 0064 QMap<QString, QStringList> owsLayerMetaInfo() const; 0065 0066 protected: 0067 QString m_version; 0068 QString m_title; 0069 QString m_abstract; 0070 0071 QMap<QString, QStringList> m_owsLayerMetaInfo; // layerName -> Title, Abstract, LegendUrl, Style 0072 }; 0073 0074 class WmsCapabilities : public OwsMappingCapabilities { 0075 0076 public: 0077 WmsCapabilities(); 0078 0079 0080 void setContactInformation(const QString& info); 0081 QString contactInformation() const; 0082 0083 void setFees(const QString& fee); 0084 QString fees() const; 0085 0086 QStringList projections(const QString& layer); 0087 QString boundingBox(const QString& layer, const QString& projection); 0088 QString legendUrl(const QString& layer); 0089 QStringList styles(const QStringList& layers); 0090 QString boundingBoxNSEWDegrees(const QStringList& layers, const QString& projection); 0091 0092 void setReferenceSystemType(const QString& refSystem); 0093 QString referenceSystemType() const; // SRS (1.1.1) or CRS (1.3.0) 0094 0095 void setWmsLayerCoordinateSystems(const QMap<QString, QMap<QString, QString>>& wmsLayerCoordinateSystems); 0096 QMap<QString, QMap<QString, QString>> wmsLayerCoordinateSystems() const; 0097 0098 void setFormats(const QStringList& formats); 0099 QStringList formats(); 0100 0101 QString m_referenceSystemType; 0102 0103 QString m_contactInformation; 0104 QString m_fees; 0105 0106 QMap<QString, QMap<QString, QString>> m_wmsLayerCoordinateSystems; // layerId -> epsg -> bbox 0107 0108 QStringList m_formats; // png, jpg, ... 0109 }; 0110 0111 class WmtsCapabilities : public OwsMappingCapabilities { 0112 0113 public: 0114 WmtsCapabilities(); 0115 0116 void setWmtsTileMatrixSets(const QMap<QString, QStringList> & wmtsTileMatrixSets); 0117 QMap<QString, QStringList> wmtsTileMatrixSets() const; 0118 void setWmtsTileResource(const QMap<QString, QMap<QString, QString>> & wmtsTileResource); 0119 QMap<QString, QMap<QString, QString>> wmtsTileResource() const; 0120 0121 QMap<QString, QStringList> m_wmtsTileMatrixSets; // layerId -> TileMatrixSets 0122 QMap<QString, QMap<QString, QString>> m_wmtsTileResource; // layerId -> Format -> RessourceUrl 0123 }; 0124 0125 enum ImageResultType { 0126 GenericImage, 0127 LevelZeroTile, 0128 PreviewImage, 0129 LegendImage 0130 }; 0131 0132 class ImageRequestResult { 0133 0134 public: 0135 ImageRequestResult(); 0136 0137 void setImageStatus(WmsImageStatus imageStatus); 0138 WmsImageStatus imageStatus() const; 0139 0140 void setResultImage(const QImage& image); 0141 QImage resultImage() const; 0142 0143 void setResultRaw(const QByteArray& resultRaw); 0144 QByteArray resultRaw() const; 0145 0146 void setResultFormat(const QString& resultFormat); 0147 QString resultFormat() const; 0148 0149 void setResultType(const ImageResultType); 0150 ImageResultType resultType() const; 0151 0152 private: 0153 WmsImageStatus m_imageStatus; 0154 QImage m_resultImage; 0155 QByteArray m_resultRaw; 0156 QString m_resultFormat; 0157 ImageResultType m_resultType; 0158 }; 0159 0160 class OwsServiceManager : public QObject 0161 { 0162 Q_OBJECT 0163 public: 0164 explicit OwsServiceManager(QObject *parent = nullptr); 0165 0166 public Q_SLOTS: 0167 void queryOwsCapabilities(const QUrl& queryUrl, const QString& serviceString = "WMS"); 0168 void queryWmsMap(const QUrl& url, const QString& layers, const QString& projection, 0169 const QString& bbox, const QString& format, const QString& styles = QString()); 0170 void queryWmsLevelZeroTile(const QUrl& url, const QString &layers, const QString &projection, 0171 const QString &format, const QString &styles = QString()); 0172 void queryWmsPreviewImage(const QUrl& url, const QString &layers, const QString &projection, 0173 const QString &format, const QString &styles = QString()); 0174 void queryWmsLegendImage(const QUrl& url); 0175 0176 void queryWmtsLevelZeroTile(const QString& url, const QString& style, const QString& tileMatrixSet); 0177 void queryWmtsPreviewImage(const QString& url, const QString& style, const QString& tileMatrixSet); 0178 void queryWmtsTile(const QString& url, const QString& style, const QString& tileMatrixSet, 0179 const QString& tileMatrix, const QString& tileRow, const QString& tileCol); 0180 0181 void queryXYZPreviewImage(const QString& urlString); 0182 void queryXYZLevelZeroTile(const QString& urlString); 0183 void queryXYZImage(const QString urlString); 0184 0185 void handleAuthentication(QNetworkReply *reply, QAuthenticator *authenticator); 0186 0187 void setCapabilitiesStatus(OwsCapabilitiesStatus capabilitiesStatus); 0188 OwsCapabilitiesStatus capabilitiesStatus() const; 0189 0190 OwsServiceType owsServiceType(); 0191 WmsCapabilities wmsCapabilities(); 0192 WmtsCapabilities wmtsCapabilities(); 0193 ImageRequestResult imageRequestResult(); 0194 0195 QImage resultImage(); 0196 QByteArray resultRaw(); 0197 QString resultFormat(); 0198 ImageResultType resultType(); 0199 0200 Q_SIGNALS: 0201 void wmsCapabilitiesReady(); 0202 void wmtsCapabilitiesReady(); 0203 void imageRequestResultReady(); 0204 0205 private Q_SLOTS: 0206 void parseOwsCapabilities(QNetworkReply* reply); 0207 void parseWmsCapabilities(QNetworkReply* reply); 0208 void parseWmtsCapabilities(QNetworkReply* reply); 0209 void parseImageResult(QNetworkReply* reply); 0210 0211 private: 0212 QUrl m_url; 0213 QDomDocument m_xml; 0214 QNetworkAccessManager m_capabilitiesAccessManager; 0215 QNetworkAccessManager m_imageAccessManager; 0216 OwsCapabilitiesStatus m_capabilitiesStatus; 0217 OwsServiceType m_owsServiceType; 0218 WmsCapabilities m_wmsCapabilities; 0219 WmtsCapabilities m_wmtsCapabilities; 0220 ImageRequestResult m_imageRequestResult; 0221 }; 0222 0223 } 0224 0225 #endif // OWSSERVICEMANAGER_H