Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsnominatimgeocoder.h 3 : : --------------- 4 : : Date : December 2020 5 : : Copyright : (C) 2020 by Mathieu Pellerin 6 : : Email : nirvn dot asia at gmail dot com 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : 16 : : #ifndef QGSNOMINATIMGEOCODER_H 17 : : #define QGSNOMINATIMGEOCODER_H 18 : : 19 : : #include "qgis_core.h" 20 : : #include "qgsgeocoder.h" 21 : : 22 : : #include <QMutex> 23 : : 24 : : /** 25 : : * \ingroup core 26 : : * \brief A geocoder which uses the Nominatim geocoding API to retrieve results. 27 : : * 28 : : * This geocoder utilizes the Nominatim geocoding API in order to geocode 29 : : * strings. 30 : : * 31 : : * \warning The user is responsible for respecting the usage policy when 32 : : * using the default OpenStreetMap-run server. 33 : : * 34 : : * \since QGIS 3.18 35 : : */ 36 : 0 : class CORE_EXPORT QgsNominatimGeocoder : public QgsGeocoderInterface 37 : : { 38 : : 39 : : public: 40 : : 41 : : /** 42 : : * Constructor for QgsNominatimGeocoder. 43 : : * 44 : : * Optionally, \a countryCodes can be specified to restrict results to one or more countries. The codes 45 : : * must be in ISO 3166-1alpha2 code and comma-separated. 46 : : * 47 : : * The optional \a endpoint argument can be used to specify a non-default endpoint to use for request. 48 : : */ 49 : : QgsNominatimGeocoder( const QString &countryCodes = QString(), const QString &endpoint = QString() ); 50 : : 51 : : Flags flags() const override; 52 : : QgsFields appendedFields() const override; 53 : : QgsWkbTypes::Type wkbType() const override; 54 : : QList< QgsGeocoderResult > geocodeString( const QString &string, const QgsGeocoderContext &context, QgsFeedback *feedback = nullptr ) const override; 55 : : 56 : : /** 57 : : * Returns the URL generated for geocoding the specified \a address. 58 : : */ 59 : : QUrl requestUrl( const QString &address, const QgsRectangle &bounds = QgsRectangle() ) const; 60 : : 61 : : /** 62 : : * Converts a JSON result returned from the Nominatim service to a geocoder result object. 63 : : */ 64 : : QgsGeocoderResult jsonToResult( const QVariantMap &json ) const; 65 : : 66 : : /** 67 : : * Returns the API endpoint used for requests. 68 : : * 69 : : * \see setEndpoint() 70 : : */ 71 : : QString endpoint() const; 72 : : 73 : : /** 74 : : * Sets a specific API \a endpoint to use for requests. This is for internal testing purposes only. 75 : : * 76 : : * \see endpoint() 77 : : */ 78 : : void setEndpoint( const QString &endpoint ); 79 : : 80 : : /** 81 : : * Returns the number of requests per seconds to the endpoint. 82 : : * 83 : : * \see setRequestsPerSecond() 84 : : */ 85 : : double requestsPerSecond() const { return mRequestsPerSecond; } 86 : : 87 : : /** 88 : : * Sets the \a number of request per seconds to the endpoint. 89 : : * 90 : : * \see requestsPerSecond() 91 : : * \warning Setting this to a value > 1 violates the nomatim terms of service. Only change this value if you are using a self-hosted nomatim service. 92 : : */ 93 : : void setRequestsPerSecond( double number ) { mRequestsPerSecond = number; } 94 : : 95 : : /** 96 : : * Returns the optional region bias which will be used to prioritize results in a certain region. 97 : : * 98 : : * \see setCountryCodes() 99 : : */ 100 : : QString countryCodes() const; 101 : : 102 : : /** 103 : : * Sets the optional \a region bias which will be used to prioritize results in a certain region. 104 : : * 105 : : * The \a region argument must be set to a two letter country code top-level domain value, 106 : : * e.g. "gb" for Great Britain. 107 : : * 108 : : * \see countryCodes() 109 : : */ 110 : : void setCountryCodes( const QString &countryCodes ); 111 : : 112 : : private: 113 : : 114 : : QString mCountryCodes; 115 : : QString mEndpoint; 116 : : double mRequestsPerSecond = 1; 117 : : 118 : : static QMutex sMutex; 119 : : 120 : : static qint64 sLastRequestTimestamp; 121 : : 122 : : }; 123 : : 124 : : #endif // QGSNOMINATIMGEOCODER_H