21 #include "qgis_core.h" 
   26 #if defined(GEOS_VERSION_MAJOR) && (GEOS_VERSION_MAJOR<3) 
   27 #define GEOSGeometry struct GEOSGeom_t 
   28 #define GEOSCoordSequence struct GEOSCoordSeq_t 
   61     void CORE_EXPORT 
operator()( 
const GEOSPreparedGeometry *geom );
 
   73     void CORE_EXPORT 
operator()( GEOSCoordSequence *sequence );
 
   79   using unique_ptr = std::unique_ptr< GEOSGeometry, GeosDeleter>;
 
  125 #if GEOS_VERSION_MAJOR>3 || ( GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR>=8 ) 
  131     std::unique_ptr< QgsAbstractGeometry > makeValid( QString *errorMsg = 
nullptr ) 
const;
 
  152     std::unique_ptr< QgsAbstractGeometry > clip( 
const QgsRectangle &rectangle, QString *errorMsg = 
nullptr ) 
const;
 
  168     std::unique_ptr< QgsAbstractGeometry > subdivide( 
int maxNodes, QString *errorMsg = 
nullptr ) 
const;
 
  200     double hausdorffDistance( 
const QgsAbstractGeometry *geom, QString *errorMsg = 
nullptr ) 
const;
 
  218     double hausdorffDistanceDensify( 
const QgsAbstractGeometry *geom, 
double densifyFraction, QString *errorMsg = 
nullptr ) 
const;
 
  232     double frechetDistance( 
const QgsAbstractGeometry *geom, QString *errorMsg = 
nullptr ) 
const;
 
  256     double frechetDistanceDensify( 
const QgsAbstractGeometry *geom, 
double densifyFraction, QString *errorMsg = 
nullptr ) 
const;
 
  267     double area( QString *errorMsg = 
nullptr ) 
const override;
 
  268     double length( QString *errorMsg = 
nullptr ) 
const override;
 
  269     bool isValid( QString *errorMsg = 
nullptr, 
bool allowSelfTouchingHoles = 
false, 
QgsGeometry *errorLoc = 
nullptr ) 
const override;
 
  271     bool isEmpty( QString *errorMsg = 
nullptr ) 
const override;
 
  272     bool isSimple( QString *errorMsg = 
nullptr ) 
const override;
 
  275                                          QVector<QgsGeometry> &newGeometries,
 
  278                                          QString *errorMsg = 
nullptr, 
bool skipIntersectionCheck = 
false ) 
const override;
 
  295     std::unique_ptr< QgsAbstractGeometry > singleSidedBuffer( 
double distance, 
int segments, 
Qgis::BufferSide side,
 
  297         QString *errorMsg = 
nullptr ) 
const;
 
  323     std::unique_ptr< QgsAbstractGeometry > maximumInscribedCircle( 
double tolerance, QString *errorMsg = 
nullptr ) 
const;
 
  348     std::unique_ptr< QgsAbstractGeometry > largestEmptyCircle( 
double tolerance, 
const QgsAbstractGeometry *boundary = 
nullptr, QString *errorMsg = 
nullptr ) 
const;
 
  364     std::unique_ptr< QgsAbstractGeometry > minimumWidth( QString *errorMsg = 
nullptr ) 
const;
 
  387     double minimumClearance( QString *errorMsg = 
nullptr ) 
const;
 
  400     std::unique_ptr< QgsAbstractGeometry > minimumClearanceLine( QString *errorMsg = 
nullptr ) 
const;
 
  412     std::unique_ptr< QgsAbstractGeometry > node( QString *errorMsg = 
nullptr ) 
const;
 
  428     std::unique_ptr< QgsAbstractGeometry > sharedPaths( 
const QgsAbstractGeometry *other, QString *errorMsg = 
nullptr ) 
const;
 
  448     QgsGeometry mergeLines( QString *errorMsg = 
nullptr ) 
const;
 
  481     double lineLocatePoint( 
const QgsPoint &point, QString *errorMsg = 
nullptr ) 
const;
 
  492     static QgsGeometry polygonize( 
const QVector<const QgsAbstractGeometry *> &geometries, QString *errorMsg = 
nullptr );
 
  509     QgsGeometry voronoiDiagram( 
const QgsAbstractGeometry *extent = 
nullptr, 
double tolerance = 0.0, 
bool edgesOnly = 
false, QString *errorMsg = 
nullptr ) 
const;
 
  520     QgsGeometry delaunayTriangulation( 
double tolerance = 0.0, 
bool edgesOnly = 
false, QString *errorMsg = 
nullptr ) 
const;
 
  526     static std::unique_ptr< QgsAbstractGeometry > fromGeos( 
const GEOSGeometry *
geos );
 
  527     static std::unique_ptr< QgsPolygon > fromGeosPolygon( 
const GEOSGeometry *
geos );
 
  543     static QgsPoint coordSeqPoint( 
const GEOSCoordSequence *cs, 
int i, 
bool hasZ, 
bool hasM );
 
  545     static GEOSContextHandle_t getGEOSHandler();
 
  551     double mPrecision = 0.0;
 
  573     void cacheGeos() 
const;
 
  574     std::unique_ptr< QgsAbstractGeometry > overlay( 
const QgsAbstractGeometry *geom, Overlay op, QString *errorMsg = 
nullptr ) 
const;
 
  575     bool relation( 
const QgsAbstractGeometry *geom, Relation r, QString *errorMsg = 
nullptr ) 
const;
 
  576     static GEOSCoordSequence *createCoordinateSequence( 
const QgsCurve *curve, 
double precision, 
bool forceClose = 
false );
 
  577     static std::unique_ptr< QgsLineString > sequenceToLinestring( 
const GEOSGeometry *
geos, 
bool hasZ, 
bool hasM );
 
  578     static int numberOfGeometries( GEOSGeometry *g );
 
  579     static geos::unique_ptr nodeGeometries( 
const GEOSGeometry *splitLine, 
const GEOSGeometry *geom );
 
  580     int mergeGeometriesMultiTypeSplit( QVector<GEOSGeometry *> &splitResult ) 
const;
 
  585     static geos::unique_ptr createGeosCollection( 
int typeId, 
const QVector<GEOSGeometry *> &geoms );
 
  587     static geos::unique_ptr createGeosPointXY( 
double x, 
double y, 
bool hasZ, 
double z, 
bool hasM, 
double m, 
int coordDims, 
double precision );
 
  593     bool topologicalTestPointsSplit( 
const GEOSGeometry *splitLine, 
QgsPointSequence &testPoints, QString *errorMsg = 
nullptr ) 
const;
 
  595     EngineOperationResult splitLinearGeometry( GEOSGeometry *splitLine, QVector<QgsGeometry > &newGeometries, 
bool skipIntersectionCheck ) 
const;
 
  596     EngineOperationResult splitPolygonGeometry( GEOSGeometry *splitLine, QVector<QgsGeometry > &newGeometries, 
bool skipIntersectionCheck ) 
const;
 
  600     static geos::unique_ptr reshapePolygon( 
const GEOSGeometry *polygon, 
const GEOSGeometry *reshapeLineGeos, 
double precision );
 
  601     static int lineContainedInLine( 
const GEOSGeometry *line1, 
const GEOSGeometry *line2 );
 
  602     static int pointContainedInLine( 
const GEOSGeometry *point, 
const GEOSGeometry *line );
 
  603     static int geomDigits( 
const GEOSGeometry *geom );
 
  610 class GEOSException : 
public std::runtime_error
 
  613     explicit GEOSException( 
const QString &message )
 
  614       : std::runtime_error( message.toUtf8().constData() )
 
BufferSide
Side of line to buffer.
GeometryOperationResult
Success or failure of a geometry operation.
JoinStyle
Join styles for buffers.
EndCapStyle
End cap styles for buffers.
Abstract base class for all geometries.
Abstract base class for curved geometry type.
A geometry engine is a low-level representation of a QgsAbstractGeometry object, optimised for use wi...
virtual bool isEqual(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const =0
Checks if this is equal to geom.
virtual double area(QString *errorMsg=nullptr) const =0
virtual QgsAbstractGeometry * buffer(double distance, int segments, QString *errorMsg=nullptr) const =0
virtual QgsGeometryEngine::EngineOperationResult splitGeometry(const QgsLineString &splitLine, QVector< QgsGeometry > &newGeometries, bool topological, QgsPointSequence &topologyTestPoints, QString *errorMsg=nullptr, bool skipIntersectionCheck=false) const
Splits this geometry according to a given line.
virtual void geometryChanged()=0
Should be called whenever the geometry associated with the engine has been modified and the engine mu...
virtual QgsAbstractGeometry * intersection(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const =0
Calculate the intersection of this and geom.
virtual bool intersects(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const =0
Checks if geom intersects this.
virtual QgsAbstractGeometry * difference(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const =0
Calculate the difference of this and geom.
virtual QgsAbstractGeometry * symDifference(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const =0
Calculate the symmetric difference of this and geom.
virtual double distance(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const =0
Calculates the distance between this and geom.
virtual bool distanceWithin(const QgsAbstractGeometry *geom, double maxdistance, QString *errorMsg=nullptr) const =0
Checks if geom is within maxdistance distance from this geometry.
virtual bool isValid(QString *errorMsg=nullptr, bool allowSelfTouchingHoles=false, QgsGeometry *errorLoc=nullptr) const =0
Returns true if the geometry is valid.
virtual bool touches(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const =0
Checks if geom touches this.
virtual QgsAbstractGeometry * offsetCurve(double distance, int segments, Qgis::JoinStyle joinStyle, double miterLimit, QString *errorMsg=nullptr) const =0
Offsets a curve.
EngineOperationResult
Success or failure of a geometry operation.
virtual bool isEmpty(QString *errorMsg) const =0
virtual QgsAbstractGeometry * envelope(QString *errorMsg=nullptr) const =0
virtual bool crosses(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const =0
Checks if geom crosses this.
virtual QString relate(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const =0
Returns the Dimensional Extended 9 Intersection Model (DE-9IM) representation of the relationship bet...
virtual bool relatePattern(const QgsAbstractGeometry *geom, const QString &pattern, QString *errorMsg=nullptr) const =0
Tests whether two geometries are related by a specified Dimensional Extended 9 Intersection Model (DE...
virtual bool isSimple(QString *errorMsg=nullptr) const =0
Determines whether the geometry is simple (according to OGC definition).
virtual QgsAbstractGeometry * convexHull(QString *errorMsg=nullptr) const =0
Calculate the convex hull of this.
virtual bool overlaps(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const =0
Checks if geom overlaps this.
virtual QgsPoint * pointOnSurface(QString *errorMsg=nullptr) const =0
Calculate a point that is guaranteed to be on the surface of this.
virtual QgsPoint * centroid(QString *errorMsg=nullptr) const =0
Calculates the centroid of this.
virtual bool within(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const =0
Checks if geom is within this.
virtual void prepareGeometry()=0
Prepares the geometry, so that subsequent calls to spatial relation methods are much faster.
virtual bool contains(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const =0
Checks if geom contains this.
virtual double length(QString *errorMsg=nullptr) const =0
virtual QgsAbstractGeometry * interpolate(double distance, QString *errorMsg=nullptr) const =0
virtual QgsAbstractGeometry * combine(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const =0
Calculate the combination of this and geom.
virtual QgsAbstractGeometry * simplify(double tolerance, QString *errorMsg=nullptr) const =0
virtual bool disjoint(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const =0
Checks if geom is disjoint from this.
A geometry is the spatial representation of a feature.
Does vector analysis using the geos library and handles import, export, exception handling*.
Line string geometry type, with support for z-dimension and m-values.
Point geometry type, with support for z-dimension and m-values.
A rectangle specified with double values.
Contains geos related utilities and functions.
std::unique_ptr< const GEOSPreparedGeometry, GeosDeleter > prepared_unique_ptr
Scoped GEOS prepared geometry pointer.
std::unique_ptr< GEOSGeometry, GeosDeleter > unique_ptr
Scoped GEOS pointer.
std::unique_ptr< GEOSCoordSequence, GeosDeleter > coord_sequence_unique_ptr
Scoped GEOS coordinate sequence pointer.
std::unique_ptr< GEOSBufferParams, GeosDeleter > buffer_params_unique_ptr
Scoped GEOS buffer params pointer.
QVector< QgsPoint > QgsPointSequence
Destroys the GEOS geometry geom, using the static QGIS geos context.
void CORE_EXPORT operator()(GEOSBufferParams *params)
Destroys the GEOS buffer params params, using the static QGIS geos context.
void CORE_EXPORT operator()(const GEOSPreparedGeometry *geom)
Destroys the GEOS prepared geometry geom, using the static QGIS geos context.
void CORE_EXPORT operator()(GEOSCoordSequence *sequence)
Destroys the GEOS coordinate sequence sequence, using the static QGIS geos context.
void CORE_EXPORT operator()(GEOSGeometry *geom)
Destroys the GEOS geometry geom, using the static QGIS geos context.