LCOV - code coverage report
Current view: top level - core - qgsremappingproxyfeaturesink.cpp (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 0 111 0.0 %
Date: 2021-03-26 12:19:53 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /***************************************************************************
       2                 :            :                          qgsremappingproxyfeaturesink.cpp
       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                 :            : #include "qgsremappingproxyfeaturesink.h"
      19                 :            : #include "qgslogger.h"
      20                 :            : 
      21                 :          0 : QgsRemappingProxyFeatureSink::QgsRemappingProxyFeatureSink( const QgsRemappingSinkDefinition &mappingDefinition, QgsFeatureSink *sink, bool ownsSink )
      22                 :          0 :   : QgsFeatureSink()
      23                 :          0 :   , mDefinition( mappingDefinition )
      24                 :          0 :   , mSink( sink )
      25                 :          0 :   , mOwnsSink( ownsSink )
      26                 :          0 : {}
      27                 :            : 
      28                 :          0 : QgsRemappingProxyFeatureSink::~QgsRemappingProxyFeatureSink()
      29                 :          0 : {
      30                 :          0 :   if ( mOwnsSink )
      31                 :          0 :     delete mSink;
      32                 :          0 : }
      33                 :            : 
      34                 :          0 : void QgsRemappingProxyFeatureSink::setExpressionContext( const QgsExpressionContext &context )
      35                 :            : {
      36                 :          0 :   mContext = context;
      37                 :          0 : }
      38                 :            : 
      39                 :          0 : void QgsRemappingProxyFeatureSink::setTransformContext( const QgsCoordinateTransformContext &context )
      40                 :            : {
      41                 :          0 :   mTransform = QgsCoordinateTransform( mDefinition.sourceCrs(), mDefinition.destinationCrs(), context );
      42                 :          0 : }
      43                 :            : 
      44                 :          0 : QgsFeatureList QgsRemappingProxyFeatureSink::remapFeature( const QgsFeature &feature ) const
      45                 :            : {
      46                 :          0 :   QgsFeatureList res;
      47                 :            : 
      48                 :          0 :   mContext.setFeature( feature );
      49                 :            : 
      50                 :            :   // remap fields first
      51                 :          0 :   QgsFeature f;
      52                 :          0 :   f.setFields( mDefinition.destinationFields(), true );
      53                 :          0 :   QgsAttributes attributes;
      54                 :          0 :   const QMap< QString, QgsProperty > fieldMap = mDefinition.fieldMap();
      55                 :          0 :   for ( const QgsField &field : mDefinition.destinationFields() )
      56                 :            :   {
      57                 :          0 :     if ( fieldMap.contains( field.name() ) )
      58                 :            :     {
      59                 :          0 :       attributes.append( fieldMap.value( field.name() ).value( mContext ) );
      60                 :          0 :     }
      61                 :            :     else
      62                 :            :     {
      63                 :          0 :       attributes.append( QVariant() );
      64                 :            :     }
      65                 :            :   }
      66                 :          0 :   f.setAttributes( attributes );
      67                 :            : 
      68                 :            :   // make geometries compatible, and reproject if necessary
      69                 :          0 :   if ( feature.hasGeometry() )
      70                 :            :   {
      71                 :          0 :     const QVector< QgsGeometry > geometries = feature.geometry().coerceToType( mDefinition.destinationWkbType() );
      72                 :          0 :     if ( !geometries.isEmpty() )
      73                 :            :     {
      74                 :          0 :       res.reserve( geometries.size() );
      75                 :          0 :       for ( const QgsGeometry &geometry : geometries )
      76                 :            :       {
      77                 :          0 :         QgsFeature featurePart = f;
      78                 :            : 
      79                 :          0 :         QgsGeometry reproject = geometry;
      80                 :            :         try
      81                 :            :         {
      82                 :          0 :           reproject.transform( mTransform );
      83                 :          0 :           featurePart.setGeometry( reproject );
      84                 :          0 :         }
      85                 :            :         catch ( QgsCsException & )
      86                 :            :         {
      87                 :          0 :           QgsLogger::warning( QObject::tr( "Error reprojecting feature geometry" ) );
      88                 :          0 :           featurePart.clearGeometry();
      89                 :          0 :         }
      90                 :          0 :         res << featurePart;
      91                 :          0 :       }
      92                 :          0 :     }
      93                 :            :     else
      94                 :            :     {
      95                 :          0 :       f.clearGeometry();
      96                 :          0 :       res << f;
      97                 :            :     }
      98                 :          0 :   }
      99                 :            :   else
     100                 :            :   {
     101                 :          0 :     res << f;
     102                 :            :   }
     103                 :          0 :   return res;
     104                 :          0 : }
     105                 :            : 
     106                 :          0 : bool QgsRemappingProxyFeatureSink::addFeature( QgsFeature &feature, QgsFeatureSink::Flags flags )
     107                 :            : {
     108                 :          0 :   QgsFeatureList features = remapFeature( feature );
     109                 :          0 :   return mSink->addFeatures( features, flags );
     110                 :          0 : }
     111                 :            : 
     112                 :          0 : bool QgsRemappingProxyFeatureSink::addFeatures( QgsFeatureList &features, QgsFeatureSink::Flags flags )
     113                 :            : {
     114                 :          0 :   bool res = true;
     115                 :          0 :   for ( QgsFeature &f : features )
     116                 :            :   {
     117                 :          0 :     res = addFeature( f, flags ) && res;
     118                 :            :   }
     119                 :          0 :   return res;
     120                 :            : }
     121                 :            : 
     122                 :          0 : bool QgsRemappingProxyFeatureSink::addFeatures( QgsFeatureIterator &iterator, QgsFeatureSink::Flags flags )
     123                 :            : {
     124                 :          0 :   QgsFeature f;
     125                 :          0 :   bool res = true;
     126                 :          0 :   while ( iterator.nextFeature( f ) )
     127                 :            :   {
     128                 :          0 :     res = addFeature( f, flags ) && res;
     129                 :            :   }
     130                 :          0 :   return res;
     131                 :          0 : }
     132                 :            : 
     133                 :          0 : QString QgsRemappingProxyFeatureSink::lastError() const
     134                 :            : {
     135                 :          0 :   return mSink->lastError();
     136                 :            : }
     137                 :            : 
     138                 :          0 : QVariant QgsRemappingSinkDefinition::toVariant() const
     139                 :            : {
     140                 :          0 :   QVariantMap map;
     141                 :          0 :   map.insert( QStringLiteral( "wkb_type" ), mDestinationWkbType );
     142                 :            :   // we only really care about names here
     143                 :          0 :   QVariantList fieldNames;
     144                 :          0 :   for ( const QgsField &field : mDestinationFields )
     145                 :          0 :     fieldNames << field.name();
     146                 :          0 :   map.insert( QStringLiteral( "destination_field_names" ), fieldNames );
     147                 :          0 :   map.insert( QStringLiteral( "transform_source" ), mSourceCrs.toWkt( QgsCoordinateReferenceSystem::WKT_PREFERRED ) );
     148                 :          0 :   map.insert( QStringLiteral( "transform_dest" ), mDestinationCrs.toWkt( QgsCoordinateReferenceSystem::WKT_PREFERRED ) );
     149                 :            : 
     150                 :          0 :   QVariantMap fieldMap;
     151                 :          0 :   for ( auto it = mFieldMap.constBegin(); it != mFieldMap.constEnd(); ++it )
     152                 :            :   {
     153                 :          0 :     fieldMap.insert( it.key(), it.value().toVariant() );
     154                 :          0 :   }
     155                 :          0 :   map.insert( QStringLiteral( "field_map" ), fieldMap );
     156                 :            : 
     157                 :          0 :   return map;
     158                 :          0 : }
     159                 :            : 
     160                 :          0 : bool QgsRemappingSinkDefinition::loadVariant( const QVariantMap &map )
     161                 :            : {
     162                 :          0 :   mDestinationWkbType = static_cast< QgsWkbTypes::Type >( map.value( QStringLiteral( "wkb_type" ), QgsWkbTypes::Unknown ).toInt() );
     163                 :            : 
     164                 :          0 :   const QVariantList fieldNames = map.value( QStringLiteral( "destination_field_names" ) ).toList();
     165                 :          0 :   QgsFields fields;
     166                 :          0 :   for ( const QVariant &field : fieldNames )
     167                 :            :   {
     168                 :          0 :     fields.append( QgsField( field.toString() ) );
     169                 :            :   }
     170                 :          0 :   mDestinationFields = fields;
     171                 :            : 
     172                 :          0 :   mSourceCrs = QgsCoordinateReferenceSystem::fromWkt( map.value( QStringLiteral( "transform_source" ) ).toString() );
     173                 :          0 :   mDestinationCrs = QgsCoordinateReferenceSystem::fromWkt( map.value( QStringLiteral( "transform_dest" ) ).toString() );
     174                 :            : 
     175                 :          0 :   const QVariantMap fieldMap = map.value( QStringLiteral( "field_map" ) ).toMap();
     176                 :          0 :   mFieldMap.clear();
     177                 :          0 :   for ( auto it = fieldMap.constBegin(); it != fieldMap.constEnd(); ++it )
     178                 :            :   {
     179                 :          0 :     QgsProperty p;
     180                 :          0 :     p.loadVariant( it.value() );
     181                 :          0 :     mFieldMap.insert( it.key(), p );
     182                 :          0 :   }
     183                 :            : 
     184                 :            :   return true;
     185                 :          0 : }
     186                 :            : 
     187                 :          0 : bool QgsRemappingSinkDefinition::operator==( const QgsRemappingSinkDefinition &other ) const
     188                 :            : {
     189                 :          0 :   return mDestinationWkbType == other.mDestinationWkbType
     190                 :          0 :          && mDestinationFields == other.mDestinationFields
     191                 :          0 :          && mFieldMap == other.mFieldMap
     192                 :          0 :          && mSourceCrs == other.mSourceCrs
     193                 :          0 :          && mDestinationCrs == other.mDestinationCrs;
     194                 :            : }
     195                 :            : 
     196                 :          0 : bool QgsRemappingSinkDefinition::operator!=( const QgsRemappingSinkDefinition &other ) const
     197                 :            : {
     198                 :          0 :   return !( *this == other );
     199                 :            : }

Generated by: LCOV version 1.14