34 QVector< QgsCurvePolygon * > polygonList;
35 QgsCurvePolygon *curvePoly = qgsgeometry_cast< QgsCurvePolygon * >( geom );
39 polygonList.append( curvePoly );
46 polygonList.append( qgsgeometry_cast< QgsCurvePolygon * >( multiGeom->
geometryN( i ) ) );
55 if ( !ring->isClosed() )
59 else if ( !ring->isRing() )
65 ringGeom->prepareGeometry();
68 QVector< QgsCurvePolygon * >::const_iterator polyIter = polygonList.constBegin();
69 for ( ; polyIter != polygonList.constEnd(); ++polyIter )
71 if ( ringGeom->within( *polyIter ) )
74 const int nInnerRings = ( *polyIter )->numInteriorRings();
75 for (
int i = 0; i < nInnerRings; ++i )
77 if ( !ringGeom->disjoint( ( *polyIter )->interiorRing( i ) ) )
89 ( *polyIter )->addInteriorRing( ring.release() );
110 if ( !geomCollection )
119 QgsCurve *curve = qgsgeometry_cast<QgsCurve *>( part.get() );
123 std::unique_ptr<QgsCurvePolygon> poly;
126 poly = std::make_unique< QgsPolygon >();
130 poly = std::make_unique< QgsCurvePolygon >();
132 poly->setExteriorRing( qgsgeometry_cast<QgsCurve *>( part.release() ) );
133 added = geomCollection->
addGeometry( poly.release() );
139 if (
const QgsCurvePolygon *curvePolygon = qgsgeometry_cast< const QgsCurvePolygon *>( part.get() ) )
144 std::unique_ptr< QgsCurvePolygon > polygon( curvePolygon->toPolygon() );
145 part = std::move( polygon );
147 added = geomCollection->
addGeometry( qgsgeometry_cast<QgsCurvePolygon *>( part.release() ) );
151 added = geomCollection->
addGeometry( part.release() );
157 std::unique_ptr<QgsGeometryCollection> parts(
static_cast<QgsGeometryCollection *
>( part.release() ) );
161 for ( i = 0; i < parts->numGeometries(); i++ )
163 if ( !geomCollection->
addGeometry( parts->geometryN( i )->clone() ) )
167 added = i == parts->numGeometries();
186 std::unique_ptr<QgsGeometryCollection> parts( qgsgeometry_cast<QgsGeometryCollection *>( part.release() ) );
190 for ( i = 0; i < parts->numGeometries(); i++ )
192 if ( !geomCollection->
addGeometry( parts->geometryN( i )->clone() ) )
196 added = i == parts->numGeometries();
206 if (
QgsCurve *curve = qgsgeometry_cast<QgsCurve *>( part.get() ) )
211 std::unique_ptr< QgsCurve > line( curve->segmentize() );
212 part = std::move( line );
214 added = geomCollection->
addGeometry( qgsgeometry_cast<QgsCurve *>( part.release() ) );
218 added = geomCollection->
addGeometry( part.release() );
224 added = geomCollection->
addGeometry( part.release() );
231 if ( !geom || partNum < 0 )
245 g =
c->geometryN( partNum );
247 else if ( partNum > 0 )
275 return c->removeGeometry( partNum );
279 const QList<QgsVectorLayer *> &avoidIntersectionsLayers,
280 bool &haveInvalidGeometry,
281 const QHash<
QgsVectorLayer *, QSet<QgsFeatureId> > &ignoreFeatures
285 haveInvalidGeometry =
false;
300 if ( avoidIntersectionsLayers.isEmpty() )
303 QVector< QgsGeometry > nearGeometries;
309 const QHash<QgsVectorLayer *, QSet<qint64> >::const_iterator ignoreIt = ignoreFeatures.constFind( currentLayer );
310 if ( ignoreIt != ignoreFeatures.constEnd() )
311 ignoreIds = ignoreIt.value();
319 if ( ignoreIds.contains( f.
id() ) )
326 haveInvalidGeometry =
true;
332 if ( nearGeometries.isEmpty() )
337 const std::unique_ptr< QgsAbstractGeometry > combinedGeometries( geomEngine->combine( nearGeometries ) );
338 if ( !combinedGeometries )
343 std::unique_ptr< QgsAbstractGeometry > diffGeom( geomEngine->difference( combinedGeometries.get() ) );
344 if ( geomEngine->isEqual( diffGeom.get() ) )
GeometryOperationResult
Success or failure of a geometry operation.
@ 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.
@ AddRingCrossesExistingRings
The input ring crosses existing rings (it is not disjoint)
@ AddPartNotMultiGeometry
The source geometry is not multi.
@ AddRingNotClosed
The input ring is not closed.
@ InvalidBaseGeometry
The base geometry on which the operation is done is invalid or empty.
@ AddRingNotValid
The input ring is not valid.
WkbType
The WKB type describes the number of dimensions a geometry has.
@ MultiPolygon
MultiPolygon.
@ MultiLineString
MultiLineString.
@ CurvePolygon
CurvePolygon.
@ MultiSurface
MultiSurface.
Abstract base class for all geometries.
virtual QgsRectangle boundingBox() const =0
Returns the minimal bounding box for the geometry.
Qgis::WkbType wkbType() const SIP_HOLDGIL
Returns the WKB type of the geometry.
Curve polygon geometry type.
bool removeInteriorRing(int ringIndex)
Removes an interior ring from the polygon.
Abstract base class for curved geometry type.
virtual int numPoints() const =0
Returns the number of points in the curve.
virtual bool isClosed() const SIP_HOLDGIL
Returns true if the curve is closed.
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).
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.
@ ExactIntersect
Use exact geometry intersection (slower) instead of bounding boxes.
QgsFeatureRequest & setNoAttributes()
Set that no attributes will be fetched.
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.
int numGeometries() const SIP_HOLDGIL
Returns the number of geometries within the collection.
virtual bool removeGeometry(int nr)
Removes a geometry from the collection.
virtual bool addGeometry(QgsAbstractGeometry *g)
Adds a geometry and takes ownership. Returns true in case of success.
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
static Qgis::GeometryOperationResult addRing(QgsAbstractGeometry *geometry, std::unique_ptr< QgsCurve > ring)
Add an interior ring to a geometry.
static std::unique_ptr< QgsAbstractGeometry > avoidIntersections(const QgsAbstractGeometry &geom, const QList< QgsVectorLayer * > &avoidIntersectionsLayers, bool &haveInvalidGeometry, const QHash< QgsVectorLayer *, QSet< QgsFeatureId > > &ignoreFeatures=(QHash< QgsVectorLayer *, QSet< QgsFeatureId > >()))
Alters a geometry so that it avoids intersections with features from all open vector layers.
static bool deletePart(QgsAbstractGeometry *geom, int partNum)
Deletes a part from a geometry.
static bool deleteRing(QgsAbstractGeometry *geom, int ringNum, int partNum=0)
Deletes a ring from a geometry.
static Qgis::GeometryOperationResult addPart(QgsAbstractGeometry *geometry, std::unique_ptr< QgsAbstractGeometry > part)
Add a part to multi type geometry.
bool isGeosValid(Qgis::GeometryValidityFlags flags=Qgis::GeometryValidityFlags()) const
Checks validity of the geometry using GEOS.
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry)
Creates and returns a new geometry engine representing the specified geometry.
Represents a vector layer which manages a vector based data sets.
static Qgis::GeometryType geometryType(Qgis::WkbType type) SIP_HOLDGIL
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
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.
static Qgis::WkbType flatType(Qgis::WkbType type) SIP_HOLDGIL
Returns the flat type for a WKB type.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
QSet< QgsFeatureId > QgsFeatureIds