Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsremappingproxyfeaturesink.h 3 : : ---------------------- 4 : : begin : April 2020 5 : : copyright : (C) 2020 by Nyall Dawson 6 : : email : nyall dot dawson at gmail dot com 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 QGSREMAPPINGPROXYFEATURESINK_H 19 : : #define QGSREMAPPINGPROXYFEATURESINK_H 20 : : 21 : : #include "qgis_core.h" 22 : : #include "qgis.h" 23 : : #include "qgsfeaturesink.h" 24 : : #include "qgsproperty.h" 25 : : 26 : : /** 27 : : * \class QgsRemappingSinkDefinition 28 : : * \ingroup core 29 : : * \brief Defines the parameters used to remap features when creating a QgsRemappingProxyFeatureSink. 30 : : * 31 : : * The definition includes parameters required to correctly map incoming features to the structure 32 : : * of the destination sink, e.g. information about how to create output field values and how to transform 33 : : * geometries to match the destination CRS. 34 : : * 35 : : * \since QGIS 3.14 36 : : */ 37 : 0 : class CORE_EXPORT QgsRemappingSinkDefinition 38 : : { 39 : : public: 40 : : 41 : : /** 42 : : * Returns the field mapping, which defines how to map the values from incoming features to destination 43 : : * field values. 44 : : * 45 : : * Field values are mapped using a QgsProperty source object, which allows either direct field value to field value 46 : : * mapping or use of QgsExpression expressions to transform values to the destination field. 47 : : * 48 : : * \see setFieldMap() 49 : : * \see addMappedField() 50 : : */ 51 : 0 : QMap< QString, QgsProperty > fieldMap() const { return mFieldMap; } 52 : : 53 : : /** 54 : : * Sets the field mapping, which defines how to map the values from incoming features to destination 55 : : * field values. 56 : : * 57 : : * Field values are mapped using a QgsProperty source object, which allows either direct field value to field value 58 : : * mapping or use of QgsExpression expressions to transform values to the destination field. 59 : : * 60 : : * \see fieldMap() 61 : : * \see addMappedField() 62 : : */ 63 : : void setFieldMap( const QMap< QString, QgsProperty > &map ) { mFieldMap = map; } 64 : : 65 : : /** 66 : : * Adds a mapping for a destination field. 67 : : * 68 : : * Field values are mapped using a QgsProperty source object, which allows either direct field value to field value 69 : : * mapping or use of QgsExpression expressions to transform values to the destination field. 70 : : * 71 : : * \see setFieldMap() 72 : : * \see fieldMap() 73 : : */ 74 : : void addMappedField( const QString &destinationField, const QgsProperty &property ) { mFieldMap.insert( destinationField, property ); } 75 : : 76 : : /** 77 : : * Returns the source CRS used for reprojecting incoming features to the sink's destination CRS. 78 : : * 79 : : * \see setSourceCrs() 80 : : */ 81 : 0 : QgsCoordinateReferenceSystem sourceCrs() const { return mSourceCrs; } 82 : : 83 : : /** 84 : : * Sets the \a source crs used for reprojecting incoming features to the sink's destination CRS. 85 : : * 86 : : * \see sourceCrs() 87 : : */ 88 : : void setSourceCrs( const QgsCoordinateReferenceSystem &source ) { mSourceCrs = source; } 89 : : 90 : : /** 91 : : * Returns the destination CRS used for reprojecting incoming features to the sink's destination CRS. 92 : : * 93 : : * \see setDestinationCrs() 94 : : */ 95 : 0 : QgsCoordinateReferenceSystem destinationCrs() const { return mDestinationCrs; } 96 : : 97 : : /** 98 : : * Sets the \a destination crs used for reprojecting incoming features to the sink's destination CRS. 99 : : * 100 : : * \see destinationCrs() 101 : : */ 102 : 0 : void setDestinationCrs( const QgsCoordinateReferenceSystem &destination ) { mDestinationCrs = destination; } 103 : : 104 : : /** 105 : : * Returns the WKB geometry type for the destination. 106 : : * 107 : : * \see setDestinationWkbType() 108 : : */ 109 : 0 : QgsWkbTypes::Type destinationWkbType() const { return mDestinationWkbType; } 110 : : 111 : : /** 112 : : * Sets the WKB geometry \a type for the destination. 113 : : * 114 : : * \see setDestinationWkbType() 115 : : */ 116 : 0 : void setDestinationWkbType( QgsWkbTypes::Type type ) { mDestinationWkbType = type; } 117 : : 118 : : /** 119 : : * Returns the fields for the destination sink. 120 : : * 121 : : * \see setDestinationFields() 122 : : */ 123 : 0 : QgsFields destinationFields() const { return mDestinationFields; } 124 : : 125 : : /** 126 : : * Sets the \a fields for the destination sink. 127 : : * 128 : : * \see destinationFields() 129 : : */ 130 : 0 : void setDestinationFields( const QgsFields &fields ) { mDestinationFields = fields; } 131 : : 132 : : /** 133 : : * Saves this remapping definition to a QVariantMap, wrapped in a QVariant. 134 : : * You can use QgsXmlUtils::writeVariant to save it to an XML document. 135 : : * \see loadVariant() 136 : : */ 137 : : QVariant toVariant() const; 138 : : 139 : : /** 140 : : * Loads this remapping definition from a QVariantMap, wrapped in a QVariant. 141 : : * You can use QgsXmlUtils::readVariant to load it from an XML document. 142 : : * \see toVariant() 143 : : */ 144 : : bool loadVariant( const QVariantMap &map ); 145 : : 146 : : bool operator==( const QgsRemappingSinkDefinition &other ) const; 147 : : bool operator!=( const QgsRemappingSinkDefinition &other ) const; 148 : : 149 : : private: 150 : : 151 : : QMap< QString, QgsProperty > mFieldMap; 152 : : 153 : : QgsCoordinateReferenceSystem mSourceCrs; 154 : : QgsCoordinateReferenceSystem mDestinationCrs; 155 : : 156 : 0 : QgsWkbTypes::Type mDestinationWkbType = QgsWkbTypes::Unknown; 157 : : 158 : : QgsFields mDestinationFields; 159 : : 160 : : }; 161 : : 162 : 5 : Q_DECLARE_METATYPE( QgsRemappingSinkDefinition ) 163 : : 164 : : 165 : : 166 : : /** 167 : : * \class QgsRemappingProxyFeatureSink 168 : : * \ingroup core 169 : : * \brief A QgsFeatureSink which proxies incoming features to a destination feature sink, after applying 170 : : * transformations and field value mappings. 171 : : * 172 : : * This sink allows for transformation of incoming features to match the requirements of storing 173 : : * in an existing destination layer, e.g. by reprojecting the features to the destination's CRS 174 : : * and by coercing geometries to the format required by the destination sink. 175 : : * 176 : : * \since QGIS 3.14 177 : : */ 178 : : class CORE_EXPORT QgsRemappingProxyFeatureSink : public QgsFeatureSink 179 : : { 180 : : public: 181 : : 182 : : #ifndef SIP_RUN 183 : : 184 : : /** 185 : : * Constructor for QgsRemappingProxyFeatureSink, using the specified \a mappingDefinition 186 : : * to manipulate features before sending them to the destination \a sink. 187 : : * 188 : : * Ownership of \a sink is dictated by \a ownsSink. If \a ownsSink is FALSE, 189 : : * ownership is not transferred, and callers must ensure that \a sink exists for the lifetime of this object. 190 : : * If \a ownsSink is TRUE, then this object will take ownership of \a sink. 191 : : */ 192 : : QgsRemappingProxyFeatureSink( const QgsRemappingSinkDefinition &mappingDefinition, QgsFeatureSink *sink, bool ownsSink = false ); 193 : : #else 194 : : 195 : : /** 196 : : * Constructor for QgsRemappingProxyFeatureSink, using the specified \a mappingDefinition 197 : : * to manipulate features before sending them to the destination \a sink. 198 : : */ 199 : : QgsRemappingProxyFeatureSink( const QgsRemappingSinkDefinition &mappingDefinition, QgsFeatureSink *sink ); 200 : : #endif 201 : : 202 : : ~QgsRemappingProxyFeatureSink() override; 203 : : 204 : : /** 205 : : * Sets the expression \a context to use when evaluating mapped field values. 206 : : */ 207 : : void setExpressionContext( const QgsExpressionContext &context ); 208 : : 209 : : /** 210 : : * Sets the transform \a context to use when reprojecting features. 211 : : */ 212 : : void setTransformContext( const QgsCoordinateTransformContext &context ); 213 : : 214 : : /** 215 : : * Remaps a \a feature to a set of features compatible with the destination sink. 216 : : */ 217 : : QgsFeatureList remapFeature( const QgsFeature &feature ) const; 218 : : 219 : : bool addFeature( QgsFeature &feature, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() ) override; 220 : : bool addFeatures( QgsFeatureList &features, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() ) override; 221 : : bool addFeatures( QgsFeatureIterator &iterator, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() ) override; 222 : : QString lastError() const override; 223 : : 224 : : /** 225 : : * Returns the destination QgsFeatureSink which the proxy will forward features to. 226 : : */ 227 : : QgsFeatureSink *destinationSink() { return mSink; } 228 : : 229 : : private: 230 : : 231 : : QgsRemappingSinkDefinition mDefinition; 232 : : QgsCoordinateTransform mTransform; 233 : : QgsFeatureSink *mSink = nullptr; 234 : : mutable QgsExpressionContext mContext; 235 : : bool mOwnsSink = false; 236 : : }; 237 : : 238 : : #endif // QGSREMAPPINGPROXYFEATURESINK_H 239 : : 240 : : 241 : : 242 : :