Skip to content

Commit fde740a

Browse files
committedOct 23, 2017
Re-add QgsGeometryEngine::combine taking a list of QgsAbstractGeometries
1 parent efc00c3 commit fde740a

File tree

4 files changed

+40
-0
lines changed

4 files changed

+40
-0
lines changed
 

‎python/core/geometry/qgsgeometryengine.sip

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,14 @@ class QgsGeometryEngine
7373
%Docstring
7474
Calculate the combination of this and ``geom``.
7575

76+
.. versionadded:: 3.0
77+
:rtype: QgsAbstractGeometry
78+
%End
79+
80+
virtual QgsAbstractGeometry *combine( const QList<QgsAbstractGeometry *> &geomList, QString *errorMsg ) const = 0 /Factory/;
81+
%Docstring
82+
Calculate the combination of this and ``geometries``.
83+
7684
.. versionadded:: 3.0
7785
:rtype: QgsAbstractGeometry
7886
%End

‎src/core/geometry/qgsgeometryengine.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ class CORE_EXPORT QgsGeometryEngine
9191
*/
9292
virtual QgsAbstractGeometry *combine( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const = 0 SIP_FACTORY;
9393

94+
/**
95+
* Calculate the combination of this and \a geometries.
96+
*
97+
* \since QGIS 3.0 \a geom is a pointer
98+
*/
99+
virtual QgsAbstractGeometry *combine( const QList<QgsAbstractGeometry *> &geomList, QString *errorMsg ) const = 0 SIP_FACTORY;
100+
94101
/**
95102
* Calculate the combination of this and \a geometries.
96103
*

‎src/core/geometry/qgsgeos.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,30 @@ QgsAbstractGeometry *QgsGeos::combine( const QgsAbstractGeometry *geom, QString
308308
return overlay( geom, OverlayUnion, errorMsg ).release();
309309
}
310310

311+
QgsAbstractGeometry *QgsGeos::combine( const QList<QgsAbstractGeometry *> &geomList, QString *errorMsg ) const
312+
{
313+
QVector< GEOSGeometry * > geosGeometries;
314+
geosGeometries.reserve( geomList.size() );
315+
for ( const QgsAbstractGeometry *g : geomList )
316+
{
317+
if ( !g )
318+
continue;
319+
320+
geosGeometries << asGeos( g, mPrecision ).release();
321+
}
322+
323+
geos::unique_ptr geomUnion;
324+
try
325+
{
326+
geos::unique_ptr geomCollection = createGeosCollection( GEOS_GEOMETRYCOLLECTION, geosGeometries );
327+
geomUnion.reset( GEOSUnaryUnion_r( geosinit.ctxt, geomCollection.get() ) );
328+
}
329+
CATCH_GEOS_WITH_ERRMSG( nullptr )
330+
331+
std::unique_ptr< QgsAbstractGeometry > result = fromGeos( geomUnion.get() );
332+
return result.release();
333+
}
334+
311335
QgsAbstractGeometry *QgsGeos::combine( const QList<QgsGeometry> &geomList, QString *errorMsg ) const
312336
{
313337
QVector< GEOSGeometry * > geosGeometries;

‎src/core/geometry/qgsgeos.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ class CORE_EXPORT QgsGeos: public QgsGeometryEngine
135135
std::unique_ptr< QgsAbstractGeometry > subdivide( int maxNodes, QString *errorMsg = nullptr ) const;
136136

137137
QgsAbstractGeometry *combine( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const override;
138+
QgsAbstractGeometry *combine( const QList<QgsAbstractGeometry *> &geomList, QString *errorMsg ) const override;
138139
QgsAbstractGeometry *combine( const QList< QgsGeometry > &, QString *errorMsg = nullptr ) const override;
139140
QgsAbstractGeometry *symDifference( const QgsAbstractGeometry *geom, QString *errorMsg = nullptr ) const override;
140141
QgsAbstractGeometry *buffer( double distance, int segments, QString *errorMsg = nullptr ) const override;

0 commit comments

Comments
 (0)
Please sign in to comment.