diff --git a/python/core/geometry/qgsgeometryengine.sip b/python/core/geometry/qgsgeometryengine.sip index 27092fe29ec..83c01450d51 100644 --- a/python/core/geometry/qgsgeometryengine.sip +++ b/python/core/geometry/qgsgeometryengine.sip @@ -17,6 +17,7 @@ class QgsGeometryEngine virtual QgsAbstractGeometryV2* combine( const QList< const QgsAbstractGeometryV2* > ) const = 0; virtual QgsAbstractGeometryV2* symDifference( const QgsAbstractGeometryV2& geom ) const = 0; virtual QgsAbstractGeometryV2* buffer( double distance, int segments ) const = 0; + virtual QgsAbstractGeometryV2* buffer( double distance, int segments, int endCapStyle, int joinStyle, double mitreLimit ) const = 0; virtual QgsAbstractGeometryV2* simplify( double tolerance ) const = 0; virtual QgsAbstractGeometryV2* interpolate( double distance ) const = 0; virtual bool centroid( QgsPointV2& pt ) const = 0; diff --git a/python/core/geometry/qgsgeos.sip b/python/core/geometry/qgsgeos.sip index 92295884424..da3235d3e67 100644 --- a/python/core/geometry/qgsgeos.sip +++ b/python/core/geometry/qgsgeos.sip @@ -18,6 +18,7 @@ class QgsGeos: public QgsGeometryEngine QgsAbstractGeometryV2* combine( const QList< const QgsAbstractGeometryV2* > ) const; QgsAbstractGeometryV2* symDifference( const QgsAbstractGeometryV2& geom ) const; QgsAbstractGeometryV2* buffer( double distance, int segments ) const; + QgsAbstractGeometryV2* buffer( double distance, int segments, int endCapStyle, int joinStyle, double mitreLimit ) const; QgsAbstractGeometryV2* simplify( double tolerance ) const; QgsAbstractGeometryV2* interpolate( double distance ) const; bool centroid( QgsPointV2& pt ) const; diff --git a/src/core/geometry/qgsgeometry.cpp b/src/core/geometry/qgsgeometry.cpp index 293d4953d36..802da5298e1 100644 --- a/src/core/geometry/qgsgeometry.cpp +++ b/src/core/geometry/qgsgeometry.cpp @@ -1192,26 +1192,18 @@ QgsGeometry* QgsGeometry::buffer( double distance, int segments ) const QgsGeometry* QgsGeometry::buffer( double distance, int segments, int endCapStyle, int joinStyle, double mitreLimit ) const { - return 0; //todo... - -#if 0 -#if defined(GEOS_VERSION_MAJOR) && defined(GEOS_VERSION_MINOR) && \ - ((GEOS_VERSION_MAJOR>3) || ((GEOS_VERSION_MAJOR==3) && (GEOS_VERSION_MINOR>=3))) - if ( mDirtyGeos ) - exportWkbToGeos(); - - if ( !mGeos ) - return 0; - - try + if ( !d || !d->geometry ) { - return fromGeosGeom( GEOSBufferWithStyle( mGeos, distance, segments, endCapStyle, joinStyle, mitreLimit ) ); + return 0; } - CATCH_GEOS( 0 ) -#else - return 0; -#endif -#endif //0 + + QgsGeos g( d->geometry ); + QgsAbstractGeometryV2* geom = g.buffer( distance, segments, endCapStyle, joinStyle, mitreLimit ); + if ( !geom ) + { + return 0; + } + return new QgsGeometry( geom ); } QgsGeometry* QgsGeometry::offsetCurve( double distance, int segments, int joinStyle, double mitreLimit ) const @@ -1484,7 +1476,7 @@ int QgsGeometry::avoidIntersections( QMap void QgsGeometry::validateGeometry( QList &errors ) { -//todo // QgsGeometryValidator::validateGeometry( this, errors ); + QgsGeometryValidator::validateGeometry( this, errors ); } bool QgsGeometry::isGeosValid() const diff --git a/src/core/geometry/qgsgeometryengine.h b/src/core/geometry/qgsgeometryengine.h index 7622b027205..b863cc355a7 100644 --- a/src/core/geometry/qgsgeometryengine.h +++ b/src/core/geometry/qgsgeometryengine.h @@ -38,6 +38,7 @@ class CORE_EXPORT QgsGeometryEngine virtual QgsAbstractGeometryV2* combine( const QList< const QgsAbstractGeometryV2* > ) const = 0; virtual QgsAbstractGeometryV2* symDifference( const QgsAbstractGeometryV2& geom ) const = 0; virtual QgsAbstractGeometryV2* buffer( double distance, int segments ) const = 0; + virtual QgsAbstractGeometryV2* buffer( double distance, int segments, int endCapStyle, int joinStyle, double mitreLimit ) const = 0; virtual QgsAbstractGeometryV2* simplify( double tolerance ) const = 0; virtual QgsAbstractGeometryV2* interpolate( double distance ) const = 0; virtual bool centroid( QgsPointV2& pt ) const = 0; diff --git a/src/core/geometry/qgsgeos.cpp b/src/core/geometry/qgsgeos.cpp index 3f842c9be4a..c5dda29db36 100644 --- a/src/core/geometry/qgsgeos.cpp +++ b/src/core/geometry/qgsgeos.cpp @@ -1184,6 +1184,28 @@ QgsAbstractGeometryV2* QgsGeos::buffer( double distance, int segments ) const return fromGeos( geos ); } +QgsAbstractGeometryV2 *QgsGeos::buffer( double distance, int segments, int endCapStyle, int joinStyle, double mitreLimit ) const +{ + if ( !mGeos ) + { + return 0; + } + +#if defined(GEOS_VERSION_MAJOR) && defined(GEOS_VERSION_MINOR) && \ + ((GEOS_VERSION_MAJOR>3) || ((GEOS_VERSION_MAJOR==3) && (GEOS_VERSION_MINOR>=3))) + + GEOSGeometry* geos = 0; + try + { + geos = GEOSBufferWithStyle_r( geosinit.ctxt, mGeos, distance, segments, endCapStyle, joinStyle, mitreLimit ); + } + CATCH_GEOS( 0 ); + return fromGeos( geos ); +#else + return 0; +#endif //0 +} + QgsAbstractGeometryV2* QgsGeos::simplify( double tolerance ) const { if ( !mGeos ) diff --git a/src/core/geometry/qgsgeos.h b/src/core/geometry/qgsgeos.h index 00b12d1084c..80c143dbf92 100644 --- a/src/core/geometry/qgsgeos.h +++ b/src/core/geometry/qgsgeos.h @@ -40,6 +40,7 @@ class CORE_EXPORT QgsGeos: public QgsGeometryEngine QgsAbstractGeometryV2* combine( const QList< const QgsAbstractGeometryV2* > ) const override; QgsAbstractGeometryV2* symDifference( const QgsAbstractGeometryV2& geom ) const override; QgsAbstractGeometryV2* buffer( double distance, int segments ) const override; + QgsAbstractGeometryV2* buffer( double distance, int segments, int endCapStyle, int joinStyle, double mitreLimit ) const override; QgsAbstractGeometryV2* simplify( double tolerance ) const override; QgsAbstractGeometryV2* interpolate( double distance ) const override; bool centroid( QgsPointV2& pt ) const override;