QGIS API Documentation
3.16.0-Hannover (43b64b13f3)
|
Go to the documentation of this file.
114 geometry.
set(
nullptr );
124 for ( QVector<QgsPointXY>::const_iterator it = ring.constBegin(); it != ring.constEnd(); ++it )
128 return addRing( l, targetFeatureIds, modifiedFeatureId );
134 return addRing( ringLine, targetFeatureIds, modifiedFeatureId );
149 if ( !targetFeatureIds.isEmpty() )
171 if ( addRingReturnCode == 0 )
175 if ( modifiedFeatureId )
176 *modifiedFeatureId = f.
id();
184 return addRingReturnCode;
190 for ( QVector<QgsPointXY>::const_iterator it = points.constBegin(); it != points.constEnd(); ++it )
194 return addPart( l, featureId );
200 return QgsGeometry::OperationResult::AddPartSelectedGeometryNotFound;
203 bool firstPart =
false;
206 return QgsGeometry::OperationResult::AddPartSelectedGeometryNotFound;
238 bool firstPart =
false;
279 int errorCode = geometry.
translate( dx, dy );
280 if ( errorCode == 0 )
290 for ( QVector<QgsPointXY>::const_iterator it = splitLine.constBegin(); it != splitLine.constEnd(); ++it )
301 bool preserveCircular =
false;
302 return splitFeatures( &lineString, topologyTestPoints, preserveCircular, topologicalEditing );
313 int numberOfSplitFeatures = 0;
321 if ( !selectedIds.isEmpty() )
338 else if ( bBox.
height() == 0.0 && bBox.
width() > 0 )
346 double bufferDistance = 0.000001;
348 bufferDistance = 0.00000001;
366 QVector<QgsGeometry> newGeometries;
369 splitFunctionReturn = featureGeom.
splitGeometry( curve, newGeometries, preserveCircular, topologicalEditing, featureTopologyTestPoints );
370 topologyTestPoints.append( featureTopologyTestPoints );
371 if ( splitFunctionReturn == QgsGeometry::OperationResult::Success )
378 for (
const QgsGeometry &geom : qgis::as_const( newGeometries ) )
384 if ( topologicalEditing )
386 QgsPointSequence::const_iterator topol_it = featureTopologyTestPoints.constBegin();
387 for ( ; topol_it != featureTopologyTestPoints.constEnd(); ++topol_it )
392 ++numberOfSplitFeatures;
396 returnCode = splitFunctionReturn;
400 if ( numberOfSplitFeatures == 0 )
402 returnCode = QgsGeometry::OperationResult::NothingHappened;
411 for ( QVector<QgsPointXY>::const_iterator it = splitLine.constBegin(); it != splitLine.constEnd(); ++it )
423 double xMin, yMin, xMax, yMax;
427 int numberOfSplitParts = 0;
437 if ( boundingBoxFromPointList( splitLine, xMin, yMin, xMax, yMax ) )
446 return QgsGeometry::OperationResult::InvalidInputGeometryType;
457 else if ( bBox.
height() == 0.0 && bBox.
width() > 0 )
465 double bufferDistance = 0.000001;
467 bufferDistance = 0.00000001;
481 QVector<QgsGeometry> newGeometries;
484 splitFunctionReturn = featureGeom.
splitGeometry( splitLine, newGeometries, topologicalEditing, topologyTestPoints,
false );
486 if ( splitFunctionReturn == QgsGeometry::OperationResult::Success && !newGeometries.isEmpty() )
491 for (
int i = 1; i < newGeometries.size(); ++i )
500 if ( topologicalEditing )
502 QgsPointSequence::const_iterator topol_it = topologyTestPoints.constBegin();
503 for ( ; topol_it != topologyTestPoints.constEnd(); ++topol_it )
508 ++numberOfSplitParts;
510 else if ( splitFunctionReturn != QgsGeometry::OperationResult::Success && splitFunctionReturn != QgsGeometry::OperationResult::NothingHappened )
512 returnCode = splitFunctionReturn;
520 returnCode = QgsGeometry::OperationResult::NothingHappened;
557 double segmentSearchEpsilon = mLayer->
crs().
isGeographic() ? 1e-12 : 1e-8;
564 threshold = 0.0000001;
577 p.
x() + threshold, p.
y() + threshold );
578 double sqrSnappingTolerance = threshold * threshold;
582 .setFilterRect( searchRect )
584 .setNoAttributes() );
586 QMap<QgsFeatureId, QgsGeometry> features;
587 QMap<QgsFeatureId, int> segments;
594 if ( sqrDistSegmentSnap < sqrSnappingTolerance )
596 segments[f.
id()] = afterVertex;
601 if ( segments.isEmpty() )
604 bool pointsAdded =
false;
605 for ( QMap<QgsFeatureId, int>::const_iterator it = segments.constBegin(); it != segments.constEnd(); ++it )
608 int segmentAfterVertex = it.value();
611 int atVertex, beforeVertex, afterVertex;
612 double sqrDistVertexSnap;
613 geom.
closestVertex( p, atVertex, beforeVertex, afterVertex, sqrDistVertexSnap );
615 if ( sqrDistVertexSnap < sqrSnappingTolerance )
618 if ( !mLayer->
insertVertex( p, fid, segmentAfterVertex ) )
620 QgsDebugMsg( QStringLiteral(
"failed to insert topo point" ) );
628 return pointsAdded ? 0 : 2;
641 bool pointsAdded =
false;
643 QgsPointSequence::const_iterator it = ps.constBegin();
644 while ( it != ps.constEnd() )
653 return pointsAdded ? 0 : 2;
662 bool QgsVectorLayerEditUtils::boundingBoxFromPointList(
const QgsPointSequence &list,
double &xmin,
double &ymin,
double &xmax,
double &ymax )
const
669 xmin = std::numeric_limits<double>::max();
670 xmax = -std::numeric_limits<double>::max();
671 ymin = std::numeric_limits<double>::max();
672 ymax = -std::numeric_limits<double>::max();
674 for ( QgsPointSequence::const_iterator it = list.constBegin(); it != list.constEnd(); ++it )
676 if ( it->x() < xmin )
680 if ( it->x() > xmax )
684 if ( it->y() < ymin )
688 if ( it->y() > ymax )
Abstract base class for curved geometry type.
@ Success
Operation succeeded.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
static bool isSingleType(Type type) SIP_HOLDGIL
Returns true if the WKB type is a single type.
QgsCoordinateReferenceSystem crs
double geometryPrecision() const
The precision in which geometries on this layer should be saved.
double height() const SIP_HOLDGIL
Returns the height of the rectangle.
OperationResult addPart(const QVector< QgsPointXY > &points, QgsWkbTypes::GeometryType geomType=QgsWkbTypes::UnknownGeometry)
Adds a new part to a the geometry.
Q_INVOKABLE QgsWkbTypes::Type wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error.
Q_GADGET QgsUnitTypes::DistanceUnit mapUnits
Q_DECL_DEPRECATED QgsGeometry::OperationResult splitParts(const QVector< QgsPointXY > &splitLine, bool topologicalEditing=false)
Splits parts cut by the given line.
@ ExactIntersect
Use exact geometry intersection (slower) instead of bounding boxes.
Point geometry type, with support for z-dimension and m-values.
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...
@ NothingHappened
Nothing happened, without any error.
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
QgsGeometryOptions * geometryOptions() const
Configuration and logic to apply automatically on any edit happening on this layer.
OperationResult addRing(const QVector< QgsPointXY > &ring)
Adds a new ring to this geometry.
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
virtual bool doesStrictFeatureTypeCheck() const
Returns true if the provider is strict about the type of inserted features (e.g.
OperationResult
Success or failure of a geometry operation.
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...
Line string geometry type, with support for z-dimension and m-values.
QgsPointXY closestVertex(const QgsPointXY &point, int &atVertex, int &beforeVertex, int &afterVertex, double &sqrDist) const
Returns the vertex closest to the given point, the corresponding vertex index, squared distance snap ...
A rectangle specified with double values.
int addTopologicalPoints(const QgsGeometry &geom)
Adds topological points for every vertex of the geometry.
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...
@ AddPartSelectedGeometryNotFound
The selected geometry cannot be found.
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...
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
This class wraps a request for features to a vector layer (or directly its vector data provider).
@ EmptyGeometry
Edit operation resulted in an empty geometry.
@ EditFailed
Edit operation failed.
Q_DECL_DEPRECATED QgsGeometry::OperationResult addPart(const QVector< QgsPointXY > &ring, QgsFeatureId featureId)
Adds a new part polygon to a multipart feature.
int translateFeature(QgsFeatureId featureId, double dx, double dy)
Translates feature by dx, dy.
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),...
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
bool convertToSingleType()
Converts multi type geometry into single type geometry e.g.
Q_INVOKABLE const QgsFeatureIds & selectedFeatureIds() const
Returns a list of the selected features IDs in this layer.
bool deleteVertex(int atVertex)
Deletes the vertex at the given position number and item (first number is index 0)
QMap< int, QVariant > QgsAttributeMap
@ DistanceFeet
Imperial feet.
void setXMinimum(double x) SIP_HOLDGIL
Set the minimum x value.
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.
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
QgsAttributeMap toMap() const
Returns a QgsAttributeMap of the attribute values.
Q_DECL_DEPRECATED OperationResult splitGeometry(const QVector< QgsPointXY > &splitLine, QVector< QgsGeometry > &newGeometries, bool topological, QVector< QgsPointXY > &topologyTestPoints, bool splitFeature=true)
Splits this geometry according to a given line.
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QSet< QgsFeatureId > QgsFeatureIds
void setXMaximum(double x) SIP_HOLDGIL
Set the maximum x value.
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.
Q_DECL_DEPRECATED QgsGeometry::OperationResult splitFeatures(const QVector< QgsPointXY > &splitLine, bool topologicalEditing=false)
Splits features cut by the given line.
A class to represent a 2D point.
void setYMaximum(double y) SIP_HOLDGIL
Set the maximum y value.
QgsCurve * clone() const override=0
Clones the geometry by performing a deep copy.
QgsFeatureIterator getSelectedFeatures(QgsFeatureRequest request=QgsFeatureRequest()) const
Returns an iterator of the selected features.
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
The vertex_iterator class provides STL-style iterator for vertices.
bool nextFeature(QgsFeature &f)
void setYMinimum(double y) SIP_HOLDGIL
Set the minimum y value.
QVector< QgsPoint > QgsPointSequence
A geometry is the spatial representation of a feature.
Represents a vector layer which manages a vector based data sets.
@ InvalidBaseGeometry
The base geometry on which the operation is done is invalid or empty.
bool hasGeometry() const
Returns true if the feature has an associated geometry.
double width() const SIP_HOLDGIL
Returns the width of the rectangle.
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)...
bool convertToMultiType()
Converts single type geometry into multitype geometry e.g.
OperationResult translate(double dx, double dy, double dz=0.0, double dm=0.0)
Translates this geometry by dx, dy, dz and dm.
QgsRectangle boundingBox() const override
Returns the minimal bounding box for the geometry.
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
@ FetchFeatureFailed
Unable to fetch requested feature.
@ InvalidLayer
Edit failed due to invalid layer.
QgsVectorLayerEditUtils(QgsVectorLayer *layer)
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
QgsAbstractGeometry::vertex_iterator vertices_end() const
Returns STL-style iterator pointing to the imaginary vertex after the last vertex of the geometry.
Q_DECL_DEPRECATED QgsGeometry::OperationResult addRing(const QVector< QgsPointXY > &ring, const QgsFeatureIds &targetFeatureIds=QgsFeatureIds(), QgsFeatureId *modifiedFeatureId=nullptr)
Adds a ring to polygon/multipolygon features.
int selectedFeatureCount() const
Returns the number of features that are selected in this layer.
EditResult
Result of an edit operation.
QgsAbstractGeometry::vertex_iterator vertices_begin() const
Returns STL-style iterator pointing to the first vertex of the geometry.
@ Success
Edit operation was successful.
Wrapper for iterator of features from vector data provider or vector layer.
Q_INVOKABLE QgsWkbTypes::GeometryType geometryType() const
Returns point, line or polygon.
bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) FINAL
Adds a single feature to the sink.
bool isEmpty() const
Returns true if the rectangle is empty.
@ AddRingNotInExistingFeature
The input ring doesn't have any existing ring to fit into.
void set(QgsAbstractGeometry *geometry)
Sets the underlying geometry store.
QgsVectorLayer::EditResult deleteVertex(QgsFeatureId featureId, int vertex)
Deletes a vertex from a feature.
double closestSegmentWithContext(const QgsPointXY &point, QgsPointXY &minDistPoint, int &afterVertex, int *leftOf=nullptr, double epsilon=DEFAULT_SEGMENT_EPSILON) const
Searches for the closest segment of geometry to the given point.
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features