129    geometry.
set( 
nullptr );
 
 
  151  if ( !ring->isClosed() )
 
  165  if ( !targetFeatureIds.isEmpty() )
 
  178  bool success = 
false;
 
  189      addRingReturnCode = g.
addRing( 
static_cast< QgsCurve * 
>( ring->clone() ) );
 
  193      addRingReturnCode = g.
addRing( 
static_cast< QgsCurve * 
>( ring->reversed() ) );
 
  199      if ( modifiedFeatureIds )
 
  201        modifiedFeatureIds->insert( f.
id() );
 
  215double QgsVectorLayerEditUtils::getTopologicalSearchRadius( 
const QgsVectorLayer *layer )
 
  235void QgsVectorLayerEditUtils::addTopologicalPointsToLayers( 
const QgsGeometry &geom, 
QgsVectorLayer *vlayer, 
const QList<QgsMapLayer *> &layers, 
const QString &toolName )
 
  242    QgsVectorLayer *vectorLayer = qobject_cast<QgsVectorLayer *>( layer );
 
  248      if ( vectorLayer->
crs() != vlayer->
crs() )
 
  257          QgsDebugError( QStringLiteral( 
"Bounding box transformation failed, skipping topological points for layer %1" ).arg( vlayer->
id() ) );
 
  261      bbox.
grow( getTopologicalSearchRadius( vectorLayer ) );
 
  268      vectorLayer->
beginEditCommand( QObject::tr( 
"Topological points added by '%1'" ).arg( toolName ) );
 
  271      if ( vectorLayer->
crs() != vlayer->
crs() )
 
  277          transformedGeom.transform( ct );
 
  282          QgsDebugError( QStringLiteral( 
"transformation to vectorLayer coordinate failed" ) );
 
  290      if ( returnValue == 0 )
 
  307  for ( QVector<QgsPointXY>::const_iterator it = ring.constBegin(); it != ring.constEnd(); ++it )
 
  311  return addRing( l, targetFeatureIds,  modifiedFeatureId );
 
 
  317  return addRing( ringLine, targetFeatureIds,  modifiedFeatureId );
 
 
  322  std::unique_ptr<QgsCurve> uniquePtrRing( ring );
 
  323  if ( modifiedFeatureId )
 
  327    if ( modifiedFeatureId && !modifiedFeatureIds.empty() )
 
  328      *modifiedFeatureId = *modifiedFeatureIds.begin();
 
  331  return staticAddRing( mLayer, uniquePtrRing, targetFeatureIds, 
nullptr, 
true );
 
 
  337  std::unique_ptr<QgsCurve> uniquePtrRing( ring );
 
  338  return staticAddRing( mLayer, uniquePtrRing, targetFeatureIds, modifiedFeatureIds, 
false );
 
 
  346  for ( QVector<QgsPointXY>::const_iterator it = points.constBegin(); it != points.constEnd(); ++it )
 
  350  return addPart( l, featureId );
 
 
  359  bool firstPart = 
false;
 
 
  395  bool firstPart = 
false;
 
 
  452  for ( QVector<QgsPointXY>::const_iterator it = splitLine.constBegin(); it != splitLine.constEnd(); ++it )
 
 
  463  bool preserveCircular = 
false;
 
  464  return splitFeatures( &lineString, topologyTestPoints, preserveCircular, topologicalEditing );
 
 
  475  int numberOfSplitFeatures = 0;
 
  483  if ( !selectedIds.isEmpty() ) 
 
  500      else if ( bBox.
height() == 0.0 && bBox.
width() > 0 )
 
  508        double bufferDistance = 0.000001;
 
  510          bufferDistance = 0.00000001;
 
  532    QVector<QgsGeometry> newGeometries;
 
  536    splitFunctionReturn = featureGeom.
splitGeometry( curve, newGeometries, preserveCircular, topologicalEditing, featureTopologyTestPoints );
 
  537    topologyTestPoints.append( featureTopologyTestPoints );
 
  542      double featureGeomSize = size( featureGeom );
 
  544      QVector<QgsGeometry>::iterator largestNewFeature = std::max_element( newGeometries.begin(), newGeometries.end(), [ &size ]( 
const QgsGeometry & a, 
const QgsGeometry & b ) -> 
bool 
  546        return size( a ) < size( b );
 
  549      if ( size( *largestNewFeature ) > featureGeomSize )
 
  552        *largestNewFeature = featureGeom;
 
  561      for ( 
int fieldIdx = 0; fieldIdx < fieldCount; ++fieldIdx )
 
  575              const double originalValue = feat.
attribute( fieldIdx ).toDouble();
 
  577              double originalSize = 0;
 
  579              switch ( originalGeom.
type() )
 
  587                  originalSize = originalGeom.
length();
 
  590                  originalSize = originalGeom.
area();
 
  595              switch ( featureGeom.
type() )
 
  603                  newSize = featureGeom.
length();
 
  606                  newSize = featureGeom.
area();
 
  610              attributeMap.insert( fieldIdx, originalSize > 0 ? ( originalValue * newSize / originalSize ) : originalValue );
 
  617      if ( !attributeMap.isEmpty() )
 
  623      for ( 
const QgsGeometry &geom : std::as_const( newGeometries ) )
 
  626        for ( 
int fieldIdx = 0; fieldIdx < fieldCount; ++fieldIdx )
 
  637              attributeMap.insert( fieldIdx, feat.
attribute( fieldIdx ) );
 
  644                attributeMap.insert( fieldIdx, feat.
attribute( fieldIdx ) );
 
  648                const double originalValue = feat.
attribute( fieldIdx ).toDouble();
 
  650                double originalSize = 0;
 
  652                switch ( originalGeom.
type() )
 
  660                    originalSize = originalGeom.
length();
 
  663                    originalSize = originalGeom.
area();
 
  668                switch ( geom.
type() )
 
  679                    newSize = geom.
area();
 
  683                attributeMap.insert( fieldIdx, originalSize > 0 ? ( originalValue * newSize / originalSize ) : originalValue );
 
  697      if ( topologicalEditing )
 
  699        QgsPointSequence::const_iterator topol_it = featureTopologyTestPoints.constBegin();
 
  700        for ( ; topol_it != featureTopologyTestPoints.constEnd(); ++topol_it )
 
  705      ++numberOfSplitFeatures;
 
  709      returnCode = splitFunctionReturn;
 
  713  if ( !featuresDataToAdd.isEmpty() )
 
  721  if ( numberOfSplitFeatures == 0 )
 
 
  732  for ( QVector<QgsPointXY>::const_iterator it = splitLine.constBegin(); it != splitLine.constEnd(); ++it )
 
 
  744  double xMin, yMin, xMax, yMax;
 
  746  int numberOfSplitParts = 0;
 
  756    if ( boundingBoxFromPointList( splitLine, xMin, yMin, xMax, yMax ) )
 
  776      else if ( bBox.
height() == 0.0 && bBox.
width() > 0 )
 
  784        double bufferDistance = 0.000001;
 
  786          bufferDistance = 0.00000001;
 
  803    QVector<QgsGeometry> resultCollection;
 
  807      QVector<QgsGeometry> newGeometries;
 
  810      const Qgis::GeometryOperationResult splitFunctionReturn = part.splitGeometry( splitLine, newGeometries, topologicalEditing, partTopologyTestPoints, 
false );
 
  814        for ( 
int i = 0; i < newGeometries.size(); ++i )
 
  816          resultCollection.append( newGeometries.at( i ).asGeometryCollection() );
 
  819        topologyTestPoints.append( partTopologyTestPoints );
 
  821        ++numberOfSplitParts;
 
  829        resultCollection.append( part );
 
  833        return splitFunctionReturn;
 
  840    if ( topologicalEditing )
 
  842      QgsPointSequence::const_iterator topol_it = topologyTestPoints.constBegin();
 
  843      for ( ; topol_it != topologyTestPoints.constEnd(); ++topol_it )
 
 
  871  bool pointsAdded = 
false;
 
  883  return pointsAdded ? 0 : 2;
 
 
  891  double segmentSearchEpsilon = mLayer->
crs().
isGeographic() ? 1e-12 : 1e-8;
 
  894  double threshold = getTopologicalSearchRadius( mLayer );
 
  897  searchRect.
grow( threshold );
 
  901                           .setFilterRect( searchRect )
 
  903                           .setNoAttributes() );
 
  905  bool pointsAdded = 
false;
 
  916  return pointsAdded ? 0 : 2;
 
 
  929  bool pointsAdded = 
false;
 
  931  QgsPointSequence::const_iterator it = ps.constBegin();
 
  932  while ( it != ps.constEnd() )
 
  941  return pointsAdded ? 0 : 2;
 
 
  951  errorMessage.clear();
 
  953  if ( mergeFeatureIds.isEmpty() )
 
  955    errorMessage = QObject::tr( 
"List of features to merge is empty" );
 
  960  for ( 
int i = 0; i < mergeAttributes.count(); ++i )
 
  962    QVariant val = mergeAttributes.at( i );
 
  969    QString errorMessageConvertCompatible;
 
  972      if ( errorMessage.isEmpty() )
 
  973        errorMessage = QObject::tr( 
"Could not store value '%1' in field of type %2: %3" ).arg( mergeAttributes.at( i ).toString(), mLayer->
fields().
at( i ).
typeName(), errorMessageConvertCompatible );
 
  975    newAttributes[ i ] = val;
 
  981  QgsFeatureIds::const_iterator feature_it = mergeFeatureIds.constBegin();
 
  982  for ( ; feature_it != mergeFeatureIds.constEnd(); ++feature_it )
 
  984    if ( *feature_it != targetFeatureId )
 
 
 1008bool QgsVectorLayerEditUtils::boundingBoxFromPointList( 
const QgsPointSequence &list, 
double &xmin, 
double &ymin, 
double &xmax, 
double &ymax )
 const 
 1015  xmin = std::numeric_limits<double>::max();
 
 1016  xmax = -std::numeric_limits<double>::max();
 
 1017  ymin = std::numeric_limits<double>::max();
 
 1018  ymax = -std::numeric_limits<double>::max();
 
 1020  for ( QgsPointSequence::const_iterator it = list.constBegin(); it != list.constEnd(); ++it )
 
 1022    if ( it->x() < xmin )
 
 1026    if ( it->x() > xmax )
 
 1030    if ( it->y() < ymin )
 
 1034    if ( it->y() > ymax )
 
GeometryOperationResult
Success or failure of a geometry operation.
 
@ AddPartSelectedGeometryNotFound
The selected geometry cannot be found.
 
@ InvalidInputGeometryType
The input geometry (ring, part, split line, etc.) has not the correct geometry type.
 
@ Success
Operation succeeded.
 
@ AddRingNotInExistingFeature
The input ring doesn't have any existing ring to fit into.
 
@ AddRingNotClosed
The input ring is not closed.
 
@ NothingHappened
Nothing happened, without any error.
 
@ InvalidBaseGeometry
The base geometry on which the operation is done is invalid or empty.
 
@ LayerNotEditable
Cannot edit layer.
 
@ ExactIntersect
Use exact geometry intersection (slower) instead of bounding boxes.
 
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
 
@ GeometryRatio
New values are computed by the ratio of their area/length compared to the area/length of the original...
 
@ UnsetField
Clears the field value so that the data provider backend will populate using any backend triggers or ...
 
@ DefaultValue
Use default field value.
 
@ Duplicate
Duplicate original value.
 
@ Provider
Field originates from the underlying data provider of the vector layer.
 
VectorEditResult
Specifies the result of a vector layer edit operation.
 
@ EmptyGeometry
Edit operation resulted in an empty geometry.
 
@ Success
Edit operation was successful.
 
@ FetchFeatureFailed
Unable to fetch requested feature.
 
@ EditFailed
Edit operation failed.
 
@ InvalidLayer
Edit failed due to invalid layer.
 
The vertex_iterator class provides an STL-style iterator for vertices.
 
virtual bool addZValue(double zValue=0)=0
Adds a z-dimension to the geometry, initialized to a preset value.
 
bool isMeasure() const
Returns true if the geometry contains m values.
 
virtual QgsRectangle boundingBox() const
Returns the minimal bounding box for the geometry.
 
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
 
virtual int nCoordinates() const
Returns the number of nodes contained in the geometry.
 
virtual bool addMValue(double mValue=0)=0
Adds a measure to the geometry, initialized to a preset value.
 
virtual bool hasCurvedSegments() const
Returns true if the geometry contains curved segments.
 
Qgis::DistanceUnit mapUnits
 
Custom exception class for Coordinate Reference System related exceptions.
 
Abstract base class for curved geometry type.
 
Qgis::AngularDirection orientation() const
Returns the curve's orientation, e.g.
 
virtual QgsCurve * reversed() const =0
Returns a reversed copy of the curve, where the direction of the curve has been flipped.
 
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.
 
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 & setNoAttributes()
Set that no attributes will be fetched.
 
QgsFeatureRequest & setFilterRect(const QgsRectangle &rectangle)
Sets the rectangle from which features will be taken.
 
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
 
bool hasGeometry() const
Returns true if the feature has an associated geometry.
 
Q_INVOKABLE QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
 
Encapsulate a field in an attribute table or data source.
 
QString typeName() const
Gets the field type.
 
bool convertCompatible(QVariant &v, QString *errorMessage=nullptr) const
Converts the provided variant to a compatible format.
 
Qgis::FieldDomainSplitPolicy splitPolicy() const
Returns the field's split policy, which indicates how field values should be handled during a split o...
 
Qgis::FieldOrigin fieldOrigin(int fieldIdx) const
Returns the field's origin (value from an enumeration).
 
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
 
int fieldOriginIndex(int fieldIdx) const
Returns the field's origin index (its meaning is specific to each type of origin).
 
double geometryPrecision() const
The precision in which geometries on this layer should be saved.
 
A geometry is the spatial representation of a feature.
 
bool deleteVertex(int atVertex)
Deletes the vertex at the given position number and item (first number is index 0)
 
double length() const
Returns the planar, 2-dimensional length of geometry.
 
bool addTopologicalPoint(const QgsPoint &point, double snappingTolerance=1e-8, double segmentSearchEpsilon=1e-12)
Adds a vertex to the segment which intersect point but don't already have a vertex there.
 
static QgsGeometry collectGeometry(const QVector< QgsGeometry > &geometries)
Creates a new multipart geometry from a list of QgsGeometry objects.
 
QVector< QgsGeometry > asGeometryCollection() const
Returns contents of the geometry as a list of geometries.
 
QgsAbstractGeometry * get()
Returns a modifiable (non-const) reference to the underlying abstract geometry primitive.
 
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
 
bool insertVertex(double x, double y, int beforeVertex)
Insert a new vertex before the given vertex index, ring and item (first number is index 0) If the req...
 
bool convertToSingleType()
Converts multi type geometry into single type geometry e.g.
 
Qgis::GeometryOperationResult addRing(const QVector< QgsPointXY > &ring)
Adds a new ring to this geometry.
 
double area() const
Returns the planar, 2-dimensional area of the geometry.
 
Qgis::AngularDirection polygonOrientation() const
Returns the orientation of the polygon.
 
void set(QgsAbstractGeometry *geometry)
Sets the underlying geometry store.
 
QgsAbstractGeometry::vertex_iterator vertices_begin() const
Returns STL-style iterator pointing to the first vertex of the geometry.
 
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
 
Qgis::GeometryOperationResult addPartV2(const QVector< QgsPointXY > &points, Qgis::WkbType wkbType=Qgis::WkbType::Unknown)
Adds a new part to a the geometry.
 
Qgis::GeometryOperationResult translate(double dx, double dy, double dz=0.0, double dm=0.0)
Translates this geometry by dx, dy, dz and dm.
 
Q_DECL_DEPRECATED Qgis::GeometryOperationResult splitGeometry(const QVector< QgsPointXY > &splitLine, QVector< QgsGeometry > &newGeometries, bool topological, QVector< QgsPointXY > &topologyTestPoints, bool splitFeature=true)
Splits this geometry according to a given line.
 
bool moveVertex(double x, double y, int atVertex)
Moves the vertex at the given position number and item (first number is index 0) to the given coordin...
 
QgsAbstractGeometry::vertex_iterator vertices_end() const
Returns STL-style iterator pointing to the imaginary vertex after the last vertex of the geometry.
 
Line string geometry type, with support for z-dimension and m-values.
 
Base class for all map layer types.
 
QgsCoordinateReferenceSystem crs
 
void triggerRepaint(bool deferredUpdate=false)
Will advise the map canvas (and any other interested party) that this layer requires to be repainted.
 
QgsCoordinateTransformContext transformContext() const
Returns the layer data provider coordinate transform context or a default transform context if the la...
 
Point geometry type, with support for z-dimension and m-values.
 
A rectangle specified with double values.
 
void setYMinimum(double y)
Set the minimum y value.
 
void setXMinimum(double x)
Set the minimum x value.
 
void setYMaximum(double y)
Set the maximum y value.
 
void setXMaximum(double x)
Set the maximum x value.
 
void grow(double delta)
Grows the rectangle in place by the specified amount.
 
T value(const QString &dynamicKeyPart=QString()) const
Returns settings value.
 
static const QgsSettingsEntryDouble * settingsDigitizingDefaultMValue
Settings entry digitizing default m value.
 
static const QgsSettingsEntryDouble * settingsDigitizingDefaultZValue
Settings entry digitizing default z value.
 
Represents a default, "not-specified" value for a feature attribute.
 
virtual bool doesStrictFeatureTypeCheck() const
Returns true if the provider is strict about the type of inserted features (e.g.
 
virtual QString defaultValueClause(int fieldIndex) const
Returns any default value clauses which are present at the provider for a specified field index.
 
int translateFeature(QgsFeatureId featureId, double dx, double dy)
Translates feature by dx, dy.
 
bool mergeFeatures(const QgsFeatureId &targetFeatureId, const QgsFeatureIds &mergeFeatureIds, const QgsAttributes &mergeAttributes, const QgsGeometry &unionGeometry, QString &errorMessage)
Merge features into a single one.
 
QgsVectorLayerEditUtils(QgsVectorLayer *layer)
 
bool insertVertex(double x, double y, QgsFeatureId atFeatureId, int beforeVertex)
Insert a new vertex before the given vertex number, in the given ring, item (first number is index 0)...
 
Q_DECL_DEPRECATED Qgis::GeometryOperationResult addPart(const QVector< QgsPointXY > &ring, QgsFeatureId featureId)
Adds a new part polygon to a multipart feature.
 
Qgis::VectorEditResult deleteVertex(QgsFeatureId featureId, int vertex)
Deletes a vertex from a feature.
 
Qgis::GeometryOperationResult addRingV2(QgsCurve *ring, const QgsFeatureIds &targetFeatureIds=QgsFeatureIds(), QgsFeatureIds *modifiedFeatureIds=nullptr)
Adds a ring to polygon/multipolygon features.
 
int addTopologicalPoints(const QgsGeometry &geom)
Adds topological points for every vertex of the geometry.
 
Q_DECL_DEPRECATED Qgis::GeometryOperationResult splitParts(const QVector< QgsPointXY > &splitLine, bool topologicalEditing=false)
Splits parts cut by the given line.
 
Q_DECL_DEPRECATED Qgis::GeometryOperationResult splitFeatures(const QVector< QgsPointXY > &splitLine, bool topologicalEditing=false)
Splits features cut by the given line.
 
bool moveVertex(double x, double y, QgsFeatureId atFeatureId, int atVertex)
Moves the vertex at the given position number, ring and item (first number is index 0),...
 
Q_DECL_DEPRECATED Qgis::GeometryOperationResult addRing(const QVector< QgsPointXY > &ring, const QgsFeatureIds &targetFeatureIds=QgsFeatureIds(), QgsFeatureId *modifiedFeatureId=nullptr)
Adds a ring to polygon/multipolygon features.
 
Encapsulate geometry and attributes for new features, to be passed to createFeatures.
 
QList< QgsVectorLayerUtils::QgsFeatureData > QgsFeaturesDataList
Alias for list of QgsFeatureData.
 
static QgsFeature createFeature(const QgsVectorLayer *layer, const QgsGeometry &geometry=QgsGeometry(), const QgsAttributeMap &attributes=QgsAttributeMap(), QgsExpressionContext *context=nullptr)
Creates a new feature ready for insertion into a layer.
 
static QgsFeatureList createFeatures(const QgsVectorLayer *layer, const QgsFeaturesDataList &featuresData, QgsExpressionContext *context=nullptr)
Creates a set of new features ready for insertion into a layer.
 
Represents a vector layer which manages a vector based dataset.
 
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
 
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
 
bool addFeatures(QgsFeatureList &features, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) FINAL
Adds a list of features to the sink.
 
Q_INVOKABLE bool deleteFeature(QgsFeatureId fid, QgsVectorLayer::DeleteContext *context=nullptr)
Deletes a feature from the layer (but does not commit it).
 
int selectedFeatureCount() const
Returns the number of features that are selected in this layer.
 
void endEditCommand()
Finish edit command and add it to undo/redo stack.
 
void destroyEditCommand()
Destroy active command and reverts all changes in it.
 
Q_INVOKABLE const QgsFeatureIds & selectedFeatureIds() const
Returns a list of the selected features IDs in this layer.
 
bool isEditable() const FINAL
Returns true if the provider is in editing mode.
 
QgsGeometryOptions * geometryOptions() const
Configuration and logic to apply automatically on any edit happening on this layer.
 
Q_INVOKABLE Qgis::WkbType wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error.
 
Q_INVOKABLE QgsVectorLayerEditBuffer * editBuffer()
Buffer with uncommitted editing operations. Only valid after editing has been turned on.
 
QgsFeatureIterator getSelectedFeatures(QgsFeatureRequest request=QgsFeatureRequest()) const
Returns an iterator of the selected features.
 
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
 
bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) FINAL
Adds a single feature to the sink.
 
Q_INVOKABLE Qgis::GeometryType geometryType() const
Returns point, line or polygon.
 
void beginEditCommand(const QString &text)
Create edit command for undo/redo operations.
 
int addTopologicalPoints(const QgsGeometry &geom)
Adds topological points for every vertex of the geometry.
 
Q_INVOKABLE bool changeAttributeValues(QgsFeatureId fid, const QgsAttributeMap &newValues, const QgsAttributeMap &oldValues=QgsAttributeMap(), bool skipDefaultValues=false, QgsVectorLayerToolsContext *context=nullptr)
Changes attributes' values for a feature (but does not immediately commit the changes).
 
bool changeGeometry(QgsFeatureId fid, QgsGeometry &geometry, bool skipDefaultValue=false)
Changes a feature's geometry within the layer's edit buffer (but does not immediately commit the chan...
 
static Q_INVOKABLE bool isSingleType(Qgis::WkbType type)
Returns true if the WKB type is a single type.
 
static Q_INVOKABLE bool hasZ(Qgis::WkbType type)
Tests whether a WKB type contains the z-dimension.
 
static Q_INVOKABLE bool hasM(Qgis::WkbType type)
Tests whether a WKB type contains m values.
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
 
QVector< QgsPoint > QgsPointSequence
 
QMap< int, QVariant > QgsAttributeMap
 
QList< QgsFeature > QgsFeatureList
 
QSet< QgsFeatureId > QgsFeatureIds
 
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
 
#define QgsDebugError(str)