Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsinterpolator.h 3 : : ------------------------ 4 : : begin : March 10, 2008 5 : : copyright : (C) 2008 by Marco Hugentobler 6 : : email : marco dot hugentobler at karto dot baug dot ethz dot ch 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #ifndef QGSINTERPOLATOR_H 19 : : #define QGSINTERPOLATOR_H 20 : : 21 : : #include <QVector> 22 : : #include <QList> 23 : : 24 : : #include "qgis_sip.h" 25 : : #include "qgis_analysis.h" 26 : : #include "qgscoordinatetransformcontext.h" 27 : : 28 : : class QgsFeatureSource; 29 : : class QgsGeometry; 30 : : class QgsFeedback; 31 : : 32 : : /** 33 : : * Interpolation data for an individual source vertex. 34 : : * \since QGIS 3.0 35 : : */ 36 : : struct ANALYSIS_EXPORT QgsInterpolatorVertexData 37 : : { 38 : : 39 : : /** 40 : : * Constructor for QgsInterpolatorVertexData with the specified 41 : : * \a x, \a y, and \a z coordinate. 42 : : */ 43 : 0 : QgsInterpolatorVertexData( double x, double y, double z ) 44 : 0 : : x( x ) 45 : 0 : , y( y ) 46 : 0 : , z( z ) 47 : 0 : {} 48 : : 49 : : //! Constructor for QgsInterpolatorVertexData 50 : : QgsInterpolatorVertexData() = default; 51 : : 52 : : //! X-coordinate 53 : : double x = 0.0; 54 : : //! Y-coordinate 55 : : double y = 0.0; 56 : : //! Z-coordinate 57 : : double z = 0.0; 58 : : }; 59 : : 60 : : /** 61 : : * \ingroup analysis 62 : : * \brief Interface class for interpolations. 63 : : * 64 : : * Interpolators take 65 : : * the vertices of a vector layer as base data. The z-Value 66 : : * can be an attribute or the z-coordinates in case of 3D types. 67 : : */ 68 : : class ANALYSIS_EXPORT QgsInterpolator 69 : : { 70 : : public: 71 : : 72 : : //! Describes the type of input data 73 : : enum SourceType 74 : : { 75 : : SourcePoints, //!< Point source 76 : : SourceStructureLines, //!< Structure lines 77 : : SourceBreakLines, //!< Break lines 78 : : }; 79 : : 80 : : //! Source for interpolated values from features 81 : : enum ValueSource 82 : : { 83 : : ValueAttribute, //!< Take value from feature's attribute 84 : : ValueZ, //!< Use feature's geometry Z values for interpolation 85 : : ValueM, //!< Use feature's geometry M values for interpolation 86 : : }; 87 : : 88 : : //! Result of an interpolation operation 89 : : enum Result 90 : : { 91 : : Success = 0, //!< Operation was successful 92 : : Canceled, //!< Operation was manually canceled 93 : : InvalidSource, //!< Operation failed due to invalid source 94 : : FeatureGeometryError, //!< Operation failed due to invalid feature geometry 95 : : }; 96 : : 97 : : //! A source together with the information about interpolation attribute / z-coordinate interpolation and the type (point, structure line, breakline) 98 : 0 : struct LayerData 99 : : { 100 : : //! Feature source 101 : 0 : QgsFeatureSource *source = nullptr; 102 : : //! Source for feature values to interpolate 103 : 0 : QgsInterpolator::ValueSource valueSource = QgsInterpolator::ValueAttribute; 104 : : //! Index of feature attribute to use for interpolation 105 : 0 : int interpolationAttribute = -1; 106 : : //! Source type 107 : 0 : QgsInterpolator::SourceType sourceType = SourcePoints; 108 : : 109 : : /** 110 : : * Coordinate transform context. 111 : : * 112 : : * \since QGIS 3.10.1 113 : : */ 114 : : QgsCoordinateTransformContext transformContext; 115 : : }; 116 : : 117 : : QgsInterpolator( const QList<QgsInterpolator::LayerData> &layerData ); 118 : : 119 : 0 : virtual ~QgsInterpolator() = default; 120 : : 121 : : /** 122 : : * Calculates interpolation value for map coordinates x, y 123 : : * \param x x-coordinate (in map units) 124 : : * \param y y-coordinate (in map units) 125 : : * \param result interpolation result 126 : : * \param feedback optional feedback object for progress and cancellation support 127 : : * \returns 0 in case of success 128 : : */ 129 : : virtual int interpolatePoint( double x, double y, double &result SIP_OUT, QgsFeedback *feedback = nullptr ) = 0; 130 : : 131 : : //! \note not available in Python bindings 132 : 0 : QList<LayerData> layerData() const { return mLayerData; } SIP_SKIP 133 : : 134 : : protected: 135 : : 136 : : /** 137 : : * Caches the vertex and value data from the provider. All the vertex data 138 : : * will be held in virtual memory. 139 : : * 140 : : * An optional \a feedback argument may be specified to allow cancellation and 141 : : * progress reports from the cache operation. 142 : : * 143 : : * \returns Success in case of success 144 : : */ 145 : : Result cacheBaseData( QgsFeedback *feedback = nullptr ); 146 : : 147 : : //! Cached vertex data for input sources 148 : : QVector<QgsInterpolatorVertexData> mCachedBaseData; 149 : : 150 : : //! Flag that tells if the cache already has been filled 151 : : bool mDataIsCached = false; 152 : : 153 : : //! Information about the input vector layers and the attributes (or z-values) that are used for interpolation 154 : : QList<LayerData> mLayerData; 155 : : 156 : : private: 157 : : QgsInterpolator() = delete; 158 : : 159 : : /** 160 : : * Helper method that adds the vertices of a geometry to the mCachedBaseData 161 : : * \param geom the geometry 162 : : * \param source source for values to interpolate from the feature 163 : : * \param attributeValue the attribute value for interpolation (if interpolating from attribute value) 164 : : *\returns 0 in case of success 165 : : */ 166 : : bool addVerticesToCache( const QgsGeometry &geom, ValueSource source, double attributeValue ); 167 : : }; 168 : : 169 : : #endif