File indexing completed on 2024-12-01 10:29:54
0001 /* 0002 SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #ifndef OSM_OVERPASSQUERY_H 0008 #define OSM_OVERPASSQUERY_H 0009 0010 #include "datatypes.h" 0011 0012 #include <QObject> 0013 #include <QRectF> 0014 0015 class QNetworkReply; 0016 0017 namespace OSM { 0018 0019 /** An Overpass QL query job, to be executed by OverpassQueryManager. 0020 * @note Use this wrongly can cause excessive load on Overpass servers, 0021 * so only use this when you know what you are doing! 0022 */ 0023 class OverpassQuery : public QObject 0024 { 0025 Q_OBJECT 0026 public: 0027 explicit OverpassQuery(QObject *parent = nullptr); 0028 ~OverpassQuery() override; 0029 0030 /** Returns the raw (without bbox replacement) query string. */ 0031 QString query() const; 0032 /** Returns the query with @p bbox applied. */ 0033 QString query(const QRectF &bbox) const; 0034 /** Overpass QL query string. 0035 * Can contain the '{{bbox}}' bounding box placeholder also supported by Overpass Turbo. 0036 */ 0037 void setQuery(const QString &query); 0038 0039 /** Bounding box for this query, values in degree. */ 0040 QRectF boundingBox() const; 0041 /** Set the bounding box for this query, values in degree. */ 0042 void setBoundingBox(const QRectF &bbox); 0043 0044 /** Tile size in which the bounding box is broken down for querying. 0045 * Values in degree. 0046 */ 0047 QSizeF tileSize() const; 0048 /** Sets the tile size in which the bounding box is broken down for querying. 0049 * Values in degree. 0050 */ 0051 void setTileSize(const QSizeF &tileSize); 0052 /** Minimum tile size to which tiles can be broken down in case of query timeouts. */ 0053 QSizeF minimumTileSize() const; 0054 /** Sets the minimum tile size. 0055 * Should be smaller than tile size by a power of 2. 0056 */ 0057 void setMinimumTileSize(const QSizeF &minTileSize); 0058 0059 /** Error codes. */ 0060 enum Error { 0061 NoError, 0062 QueryError, ///< generic query error 0063 QueryTimeout, ///< query exceeded its execution time budget 0064 NetworkError, 0065 }; 0066 /** Error code of this query job. */ 0067 Error error() const; 0068 0069 /** Query result data set. */ 0070 const DataSet& result() const; 0071 DataSet&& takeResult(); 0072 0073 Q_SIGNALS: 0074 void finished(); 0075 0076 private: 0077 friend class OverpassQueryManager; 0078 friend class OverpassQueryManagerPrivate; 0079 0080 Error processReply(QNetworkReply *reply); 0081 0082 QString m_query; 0083 QRectF m_bbox = { -180.0, -90.0, 360.0, 180.0 }; 0084 QSizeF m_tileSize = { 360.0, 180.0 }; 0085 QSizeF m_minimumTileSize = { 1.0, 1.0 }; 0086 Error m_error = NoError; 0087 OSM::DataSet m_result; 0088 }; 0089 0090 } 0091 0092 #endif // OSM_OVERPASSQUERY_H