114 geometry.
set(
nullptr );
136 if ( !ring->isClosed() )
150 if ( !targetFeatureIds.isEmpty() )
171 addRingReturnCode = g.
addRing(
static_cast< QgsCurve *
>( ring->clone() ) );
175 if ( modifiedFeatureIds )
177 modifiedFeatureIds->insert( f.
id() );
187 return addRingReturnCode;
193 for ( QVector<QgsPointXY>::const_iterator it = ring.constBegin(); it != ring.constEnd(); ++it )
197 return addRing( l, targetFeatureIds, modifiedFeatureId );
203 return addRing( ringLine, targetFeatureIds, modifiedFeatureId );
208 std::unique_ptr<QgsCurve> uniquePtrRing( ring );
209 if ( modifiedFeatureId )
213 *modifiedFeatureId = *modifiedFeatureIds->begin();
216 return staticAddRing( mLayer, uniquePtrRing, targetFeatureIds,
nullptr,
true );
222 std::unique_ptr<QgsCurve> uniquePtrRing( ring );
223 return staticAddRing( mLayer, uniquePtrRing, targetFeatureIds, modifiedFeatureIds,
false );
231 for ( QVector<QgsPointXY>::const_iterator it = points.constBegin(); it != points.constEnd(); ++it )
235 return addPart( l, featureId );
244 bool firstPart =
false;
279 bool firstPart =
false;
331 for ( QVector<QgsPointXY>::const_iterator it = splitLine.constBegin(); it != splitLine.constEnd(); ++it )
342 bool preserveCircular =
false;
343 return splitFeatures( &lineString, topologyTestPoints, preserveCircular, topologicalEditing );
354 int numberOfSplitFeatures = 0;
362 if ( !selectedIds.isEmpty() )
379 else if ( bBox.
height() == 0.0 && bBox.
width() > 0 )
387 double bufferDistance = 0.000001;
389 bufferDistance = 0.00000001;
409 QVector<QgsGeometry> newGeometries;
412 splitFunctionReturn = featureGeom.
splitGeometry( curve, newGeometries, preserveCircular, topologicalEditing, featureTopologyTestPoints );
413 topologyTestPoints.append( featureTopologyTestPoints );
421 for (
const QgsGeometry &geom : std::as_const( newGeometries ) )
426 if ( topologicalEditing )
428 QgsPointSequence::const_iterator topol_it = featureTopologyTestPoints.constBegin();
429 for ( ; topol_it != featureTopologyTestPoints.constEnd(); ++topol_it )
434 ++numberOfSplitFeatures;
438 returnCode = splitFunctionReturn;
442 if ( !featuresDataToAdd.isEmpty() )
450 if ( numberOfSplitFeatures == 0 )
461 for ( QVector<QgsPointXY>::const_iterator it = splitLine.constBegin(); it != splitLine.constEnd(); ++it )
473 double xMin, yMin, xMax, yMax;
475 int numberOfSplitParts = 0;
485 if ( boundingBoxFromPointList( splitLine, xMin, yMin, xMax, yMax ) )
505 else if ( bBox.
height() == 0.0 && bBox.
width() > 0 )
513 double bufferDistance = 0.000001;
515 bufferDistance = 0.00000001;
532 QVector<QgsGeometry> resultCollection;
536 QVector<QgsGeometry> newGeometries;
539 const Qgis::GeometryOperationResult splitFunctionReturn = part.splitGeometry( splitLine, newGeometries, topologicalEditing, partTopologyTestPoints,
false );
543 for (
int i = 0; i < newGeometries.size(); ++i )
545 resultCollection.append( newGeometries.at( i ).asGeometryCollection() );
548 topologyTestPoints.append( partTopologyTestPoints );
550 ++numberOfSplitParts;
558 resultCollection.append( part );
562 return splitFunctionReturn;
569 if ( topologicalEditing )
571 QgsPointSequence::const_iterator topol_it = topologyTestPoints.constBegin();
572 for ( ; topol_it != topologyTestPoints.constEnd(); ++topol_it )
600 bool pointsAdded =
false;
612 return pointsAdded ? 0 : 2;
620 double segmentSearchEpsilon = mLayer->
crs().
isGeographic() ? 1e-12 : 1e-8;
627 threshold = 0.0000001;
640 p.
x() + threshold, p.
y() + threshold );
641 double sqrSnappingTolerance = threshold * threshold;
645 .setFilterRect( searchRect )
647 .setNoAttributes() );
649 QMap<QgsFeatureId, QgsGeometry> features;
650 QMap<QgsFeatureId, int> segments;
657 if ( sqrDistSegmentSnap < sqrSnappingTolerance )
659 segments[f.
id()] = afterVertex;
664 if ( segments.isEmpty() )
667 bool pointsAdded =
false;
668 for ( QMap<QgsFeatureId, int>::const_iterator it = segments.constBegin(); it != segments.constEnd(); ++it )
671 int segmentAfterVertex = it.value();
674 int atVertex, beforeVertex, afterVertex;
675 double sqrDistVertexSnap;
676 geom.
closestVertex( p, atVertex, beforeVertex, afterVertex, sqrDistVertexSnap );
678 if ( sqrDistVertexSnap < sqrSnappingTolerance )
681 if ( !mLayer->
insertVertex( p, fid, segmentAfterVertex ) )
683 QgsDebugMsg( QStringLiteral(
"failed to insert topo point" ) );
691 return pointsAdded ? 0 : 2;
704 bool pointsAdded =
false;
706 QgsPointSequence::const_iterator it = ps.constBegin();
707 while ( it != ps.constEnd() )
716 return pointsAdded ? 0 : 2;
726 errorMessage.clear();
728 if ( mergeFeatureIds.isEmpty() )
730 errorMessage = QObject::tr(
"List of features to merge is empty" );
735 for (
int i = 0; i < mergeAttributes.count(); ++i )
737 QVariant val = mergeAttributes.at( i );
744 QString errorMessageConvertCompatible;
747 if ( errorMessage.isEmpty() )
748 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 );
750 newAttributes[ i ] = val;
756 QgsFeatureIds::const_iterator feature_it = mergeFeatureIds.constBegin();
757 for ( ; feature_it != mergeFeatureIds.constEnd(); ++feature_it )
759 if ( *feature_it != targetFeatureId )
783bool QgsVectorLayerEditUtils::boundingBoxFromPointList(
const QgsPointSequence &list,
double &xmin,
double &ymin,
double &xmax,
double &ymax )
const
790 xmin = std::numeric_limits<double>::max();
791 xmax = -std::numeric_limits<double>::max();
792 ymin = std::numeric_limits<double>::max();
793 ymax = -std::numeric_limits<double>::max();
795 for ( QgsPointSequence::const_iterator it = list.constBegin(); it != list.constEnd(); ++it )
797 if ( it->x() < xmin )
801 if ( it->x() > xmax )
805 if ( it->y() < ymin )
809 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.
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 int nCoordinates() const
Returns the number of nodes contained in the geometry.
virtual bool hasCurvedSegments() const
Returns true if the geometry contains curved segments.
CORE_EXPORT QgsAttributeMap toMap() const
Returns a QgsAttributeMap of the attribute values.
QgsUnitTypes::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.
QString typeName() const
Gets the field type.
bool convertCompatible(QVariant &v, QString *errorMessage=nullptr) const
Converts the provided variant to a compatible format.
@ OriginProvider
Field comes from the underlying data provider of the vector layer (originIndex = index in provider's ...
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)
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 ...
Qgis::GeometryOperationResult addPart(const QVector< QgsPointXY > &points, QgsWkbTypes::GeometryType geomType=QgsWkbTypes::UnknownGeometry)
Adds a new part to a the geometry.
QVector< QgsGeometry > asGeometryCollection() const
Returns contents of the geometry as a list of geometries.
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.
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 xMinimum() const
Returns the x minimum value (left side of rectangle).
void setYMinimum(double y)
Set the minimum y value.
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
void setXMinimum(double x)
Set the minimum x value.
double width() const
Returns the width of the rectangle.
double xMaximum() const
Returns the x maximum value (right side of rectangle).
double yMaximum() const
Returns the y maximum value (top side of rectangle).
void setYMaximum(double y)
Set the maximum y value.
void setXMaximum(double x)
Set the maximum x value.
bool isEmpty() const
Returns true if the rectangle is empty.
double height() const
Returns the height of the rectangle.
@ DistanceFeet
Imperial feet.
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.
Q_INVOKABLE QgsWkbTypes::Type wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error.
Q_INVOKABLE QgsWkbTypes::GeometryType geometryType() const
Returns point, line or polygon.
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 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.
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(Type type)
Returns true if the WKB type is a single type.
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