QGIS API Documentation 3.41.0-Master (af5edcb665c)
Loading...
Searching...
No Matches
qgsvectordataprovider.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsvectordataprovider.cpp - DataProvider Interface for vector layers
3 --------------------------------------
4 Date : 26-Oct-2004
5 Copyright : (C) 2004 by Marco Hugentobler
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#include <QTextCodec>
17
18#include <limits>
19
21#include "moc_qgsvectordataprovider.cpp"
22#include "qgscircularstring.h"
23#include "qgscompoundcurve.h"
24#include "qgsfeature.h"
25#include "qgsfeatureiterator.h"
26#include "qgsfeaturerequest.h"
27#include "qgsfeedback.h"
28#include "qgsfields.h"
29#include "qgsgeometry.h"
31#include "qgsgeometryfactory.h"
32#include "qgslogger.h"
33#include "qgsmessagelog.h"
35#include "qgsthreadingutils.h"
36#include <mutex>
38
41 : QgsDataProvider( uri, options, flags )
42 , mTemporalCapabilities( std::make_unique< QgsVectorDataProviderTemporalCapabilities >() )
43 , mElevationProperties( std::make_unique< QgsDataProviderElevationProperties >() )
44{
45}
46
48{
50
51 return QStringLiteral( "Generic vector file" );
52}
53
55{
57
58 QgsFeature f;
59 QgsFeatureRequest request;
60 request.setNoAttributes();
62 request.setLimit( 1 );
63 if ( getFeatures( request ).nextFeature( f ) )
64 return false;
65 else
66 return true;
67}
68
75
82
92
99
106
113
115{
117
118 return QString();
119}
120
122{
124
125 Q_UNUSED( flist )
126 Q_UNUSED( flags )
127 return false;
128}
129
131{
133
134 return mErrors.isEmpty() ? QString() : mErrors.last();
135}
136
138{
140
141 Q_UNUSED( ids )
142 return false;
143}
144
146{
148
150 return false;
151
152 QgsFeatureIds toDelete;
154 QgsFeature f;
155 while ( it.nextFeature( f ) )
156 toDelete << f.id();
157
158 return deleteFeatures( toDelete );
159}
160
161bool QgsVectorDataProvider::addAttributes( const QList<QgsField> &attributes )
162{
164
165 Q_UNUSED( attributes )
166 return false;
167}
168
170{
172
173 Q_UNUSED( attributes )
174 return false;
175}
176
178{
180
181 Q_UNUSED( renamedAttributes )
182 return false;
183}
184
186{
188
189 Q_UNUSED( attr_map )
190 return false;
191}
192
193QVariant QgsVectorDataProvider::defaultValue( int fieldId ) const
194{
196
197 Q_UNUSED( fieldId )
198 return QVariant();
199}
200
201QString QgsVectorDataProvider::defaultValueClause( int fieldIndex ) const
202{
204
205 Q_UNUSED( fieldIndex )
206 return QString();
207}
208
210{
212
213 const QgsFields f = fields();
214 if ( fieldIndex < 0 || fieldIndex >= f.count() )
216
217 return f.at( fieldIndex ).constraints().constraints();
218}
219
221{
223
224 return false;
225}
226
228{
230
231 Q_UNUSED( geometry_map )
232 return false;
233}
234
236 const QgsGeometryMap &geometry_map )
237{
239
241 return false;
242
243 bool result = true;
244 result = result && changeAttributeValues( attr_map );
245 result = result && changeGeometryValues( geometry_map );
246 return result;
247}
248
255
257{
259
260 Q_UNUSED( field )
261 return true;
262}
263
270
272{
274
275 // Use UTF-8 if no encoding is specified
276 if ( e.isEmpty() )
277 {
278 mEncoding = QTextCodec::codecForName( "UTF-8" );
279 }
280 else
281 {
282 mEncoding = QTextCodec::codecForName( e.toLocal8Bit().constData() );
283 }
284 if ( !mEncoding && e != QLatin1String( "System" ) )
285 {
286 if ( !e.isEmpty() )
287 {
288 // can we use the OGR proxy codec?
289 if ( QgsOgrProxyTextCodec::supportedCodecs().contains( e, Qt::CaseInsensitive ) )
290 {
291 //from the Qt docs (https://doc.qt.io/qt-5/qtextcodec.html#QTextCodec-1)
292 // "The QTextCodec should always be constructed on the heap (i.e. with new).
293 // Qt takes ownership and will delete it when the application terminates."
294 mEncoding = new QgsOgrProxyTextCodec( e.toLocal8Bit() );
295 }
296 else
297 {
298 QgsMessageLog::logMessage( tr( "Codec %1 not found. Falling back to system locale" ).arg( e ) );
299 mEncoding = QTextCodec::codecForName( "System" );
300 }
301 }
302 }
303
304 if ( !mEncoding )
305 mEncoding = QTextCodec::codecForLocale();
306
307 Q_ASSERT( mEncoding );
308}
309
311{
313
314 if ( mEncoding )
315 {
316 return mEncoding->name();
317 }
318
319 return QString();
320}
321
323{
325
326 QStringList abilitiesList;
327
329
331 {
332 abilitiesList += tr( "Add Features" );
333 }
334
336 {
337 abilitiesList += tr( "Delete Features" );
338 }
339
341 {
342 abilitiesList += tr( "Change Attribute Values" );
343 }
344
346 {
347 abilitiesList += tr( "Add Attributes" );
348 }
349
351 {
352 abilitiesList += tr( "Delete Attributes" );
353 }
354
356 {
357 abilitiesList += tr( "Rename Attributes" );
358 }
359
361 {
362 // TODO: Tighten up this test. See QgsOgrProvider for details.
363 abilitiesList += tr( "Create Spatial Index" );
364 }
365
367 {
368 abilitiesList += tr( "Create Attribute Indexes" );
369 }
370
372 {
373 abilitiesList += tr( "Fast Access to Features at ID" );
374 }
375
377 {
378 abilitiesList += tr( "Change Geometries" );
379 }
380
382 {
383 abilitiesList += tr( "Presimplify Geometries" );
384 }
385
387 {
388 abilitiesList += tr( "Presimplify Geometries with Validity Check" );
389 }
390
392 {
393 abilitiesList += tr( "Simultaneous Geometry and Attribute Updates" );
394 }
395
397 {
398 abilitiesList += tr( "Transactions" );
399 }
400
402 {
403 abilitiesList += tr( "Curved Geometries" );
404 }
405
407 {
408 abilitiesList += tr( "Feature Symbology" );
409 }
410
411 return abilitiesList.join( QLatin1String( ", " ) );
412}
413
418
419int QgsVectorDataProvider::fieldNameIndex( const QString &fieldName ) const
420{
422
423 return fields().lookupField( fieldName );
424}
425
426QMap<QString, int> QgsVectorDataProvider::fieldNameMap() const
427{
429
430 QMap<QString, int> resultMap;
431
432 const QgsFields fieldsCopy = fields();
433 for ( int i = 0; i < fieldsCopy.count(); ++i )
434 {
435 resultMap.insert( fieldsCopy.at( i ).name(), i );
436 }
437
438 return resultMap;
439}
440
447
454
456{
458
459 return QString();
460}
461
462QList<QgsVectorDataProvider::NativeType> QgsVectorDataProvider::nativeTypes() const
463{
465
466 return mNativeTypes;
467}
468
475
477{
479
480 QgsDebugMsgLevel( QStringLiteral( "field name = %1 type = %2 length = %3 precision = %4" )
481 .arg( field.name(),
482 QVariant::typeToName( field.type() ) )
483 .arg( field.length() )
484 .arg( field.precision() ), 2 );
485
486 for ( const NativeType &nativeType : mNativeTypes )
487 {
488 QgsDebugMsgLevel( QStringLiteral( "native field type = %1 min length = %2 max length = %3 min precision = %4 max precision = %5" )
489 .arg( QVariant::typeToName( nativeType.mType ) )
490 .arg( nativeType.mMinLen )
491 .arg( nativeType.mMaxLen )
492 .arg( nativeType.mMinPrec )
493 .arg( nativeType.mMaxPrec ), 2 );
494
495 if ( field.type() != nativeType.mType )
496 continue;
497
498 if ( field.length() > 0 )
499 {
500 // source length limited
501 if ( ( nativeType.mMinLen > 0 && field.length() < nativeType.mMinLen ) ||
502 ( nativeType.mMaxLen > 0 && field.length() > nativeType.mMaxLen ) )
503 {
504 // source length exceeds destination limits
505 continue;
506 }
507 }
508
509 if ( field.precision() > 0 )
510 {
511 // source precision limited
512 if ( ( nativeType.mMinPrec > 0 && field.precision() < nativeType.mMinPrec ) ||
513 ( nativeType.mMaxPrec > 0 && field.precision() > nativeType.mMaxPrec ) )
514 {
515 // source precision exceeds destination limits
516 continue;
517 }
518 }
519
520 QgsDebugMsgLevel( QStringLiteral( "native type matches" ), 3 );
521 return true;
522 }
523
524 QgsDebugError( QStringLiteral( "no sufficient native type found" ) );
525 return false;
526}
527
528QVariant QgsVectorDataProvider::minimumValue( int index ) const
529{
531
532 if ( index < 0 || index >= fields().count() )
533 {
534 QgsDebugError( "Warning: access requested to invalid field index: " + QString::number( index ) );
535 return QVariant();
536 }
537
539
540 if ( !mCacheMinValues.contains( index ) )
541 return QVariant();
542
543 return mCacheMinValues[index];
544}
545
546QVariant QgsVectorDataProvider::maximumValue( int index ) const
547{
549
550 if ( index < 0 || index >= fields().count() )
551 {
552 QgsDebugError( "Warning: access requested to invalid field index: " + QString::number( index ) );
553 return QVariant();
554 }
555
557
558 if ( !mCacheMaxValues.contains( index ) )
559 return QVariant();
560
561 return mCacheMaxValues[index];
562}
563
564QStringList QgsVectorDataProvider::uniqueStringsMatching( int index, const QString &substring, int limit, QgsFeedback *feedback ) const
565{
567
568 QStringList results;
569
570 // Safety belt
571 if ( index < 0 || index >= fields().count() )
572 return results;
573
574 QgsFeature f;
575 QgsAttributeList keys;
576 keys.append( index );
577
578 QgsFeatureRequest request;
579 request.setSubsetOfAttributes( keys );
581 const QString fieldName = fields().at( index ).name();
582 request.setFilterExpression( QStringLiteral( "\"%1\" ILIKE '%%2%'" ).arg( fieldName, substring ) );
583 QgsFeatureIterator fi = getFeatures( request );
584
585 QSet<QString> set;
586
587 while ( fi.nextFeature( f ) )
588 {
589 const QString value = f.attribute( index ).toString();
590 if ( !set.contains( value ) )
591 {
592 results.append( value );
593 set.insert( value );
594 }
595
596 if ( ( limit >= 0 && results.size() >= limit ) || ( feedback && feedback->isCanceled() ) )
597 break;
598 }
599 return results;
600}
601
603 const QgsAggregateCalculator::AggregateParameters &parameters, QgsExpressionContext *context, bool &ok, QgsFeatureIds *fids ) const
604{
605 // non fatal for now -- the "aggregate" functions are not thread safe and call this
607
608 //base implementation does nothing
609 Q_UNUSED( aggregate )
610 Q_UNUSED( index )
611 Q_UNUSED( parameters )
612 Q_UNUSED( context )
613 Q_UNUSED( fids )
614
615 ok = false;
616 return QVariant();
617}
618
620{
622
623 mCacheMinMaxDirty = true;
624 mCacheMinValues.clear();
625 mCacheMaxValues.clear();
626}
627
629{
631
632 if ( !mCacheMinMaxDirty )
633 return;
634
635 const QgsFields flds = fields();
636 for ( int i = 0; i < flds.count(); ++i )
637 {
638 if ( flds.at( i ).type() == QMetaType::Type::Int )
639 {
640 mCacheMinValues[i] = QVariant( std::numeric_limits<int>::max() );
641 mCacheMaxValues[i] = QVariant( std::numeric_limits<int>::lowest() );
642 }
643 else if ( flds.at( i ).type() == QMetaType::Type::LongLong )
644 {
645 mCacheMinValues[i] = QVariant( std::numeric_limits<qlonglong>::max() );
646 mCacheMaxValues[i] = QVariant( std::numeric_limits<qlonglong>::lowest() );
647 }
648 else if ( flds.at( i ).type() == QMetaType::Type::Double )
649 {
650 mCacheMinValues[i] = QVariant( std::numeric_limits<double>::max() );
651 mCacheMaxValues[i] = QVariant( std::numeric_limits<double>::lowest() );
652
653 }
654 else
655 {
656 mCacheMinValues[i] = QVariant();
657 mCacheMaxValues[i] = QVariant();
658 }
659 }
660
661 QgsFeature f;
662 const QgsAttributeList keys = mCacheMinValues.keys();
663 QgsFeatureIterator fi = getFeatures( QgsFeatureRequest().setSubsetOfAttributes( keys )
665
666 while ( fi.nextFeature( f ) )
667 {
668 const QgsAttributes attrs = f.attributes();
669 for ( const int attributeIndex : keys )
670 {
671 const QVariant &varValue = attrs.at( attributeIndex );
672
673 if ( QgsVariantUtils::isNull( varValue ) )
674 continue;
675
676 switch ( flds.at( attributeIndex ).type() )
677 {
678 case QMetaType::Type::Int:
679 {
680 const int value = varValue.toInt();
681 if ( value < mCacheMinValues[ attributeIndex ].toInt() )
682 mCacheMinValues[ attributeIndex ] = value;
683 if ( value > mCacheMaxValues[ attributeIndex ].toInt() )
684 mCacheMaxValues[ attributeIndex ] = value;
685 break;
686 }
687 case QMetaType::Type::LongLong:
688 {
689 const qlonglong value = varValue.toLongLong();
690 if ( value < mCacheMinValues[ attributeIndex ].toLongLong() )
691 mCacheMinValues[ attributeIndex ] = value;
692 if ( value > mCacheMaxValues[ attributeIndex ].toLongLong() )
693 mCacheMaxValues[ attributeIndex ] = value;
694 break;
695 }
696 case QMetaType::Type::Double:
697 {
698 const double value = varValue.toDouble();
699 if ( value < mCacheMinValues[ attributeIndex ].toDouble() )
700 mCacheMinValues[attributeIndex ] = value;
701 if ( value > mCacheMaxValues[ attributeIndex ].toDouble() )
702 mCacheMaxValues[ attributeIndex ] = value;
703 break;
704 }
705 case QMetaType::Type::QDateTime:
706 {
707 const QDateTime value = varValue.toDateTime();
708 if ( value < mCacheMinValues[ attributeIndex ].toDateTime() || !mCacheMinValues[ attributeIndex ].isValid() )
709 mCacheMinValues[attributeIndex ] = value;
710 if ( value > mCacheMaxValues[ attributeIndex ].toDateTime() || !mCacheMaxValues[ attributeIndex ].isValid() )
711 mCacheMaxValues[ attributeIndex ] = value;
712 break;
713 }
714 case QMetaType::Type::QDate:
715 {
716 const QDate value = varValue.toDate();
717 if ( value < mCacheMinValues[ attributeIndex ].toDate() || !mCacheMinValues[ attributeIndex ].isValid() )
718 mCacheMinValues[attributeIndex ] = value;
719 if ( value > mCacheMaxValues[ attributeIndex ].toDate() || !mCacheMaxValues[ attributeIndex ].isValid() )
720 mCacheMaxValues[ attributeIndex ] = value;
721 break;
722 }
723 case QMetaType::Type::QTime:
724 {
725 const QTime value = varValue.toTime();
726 if ( value < mCacheMinValues[ attributeIndex ].toTime() || !mCacheMinValues[ attributeIndex ].isValid() )
727 mCacheMinValues[attributeIndex ] = value;
728 if ( value > mCacheMaxValues[ attributeIndex ].toTime() || !mCacheMaxValues[ attributeIndex ].isValid() )
729 mCacheMaxValues[ attributeIndex ] = value;
730 break;
731 }
732 default:
733 {
734 const QString value = varValue.toString();
735 if ( QgsVariantUtils::isNull( mCacheMinValues[ attributeIndex ] ) || value < mCacheMinValues[attributeIndex ].toString() )
736 {
737 mCacheMinValues[attributeIndex] = value;
738 }
739 if ( QgsVariantUtils::isNull( mCacheMaxValues[attributeIndex] ) || value > mCacheMaxValues[attributeIndex].toString() )
740 {
741 mCacheMaxValues[attributeIndex] = value;
742 }
743 break;
744 }
745 }
746 }
747 }
748
749 mCacheMinMaxDirty = false;
750}
751
752QVariant QgsVectorDataProvider::convertValue( QMetaType::Type type, const QString &value )
753{
754 QVariant v( value );
755
756 if ( !v.convert( type ) || value.isNull() )
758
759 return v;
760}
761
762QVariant QgsVectorDataProvider::convertValue( QVariant::Type type, const QString &value )
763{
765}
766
773
774static bool _compareEncodings( const QString &s1, const QString &s2 )
775{
776 return s1.toLower() < s2.toLower();
777}
778
779static bool _removeDuplicateEncodings( const QString &s1, const QString &s2 )
780{
781 return s1.compare( s2, Qt::CaseInsensitive ) == 0;
782}
783
785{
786 static std::once_flag initialized;
787 std::call_once( initialized, [ = ]
788 {
789 const auto codecs { QTextCodec::availableCodecs() };
790 for ( const QByteArray &codec : codecs )
791 {
792 sEncodings << codec;
793 }
794#if 0
795 smEncodings << "BIG5";
796 smEncodings << "BIG5-HKSCS";
797 smEncodings << "EUCJP";
798 smEncodings << "EUCKR";
799 smEncodings << "GB2312";
800 smEncodings << "GBK";
801 smEncodings << "GB18030";
802 smEncodings << "JIS7";
803 smEncodings << "SHIFT-JIS";
804 smEncodings << "TSCII";
805 smEncodings << "UTF-8";
806 smEncodings << "UTF-16";
807 smEncodings << "KOI8-R";
808 smEncodings << "KOI8-U";
809 smEncodings << "ISO8859-1";
810 smEncodings << "ISO8859-2";
811 smEncodings << "ISO8859-3";
812 smEncodings << "ISO8859-4";
813 smEncodings << "ISO8859-5";
814 smEncodings << "ISO8859-6";
815 smEncodings << "ISO8859-7";
816 smEncodings << "ISO8859-8";
817 smEncodings << "ISO8859-8-I";
818 smEncodings << "ISO8859-9";
819 smEncodings << "ISO8859-10";
820 smEncodings << "ISO8859-11";
821 smEncodings << "ISO8859-12";
822 smEncodings << "ISO8859-13";
823 smEncodings << "ISO8859-14";
824 smEncodings << "ISO8859-15";
825 smEncodings << "IBM 850";
826 smEncodings << "IBM 866";
827 smEncodings << "CP874";
828 smEncodings << "CP1250";
829 smEncodings << "CP1251";
830 smEncodings << "CP1252";
831 smEncodings << "CP1253";
832 smEncodings << "CP1254";
833 smEncodings << "CP1255";
834 smEncodings << "CP1256";
835 smEncodings << "CP1257";
836 smEncodings << "CP1258";
837 smEncodings << "Apple Roman";
838 smEncodings << "TIS-620";
839 smEncodings << "System";
840#endif
841
842 // Do case-insensitive sorting of encodings then remove duplicates
843 std::sort( sEncodings.begin(), sEncodings.end(), _compareEncodings );
844 const auto last = std::unique( sEncodings.begin(), sEncodings.end(), _removeDuplicateEncodings );
845 sEncodings.erase( last, sEncodings.end() );
846
847 } );
848
849 return sEncodings;
850}
851
853{
855
856 mErrors.clear();
857}
858
860{
862
863 return !mErrors.isEmpty();
864}
865
867{
869
870 return mErrors;
871}
872
874{
876
877 return nullptr;
878}
879
881{
883
884 return nullptr;
885}
886
887void QgsVectorDataProvider::pushError( const QString &msg ) const
888{
890
891 QgsDebugError( msg );
892 mErrors << msg;
893 emit raiseError( msg );
894}
895
896QSet<QgsMapLayerDependency> QgsVectorDataProvider::dependencies() const
897{
899
900 return QSet<QgsMapLayerDependency>();
901}
902
911
912void QgsVectorDataProvider::setNativeTypes( const QList<NativeType> &nativeTypes )
913{
915
916 mNativeTypes = nativeTypes;
917}
918
920{
921 // non fatal for now -- the "rasterize" processing algorithm is not thread safe and calls this
923
924 return mEncoding;
925}
926
928{
929 if ( geometry.isNull() )
930 {
931 return QgsGeometry();
932 }
933
934 const QgsAbstractGeometry *convertedGeometry = geometry.constGet();
935 if ( !convertedGeometry )
936 {
937 return QgsGeometry();
938 }
939
940
941 //geom is already in the provider geometry type
942 if ( convertedGeometry->wkbType() == providerGeometryType )
943 {
944 return QgsGeometry();
945 }
946
947 std::unique_ptr< QgsAbstractGeometry > outputGeom;
948
949 //convert compoundcurve to circularstring (possible if compoundcurve consists of one circular string)
950 if ( QgsWkbTypes::flatType( providerGeometryType ) == Qgis::WkbType::CircularString )
951 {
952 QgsCompoundCurve *compoundCurve = qgsgeometry_cast<QgsCompoundCurve *>( convertedGeometry );
953 if ( compoundCurve )
954 {
955 if ( compoundCurve->nCurves() == 1 )
956 {
957 const QgsCircularString *circularString = qgsgeometry_cast<const QgsCircularString *>( compoundCurve->curveAt( 0 ) );
958 if ( circularString )
959 {
960 outputGeom.reset( circularString->clone() );
961 }
962 }
963 }
964 }
965
966 //convert to curved type if necessary
967 if ( !QgsWkbTypes::isCurvedType( convertedGeometry->wkbType() ) && QgsWkbTypes::isCurvedType( providerGeometryType ) )
968 {
969 QgsAbstractGeometry *curveGeom = outputGeom ? outputGeom->toCurveType() : convertedGeometry->toCurveType();
970 if ( curveGeom )
971 {
972 outputGeom.reset( curveGeom );
973 }
974 }
975
976 //convert to linear type from curved type
977 if ( QgsWkbTypes::isCurvedType( convertedGeometry->wkbType() ) && !QgsWkbTypes::isCurvedType( providerGeometryType ) )
978 {
979 QgsAbstractGeometry *segmentizedGeom = outputGeom ? outputGeom->segmentize() : convertedGeometry->segmentize();
980 if ( segmentizedGeom )
981 {
982 outputGeom.reset( segmentizedGeom );
983 }
984 }
985
986 //convert to multitype if necessary
987 if ( QgsWkbTypes::isMultiType( providerGeometryType ) && !QgsWkbTypes::isMultiType( convertedGeometry->wkbType() ) )
988 {
989 std::unique_ptr< QgsAbstractGeometry > collGeom( QgsGeometryFactory::geomFromWkbType( providerGeometryType ) );
990 QgsGeometryCollection *geomCollection = qgsgeometry_cast<QgsGeometryCollection *>( collGeom.get() );
991 if ( geomCollection )
992 {
993 if ( geomCollection->addGeometry( outputGeom ? outputGeom->clone() : convertedGeometry->clone() ) )
994 {
995 outputGeom.reset( collGeom.release() );
996 }
997 }
998 }
999
1000 //convert to single type if there's a single part of compatible type
1001 if ( !QgsWkbTypes::isMultiType( providerGeometryType ) && QgsWkbTypes::isMultiType( convertedGeometry->wkbType() ) )
1002 {
1003 const QgsGeometryCollection *collection = qgsgeometry_cast<const QgsGeometryCollection *>( convertedGeometry );
1004 if ( collection )
1005 {
1006 if ( collection->numGeometries() == 1 )
1007 {
1008 const QgsAbstractGeometry *firstGeom = collection->geometryN( 0 );
1009 if ( firstGeom && firstGeom->wkbType() == providerGeometryType )
1010 {
1011 outputGeom.reset( firstGeom->clone() );
1012 }
1013 }
1014 }
1015 }
1016
1017 //set z/m types
1018 if ( QgsWkbTypes::hasZ( providerGeometryType ) )
1019 {
1020 if ( !outputGeom )
1021 {
1022 outputGeom.reset( convertedGeometry->clone() );
1023 }
1024 outputGeom->addZValue();
1025 }
1026
1027 if ( QgsWkbTypes::hasM( providerGeometryType ) )
1028 {
1029 if ( !outputGeom )
1030 {
1031 outputGeom.reset( convertedGeometry->clone() );
1032 }
1033 outputGeom->addMValue();
1034 }
1035
1036 if ( outputGeom )
1037 {
1038 return QgsGeometry( outputGeom.release() );
1039 }
1040
1041 return QgsGeometry();
1042}
1043
1045{
1047
1048 return false;
1049}
1050
1051QStringList QgsVectorDataProvider::sEncodings;
1052
1053QList<QgsRelation> QgsVectorDataProvider::discoverRelations( const QgsVectorLayer *, const QList<QgsVectorLayer *> & ) const
1054{
1056
1057 return QList<QgsRelation>();
1058}
1059
1065
1072
1079
1086
1088{
1090
1091 return mElevationProperties.get();
1092}
@ SelectAtId
Fast access to features using their ID.
@ ChangeFeatures
Supports joint updates for attributes and geometry. Providers supporting this should still define Cha...
@ SimplifyGeometries
Supports simplification of geometries on provider side according to a distance tolerance.
@ AddFeatures
Allows adding features.
@ SimplifyGeometriesWithTopologicalValidation
Supports topological simplification of geometries on provider side according to a distance tolerance.
@ CreateAttributeIndex
Can create indexes on provider's fields.
@ CircularGeometries
Supports circular geometry types (circularstring, compoundcurve, curvepolygon)
@ NoCapabilities
Provider has no capabilities.
@ ChangeGeometries
Allows modifications of geometries.
@ AddAttributes
Allows addition of new attributes (fields)
@ CreateSpatialIndex
Allows creation of spatial index.
@ RenameAttributes
Supports renaming attributes (fields)
@ DeleteFeatures
Allows deletion of features.
@ TransactionSupport
Supports transactions.
@ DeleteAttributes
Allows deletion of attributes (fields)
@ ChangeAttributeValues
Allows modification of attribute values.
@ FeatureSymbology
Provider is able retrieve embedded symbology associated with individual features.
QFlags< VectorLayerTypeFlag > VectorLayerTypeFlags
Vector layer type flags.
Definition qgis.h:395
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
QFlags< DataProviderReadFlag > DataProviderReadFlags
Flags which control data provider construction.
Definition qgis.h:450
FeatureAvailability
Possible return value for QgsFeatureSource::hasFeatures() to determine if a source is empty.
Definition qgis.h:541
@ FeaturesAvailable
There is at least one feature available in this source.
@ NoFeaturesAvailable
There are certainly no features available in this source.
QFlags< VectorProviderCapability > VectorProviderCapabilities
Vector data provider capabilities.
Definition qgis.h:500
Aggregate
Available aggregates to calculate.
Definition qgis.h:5477
@ SqlQuery
SQL query layer.
QFlags< VectorDataProviderAttributeEditCapability > VectorDataProviderAttributeEditCapabilities
Attribute editing capabilities which may be supported by vector data providers.
Definition qgis.h:566
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:256
@ CircularString
CircularString.
Abstract base class for all geometries.
virtual bool addZValue(double zValue=0)=0
Adds a z-dimension to the geometry, initialized to a preset value.
virtual QgsAbstractGeometry * segmentize(double tolerance=M_PI/180., SegmentationToleranceType toleranceType=MaximumAngle) const
Returns a version of the geometry without curves.
virtual QgsAbstractGeometry * toCurveType() const =0
Returns the geometry converted to the more generic curve type.
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
Abstract base class - its implementations define different approaches to the labeling of a vector lay...
A vector of attributes.
A 3-dimensional box composed of x, y, z coordinates.
Definition qgsbox3d.h:43
Circular string geometry type.
QgsCircularString * clone() const override
Clones the geometry by performing a deep copy.
Compound curve geometry type.
int nCurves() const
Returns the number of curves in the geometry.
const QgsCurve * curveAt(int i) const
Returns the curve at the specified index.
This class represents a coordinate reference system (CRS).
Base class for handling elevation related properties for a data provider.
Abstract base class for spatial data provider implementations.
virtual Qgis::DataProviderFlags flags() const
Returns the generic data provider flags.
virtual QgsCoordinateReferenceSystem crs() const =0
Returns the coordinate system for the data source.
virtual QgsBox3D extent3D() const
Returns the 3D extent of the layer.
virtual QgsRectangle extent() const =0
Returns the extent of the layer.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
Abstract base class for all 2D vector feature renderers.
This class wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setFlags(Qgis::FeatureRequestFlags flags)
Sets flags that affect how features will be fetched.
QgsFeatureRequest & setLimit(long long limit)
Set the maximum number of features to request.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
QgsFeatureRequest & setNoAttributes()
Set that no attributes will be fetched.
QFlags< Flag > Flags
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:58
QgsAttributes attributes
Definition qgsfeature.h:67
QgsFeatureId id
Definition qgsfeature.h:66
Q_INVOKABLE QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition qgsfeedback.h:44
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition qgsfeedback.h:53
Constraint
Constraints which may be present on a field.
QFlags< Constraint > Constraints
Encapsulate a field in an attribute table or data source.
Definition qgsfield.h:53
QMetaType::Type type
Definition qgsfield.h:60
QString name
Definition qgsfield.h:62
int precision
Definition qgsfield.h:59
int length
Definition qgsfield.h:58
Container of fields for a vector layer.
Definition qgsfields.h:46
int count
Definition qgsfields.h:50
QgsAttributeList allAttributesList() const
Utility function to get list of attribute indexes.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
Q_INVOKABLE int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
virtual bool addGeometry(QgsAbstractGeometry *g)
Adds a geometry and takes ownership. Returns true in case of success.
int numGeometries() const
Returns the number of geometries within the collection.
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
static std::unique_ptr< QgsAbstractGeometry > geomFromWkbType(Qgis::WkbType t)
Returns empty geometry from wkb type.
A geometry is the spatial representation of a feature.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
A QTextCodec implementation which relies on OGR to do the text conversion.
static QStringList supportedCodecs()
Returns a list of supported text codecs.
A rectangle specified with double values.
This class allows including a set of layers in a database-side transaction, provided the layer data p...
static QMetaType::Type variantTypeToMetaType(QVariant::Type variantType)
Converts a QVariant::Type to a QMetaType::Type.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
static QVariant createNullVariant(QMetaType::Type metaType)
Helper method to properly create a null QVariant from a metaType Returns the created QVariant.
Implementation of data provider temporal properties for QgsVectorDataProviders.
This is the base class for vector data providers.
void pushError(const QString &msg) const
Push a notification about errors that happened in this providers scope.
QgsRectangle sourceExtent() const override
Returns the extent of all geometries from the source.
virtual bool cancelReload()
Cancels the current reloading of data.
QString lastError() const override
Returns the most recent error encountered by the sink, e.g.
void setNativeTypes(const QList< QgsVectorDataProvider::NativeType > &nativeTypes)
Set the list of native types supported by this provider.
virtual QList< QgsRelation > discoverRelations(const QgsVectorLayer *target, const QList< QgsVectorLayer * > &layers) const
Discover the available relations with the given layers.
static QStringList availableEncodings()
Returns a list of available encodings.
virtual QString dataComment() const override
Returns a short comment for the data that this provider is providing access to (e....
virtual QVariant aggregate(Qgis::Aggregate aggregate, int index, const QgsAggregateCalculator::AggregateParameters &parameters, QgsExpressionContext *context, bool &ok, QgsFeatureIds *fids=nullptr) const
Calculates an aggregated value from the layer's features.
bool supportedType(const QgsField &field) const
check if provider supports type of field
virtual bool changeGeometryValues(const QgsGeometryMap &geometry_map)
Changes geometries of existing features.
virtual bool createSpatialIndex()
Creates a spatial index on the datasource (if supported by the provider type).
Q_DECL_DEPRECATED QgsAttrPalIndexNameHash palAttributeIndexNames() const
Returns list of indexes to names for QgsPalLabeling fix.
QgsCoordinateReferenceSystem sourceCrs() const override
Returns the coordinate reference system for features in the source.
virtual QgsFeatureRenderer * createRenderer(const QVariantMap &configuration=QVariantMap()) const
Creates a new vector layer feature renderer, using provider backend specific information.
virtual QString geometryColumnName() const
Returns the name of the column storing geometry, if applicable.
virtual QString storageType() const
Returns the permanent storage type for this layer as a friendly name.
void clearMinMaxCache()
Invalidates the min/max cache.
virtual bool truncate()
Removes all features from the layer.
virtual QStringList uniqueStringsMatching(int index, const QString &substring, int limit=-1, QgsFeedback *feedback=nullptr) const
Returns unique string values of an attribute which contain a specified subset string.
void raiseError(const QString &msg) const
Signals an error in this provider.
QTextCodec * textEncoding() const
Gets this providers encoding.
QgsVectorDataProvider(const QString &uri=QString(), const QgsDataProvider::ProviderOptions &providerOptions=QgsDataProvider::ProviderOptions(), Qgis::DataProviderReadFlags flags=Qgis::DataProviderReadFlags())
Constructor for a vector data provider.
virtual bool isSqlQuery() const
Returns true if the layer is a query (SQL) layer.
void clearErrors()
Clear recorded errors.
QStringList errors() const
Gets recorded errors.
virtual bool empty() const
Returns true if the layer does not contain any feature.
virtual Q_INVOKABLE Qgis::VectorProviderCapabilities capabilities() const
Returns flags containing the supported capabilities.
QList< QgsVectorDataProvider::NativeType > nativeTypes() const
Returns the names of the supported types.
QgsBox3D sourceExtent3D() const override
Returns the 3D extent of all geometries from the source.
virtual QgsAttributeList pkAttributeIndexes() const
Returns list of indexes of fields that make up the primary key.
virtual void handlePostCloneOperations(QgsVectorDataProvider *source)
Handles any post-clone operations required after this vector data provider was cloned from the source...
QgsGeometry convertToProviderType(const QgsGeometry &geom) const
Converts the geometry to the provider type if possible / necessary.
virtual bool changeFeatures(const QgsChangedAttributesMap &attr_map, const QgsGeometryMap &geometry_map)
Changes attribute values and geometries of existing features.
virtual QSet< QgsMapLayerDependency > dependencies() const
Gets the list of layer ids on which this layer depends.
int fieldNameIndex(const QString &fieldName) const
Returns the index of a field name or -1 if the field does not exist.
virtual QString defaultValueClause(int fieldIndex) const
Returns any default value clauses which are present at the provider for a specified field index.
virtual void setEncoding(const QString &e)
Set encoding used for accessing data from layer.
virtual bool changeAttributeValues(const QgsChangedAttributesMap &attr_map)
Changes attribute values of existing features.
virtual bool deleteFeatures(const QgsFeatureIds &id)
Deletes one or more features from the provider.
virtual Qgis::VectorLayerTypeFlags vectorLayerTypeFlags() const
Returns the vector layer type flags.
QVariant maximumValue(int index) const override
Returns the maximum value of an attribute.
virtual bool createAttributeIndex(int field)
Create an attribute index on the datasource.
bool addFeatures(QgsFeatureList &flist, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) override
Adds a list of features to the sink.
QgsDataProviderElevationProperties * elevationProperties() override
Returns the provider's elevation properties.
QgsFields fields() const override=0
Returns the fields associated with this data provider.
QMap< QString, int > fieldNameMap() const
Returns a map where the key is the name of the field and the value is its index.
Qgis::WkbType wkbType() const override=0
Returns the geometry type which is returned by this layer.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const override=0
Query the provider for features specified in request.
virtual QgsAttributeList attributeIndexes() const
Returns list of indexes to fetch all attributes in nextFeature()
virtual bool addAttributes(const QList< QgsField > &attributes)
Adds new attributes to the provider.
QVariant minimumValue(int index) const override
Returns the minimum value of an attribute.
void fillMinMaxCache() const
Populates the cache of minimum and maximum attribute values.
QString encoding() const
Returns the encoding which is used for accessing data.
virtual QVariant defaultValue(int fieldIndex) const
Returns any literal default values which are present at the provider for a specified field index.
QgsFieldConstraints::Constraints fieldConstraints(int fieldIndex) const
Returns any constraints which are present at the provider for a specified field index.
virtual QgsTransaction * transaction() const
Returns the transaction this data provider is included in, if any.
virtual QgsAbstractVectorLayerLabeling * createLabeling(const QVariantMap &configuration=QVariantMap()) const
Creates labeling settings, using provider backend specific information.
static QVariant convertValue(QMetaType::Type type, const QString &value)
Convert value to type.
Qgis::FeatureAvailability hasFeatures() const override
Will always return FeatureAvailability::FeaturesAvailable or FeatureAvailability::NoFeaturesAvailable...
virtual bool renameAttributes(const QgsFieldNameMap &renamedAttributes)
Renames existing attributes.
virtual bool deleteAttributes(const QgsAttributeIds &attributes)
Deletes existing attributes from the provider.
virtual bool skipConstraintCheck(int fieldIndex, QgsFieldConstraints::Constraint constraint, const QVariant &value=QVariant()) const
Returns true if a constraint check should be skipped for a specified field (e.g., if the value return...
virtual Qgis::VectorDataProviderAttributeEditCapabilities attributeEditCapabilities() const
Returns the provider's supported attribute editing capabilities.
bool hasErrors() const
Provider has errors to report.
QgsVectorDataProviderTemporalCapabilities * temporalCapabilities() override
Returns the provider's temporal capabilities.
QString capabilitiesString() const
Returns the above in friendly format.
Represents a vector layer which manages a vector based data sets.
static bool isMultiType(Qgis::WkbType type)
Returns true if the WKB type is a multi type.
static bool hasZ(Qgis::WkbType type)
Tests whether a WKB type contains the z-dimension.
static bool hasM(Qgis::WkbType type)
Tests whether a WKB type contains m values.
static bool isCurvedType(Qgis::WkbType type)
Returns true if the WKB type is a curved type or can contain curved geometries.
static Qgis::WkbType flatType(Qgis::WkbType type)
Returns the flat type for a WKB type.
QMap< int, QString > QgsFieldNameMap
QMap< QgsFeatureId, QgsGeometry > QgsGeometryMap
QMap< QgsFeatureId, QgsAttributeMap > QgsChangedAttributesMap
QList< QgsFeature > QgsFeatureList
QSet< QgsFeatureId > QgsFeatureIds
#define QgsDebugMsgLevel(str, level)
Definition qgslogger.h:39
#define QgsDebugError(str)
Definition qgslogger.h:38
#define QGIS_PROTECT_QOBJECT_THREAD_ACCESS_NON_FATAL
#define QGIS_PROTECT_QOBJECT_THREAD_ACCESS
QList< int > QgsAttributeList
QSet< int > QgsAttributeIds
QHash< int, QString > QgsAttrPalIndexNameHash
A bundle of parameters controlling aggregate calculation.
Setting options for creating vector data providers.