129    geometry.
set( 
nullptr );
 
  151  if ( !ring->isClosed() )
 
  165  if ( !targetFeatureIds.isEmpty() )
 
  186    addRingReturnCode = g.
addRing( 
static_cast< QgsCurve * 
>( ring->clone() ) );
 
  190      if ( modifiedFeatureIds )
 
  192        modifiedFeatureIds->insert( f.
id() );
 
  202  return addRingReturnCode;
 
  208  for ( QVector<QgsPointXY>::const_iterator it = ring.constBegin(); it != ring.constEnd(); ++it )
 
  212  return addRing( l, targetFeatureIds,  modifiedFeatureId );
 
  218  return addRing( ringLine, targetFeatureIds,  modifiedFeatureId );
 
  223  std::unique_ptr<QgsCurve> uniquePtrRing( ring );
 
  224  if ( modifiedFeatureId )
 
  228    *modifiedFeatureId = *modifiedFeatureIds->begin();
 
  231  return staticAddRing( mLayer, uniquePtrRing, targetFeatureIds, 
nullptr, 
true );
 
  237  std::unique_ptr<QgsCurve> uniquePtrRing( ring );
 
  238  return staticAddRing( mLayer, uniquePtrRing, targetFeatureIds, modifiedFeatureIds, 
false );
 
  246  for ( QVector<QgsPointXY>::const_iterator it = points.constBegin(); it != points.constEnd(); ++it )
 
  250  return addPart( l, featureId );
 
  259  bool firstPart = 
false;
 
  294  bool firstPart = 
false;
 
  346  for ( QVector<QgsPointXY>::const_iterator it = splitLine.constBegin(); it != splitLine.constEnd(); ++it )
 
  357  bool preserveCircular = 
false;
 
  358  return splitFeatures( &lineString, topologyTestPoints, preserveCircular, topologicalEditing );
 
  369  int numberOfSplitFeatures = 0;
 
  377  if ( !selectedIds.isEmpty() ) 
 
  394      else if ( bBox.
height() == 0.0 && bBox.
width() > 0 )
 
  402        double bufferDistance = 0.000001;
 
  404          bufferDistance = 0.00000001;
 
  426    QVector<QgsGeometry> newGeometries;
 
  430    splitFunctionReturn = featureGeom.
splitGeometry( curve, newGeometries, preserveCircular, topologicalEditing, featureTopologyTestPoints );
 
  431    topologyTestPoints.append( featureTopologyTestPoints );
 
  439      for ( 
int fieldIdx = 0; fieldIdx < fieldCount; ++fieldIdx )
 
  453              const double originalValue = feat.
attribute( fieldIdx ).toDouble();
 
  455              double originalSize = 0;
 
  457              switch ( originalGeom.
type() )
 
  459                case Qgis::GeometryType::Point:
 
  460                case Qgis::GeometryType::Unknown:
 
  461                case Qgis::GeometryType::Null:
 
  464                case Qgis::GeometryType::Line:
 
  465                  originalSize = originalGeom.
length();
 
  467                case Qgis::GeometryType::Polygon:
 
  468                  originalSize = originalGeom.
area();
 
  473              switch ( featureGeom.
type() )
 
  475                case Qgis::GeometryType::Point:
 
  476                case Qgis::GeometryType::Unknown:
 
  477                case Qgis::GeometryType::Null:
 
  480                case Qgis::GeometryType::Line:
 
  481                  newSize = featureGeom.
length();
 
  483                case Qgis::GeometryType::Polygon:
 
  484                  newSize = featureGeom.
area();
 
  488              attributeMap.insert( fieldIdx, originalSize > 0 ? ( originalValue * newSize / originalSize ) : originalValue );
 
  495      if ( !attributeMap.isEmpty() )
 
  501      for ( 
const QgsGeometry &geom : std::as_const( newGeometries ) )
 
  504        for ( 
int fieldIdx = 0; fieldIdx < fieldCount; ++fieldIdx )
 
  516              attributeMap.insert( fieldIdx, feat.
attribute( fieldIdx ) );
 
  523                attributeMap.insert( fieldIdx, feat.
attribute( fieldIdx ) );
 
  527                const double originalValue = feat.
attribute( fieldIdx ).toDouble();
 
  529                double originalSize = 0;
 
  531                switch ( originalGeom.
type() )
 
  533                  case Qgis::GeometryType::Point:
 
  534                  case Qgis::GeometryType::Unknown:
 
  535                  case Qgis::GeometryType::Null:
 
  538                  case Qgis::GeometryType::Line:
 
  539                    originalSize = originalGeom.
length();
 
  541                  case Qgis::GeometryType::Polygon:
 
  542                    originalSize = originalGeom.
area();
 
  547                switch ( geom.type() )
 
  549                  case Qgis::GeometryType::Point:
 
  550                  case Qgis::GeometryType::Unknown:
 
  551                  case Qgis::GeometryType::Null:
 
  554                  case Qgis::GeometryType::Line:
 
  555                    newSize = geom.length();
 
  557                  case Qgis::GeometryType::Polygon:
 
  558                    newSize = geom.area();
 
  562                attributeMap.insert( fieldIdx, originalSize > 0 ? ( originalValue * newSize / originalSize ) : originalValue );
 
  576      if ( topologicalEditing )
 
  578        QgsPointSequence::const_iterator topol_it = featureTopologyTestPoints.constBegin();
 
  579        for ( ; topol_it != featureTopologyTestPoints.constEnd(); ++topol_it )
 
  584      ++numberOfSplitFeatures;
 
  588      returnCode = splitFunctionReturn;
 
  592  if ( !featuresDataToAdd.isEmpty() )
 
  600  if ( numberOfSplitFeatures == 0 )
 
  611  for ( QVector<QgsPointXY>::const_iterator it = splitLine.constBegin(); it != splitLine.constEnd(); ++it )
 
  623  double xMin, yMin, xMax, yMax;
 
  625  int numberOfSplitParts = 0;
 
  635    if ( boundingBoxFromPointList( splitLine, xMin, yMin, xMax, yMax ) )
 
  655      else if ( bBox.
height() == 0.0 && bBox.
width() > 0 )
 
  663        double bufferDistance = 0.000001;
 
  665          bufferDistance = 0.00000001;
 
  682    QVector<QgsGeometry> resultCollection;
 
  686      QVector<QgsGeometry> newGeometries;
 
  689      const Qgis::GeometryOperationResult splitFunctionReturn = part.splitGeometry( splitLine, newGeometries, topologicalEditing, partTopologyTestPoints, 
false );
 
  693        for ( 
int i = 0; i < newGeometries.size(); ++i )
 
  695          resultCollection.append( newGeometries.at( i ).asGeometryCollection() );
 
  698        topologyTestPoints.append( partTopologyTestPoints );
 
  700        ++numberOfSplitParts;
 
  708        resultCollection.append( part );
 
  712        return splitFunctionReturn;
 
  719    if ( topologicalEditing )
 
  721      QgsPointSequence::const_iterator topol_it = topologyTestPoints.constBegin();
 
  722      for ( ; topol_it != topologyTestPoints.constEnd(); ++topol_it )
 
  750  bool pointsAdded = 
false;
 
  762  return pointsAdded ? 0 : 2;
 
  770  double segmentSearchEpsilon = mLayer->
crs().
isGeographic() ? 1e-12 : 1e-8;
 
  777    threshold = 0.0000001;
 
  779    if ( mLayer->
crs().
mapUnits() == Qgis::DistanceUnit::Meters )
 
  783    else if ( mLayer->
crs().
mapUnits() == Qgis::DistanceUnit::Feet )
 
  790                           p.
x() + threshold, p.
y() + threshold );
 
  791  double sqrSnappingTolerance = threshold * threshold;
 
  795                           .setFilterRect( searchRect )
 
  797                           .setNoAttributes() );
 
  799  QMap<QgsFeatureId, QgsGeometry> features;
 
  800  QMap<QgsFeatureId, int> segments;
 
  807    if ( sqrDistSegmentSnap < sqrSnappingTolerance )
 
  809      segments[f.
id()] = afterVertex;
 
  814  if ( segments.isEmpty() )
 
  817  bool pointsAdded = 
false;
 
  818  for ( QMap<QgsFeatureId, int>::const_iterator it = segments.constBegin(); it != segments.constEnd(); ++it )
 
  821    int segmentAfterVertex = it.value();
 
  824    int atVertex, beforeVertex, afterVertex;
 
  825    double sqrDistVertexSnap;
 
  826    geom.
closestVertex( p, atVertex, beforeVertex, afterVertex, sqrDistVertexSnap );
 
  828    if ( sqrDistVertexSnap < sqrSnappingTolerance )
 
  831    if ( !mLayer->
insertVertex( p, fid, segmentAfterVertex ) )
 
  833      QgsDebugError( QStringLiteral( 
"failed to insert topo point" ) );
 
  841  return pointsAdded ? 0 : 2;
 
  854  bool pointsAdded = 
false;
 
  856  QgsPointSequence::const_iterator it = ps.constBegin();
 
  857  while ( it != ps.constEnd() )
 
  866  return pointsAdded ? 0 : 2;
 
  876  errorMessage.clear();
 
  878  if ( mergeFeatureIds.isEmpty() )
 
  880    errorMessage = QObject::tr( 
"List of features to merge is empty" );
 
  885  for ( 
int i = 0; i < mergeAttributes.count(); ++i )
 
  887    QVariant val = mergeAttributes.at( i );
 
  894    QString errorMessageConvertCompatible;
 
  897      if ( errorMessage.isEmpty() )
 
  898        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 );
 
  900    newAttributes[ i ] = val;
 
  906  QgsFeatureIds::const_iterator feature_it = mergeFeatureIds.constBegin();
 
  907  for ( ; feature_it != mergeFeatureIds.constEnd(); ++feature_it )
 
  909    if ( *feature_it != targetFeatureId )
 
  933bool QgsVectorLayerEditUtils::boundingBoxFromPointList( 
const QgsPointSequence &list, 
double &xmin, 
double &ymin, 
double &xmax, 
double &ymax )
 const 
  940  xmin = std::numeric_limits<double>::max();
 
  941  xmax = -std::numeric_limits<double>::max();
 
  942  ymin = std::numeric_limits<double>::max();
 
  943  ymax = -std::numeric_limits<double>::max();
 
  945  for ( QgsPointSequence::const_iterator it = list.constBegin(); it != list.constEnd(); ++it )
 
  947    if ( it->x() < xmin )
 
  951    if ( it->x() > xmax )
 
  955    if ( it->y() < ymin )
 
  959    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.
 
@ 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.
 
VectorEditResult
Flags which control feature selection behavior.
 
@ 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 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 is3D() const SIP_HOLDGIL
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.
 
bool isMeasure() const SIP_HOLDGIL
Returns true if the geometry contains m values.
 
Q_GADGET Qgis::DistanceUnit mapUnits
 
Abstract base class for curved geometry type.
 
QgsRectangle boundingBox() const override
Returns the minimal bounding box for the geometry.
 
Wrapper for iterator of features from vector data provider or vector layer.
 
bool nextFeature(QgsFeature &f)
 
This class wraps a request for features to a vector layer (or directly its vector data provider).
 
@ ExactIntersect
Use exact geometry intersection (slower) instead of bounding boxes.
 
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.
 
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...
 
@ OriginProvider
Field comes from the underlying data provider of the vector layer (originIndex = index in provider's ...
 
int count() const
Returns number of items.
 
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.
 
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
 
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.
 
static QgsGeometry collectGeometry(const QVector< QgsGeometry > &geometries)
Creates a new multipart geometry from a list of QgsGeometry objects.
 
QgsPointXY closestVertex(const QgsPointXY &point, int &closestVertexIndex, int &previousVertexIndex, int &nextVertexIndex, double &sqrDist) const
Returns the vertex closest to the given point, the corresponding vertex index, squared distance snap ...
 
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.
 
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::GeometryOperationResult addPart(const QVector< QgsPointXY > &points, Qgis::GeometryType geomType=Qgis::GeometryType::Unknown)
Adds a new part to a the geometry.
 
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.
 
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...
 
double closestSegmentWithContext(const QgsPointXY &point, QgsPointXY &minDistPoint, int &nextVertexIndex, int *leftOrRightOfSegment=nullptr, double epsilon=DEFAULT_SEGMENT_EPSILON) const
Searches for the closest segment of geometry to the given point.
 
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.
 
QgsCoordinateReferenceSystem crs
 
void triggerRepaint(bool deferredUpdate=false)
Will advise the map canvas (and any other interested party) that this layer requires to be repainted.
 
A class to represent a 2D point.
 
Point geometry type, with support for z-dimension and m-values.
 
A rectangle specified with double values.
 
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
 
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
 
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
 
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
 
void setYMinimum(double y) SIP_HOLDGIL
Set the minimum y value.
 
void setXMaximum(double x) SIP_HOLDGIL
Set the maximum x value.
 
void setXMinimum(double x) SIP_HOLDGIL
Set the minimum x value.
 
double height() const SIP_HOLDGIL
Returns the height of the rectangle.
 
void setYMaximum(double y) SIP_HOLDGIL
Set the maximum y value.
 
double width() const SIP_HOLDGIL
Returns the width of the rectangle.
 
bool isEmpty() const
Returns true if the rectangle is empty.
 
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 data sets.
 
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
 
bool deleteFeature(QgsFeatureId fid, DeleteContext *context=nullptr)
Deletes a feature from the layer (but does not commit it).
 
bool insertVertex(double x, double y, QgsFeatureId atFeatureId, int beforeVertex)
Inserts a new vertex before the given vertex number, in the given ring, item (first number is index 0...
 
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
 
QgsFields fields() const FINAL
Returns the list of fields of this layer.
 
bool addFeatures(QgsFeatureList &features, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) FINAL
Adds a list of features to the sink.
 
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.
 
Q_INVOKABLE const QgsFeatureIds & selectedFeatureIds() const
Returns a list of the selected features IDs in this layer.
 
bool changeAttributeValues(QgsFeatureId fid, const QgsAttributeMap &newValues, const QgsAttributeMap &oldValues=QgsAttributeMap(), bool skipDefaultValues=false)
Changes attributes' values for a feature (but does not immediately commit the changes).
 
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.
 
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 bool isSingleType(Qgis::WkbType type) SIP_HOLDGIL
Returns true if the WKB type is a single type.
 
static bool hasZ(Qgis::WkbType type) SIP_HOLDGIL
Tests whether a WKB type contains the z-dimension.
 
static bool hasM(Qgis::WkbType type) SIP_HOLDGIL
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)