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;
175 QgsAbstractGeometry *
buffer(
double distance,
int segments,
int endCapStyle,
int joinStyle,
double miterLimit, QString *errorMsg =
nullptr )
const override;
199 double hausdorffDistance(
const QgsAbstractGeometry *geom, QString *errorMsg =
nullptr )
const;
217 double hausdorffDistanceDensify(
const QgsAbstractGeometry *geom,
double densifyFraction, QString *errorMsg =
nullptr )
const;
231 double frechetDistance(
const QgsAbstractGeometry *geom, QString *errorMsg =
nullptr )
const;
255 double frechetDistanceDensify(
const QgsAbstractGeometry *geom,
double densifyFraction, QString *errorMsg =
nullptr )
const;
266 double area( QString *errorMsg =
nullptr )
const override;
267 double length( QString *errorMsg =
nullptr )
const override;
268 bool isValid( QString *errorMsg =
nullptr,
bool allowSelfTouchingHoles =
false,
QgsGeometry *errorLoc =
nullptr )
const override;
270 bool isEmpty( QString *errorMsg =
nullptr )
const override;
271 bool isSimple( QString *errorMsg =
nullptr )
const override;
274 QVector<QgsGeometry> &newGeometries,
277 QString *errorMsg =
nullptr,
bool skipIntersectionCheck =
false )
const override;
294 std::unique_ptr< QgsAbstractGeometry > singleSidedBuffer(
double distance,
int segments,
int side,
295 int joinStyle,
double miterLimit,
296 QString *errorMsg =
nullptr )
const;
322 std::unique_ptr< QgsAbstractGeometry > maximumInscribedCircle(
double tolerance, QString *errorMsg =
nullptr )
const;
347 std::unique_ptr< QgsAbstractGeometry > largestEmptyCircle(
double tolerance,
const QgsAbstractGeometry *boundary =
nullptr, QString *errorMsg =
nullptr )
const;
363 std::unique_ptr< QgsAbstractGeometry > minimumWidth( QString *errorMsg =
nullptr )
const;
386 double minimumClearance( QString *errorMsg =
nullptr )
const;
399 std::unique_ptr< QgsAbstractGeometry > minimumClearanceLine( QString *errorMsg =
nullptr )
const;
411 std::unique_ptr< QgsAbstractGeometry > node( QString *errorMsg =
nullptr )
const;
427 std::unique_ptr< QgsAbstractGeometry > sharedPaths(
const QgsAbstractGeometry *other, QString *errorMsg =
nullptr )
const;
447 QgsGeometry mergeLines( QString *errorMsg =
nullptr )
const;
480 double lineLocatePoint(
const QgsPoint &point, QString *errorMsg =
nullptr )
const;
491 static QgsGeometry polygonize(
const QVector<const QgsAbstractGeometry *> &geometries, QString *errorMsg =
nullptr );
508 QgsGeometry voronoiDiagram(
const QgsAbstractGeometry *extent =
nullptr,
double tolerance = 0.0,
bool edgesOnly =
false, QString *errorMsg =
nullptr )
const;
519 QgsGeometry delaunayTriangulation(
double tolerance = 0.0,
bool edgesOnly =
false, QString *errorMsg =
nullptr )
const;
525 static std::unique_ptr< QgsAbstractGeometry > fromGeos(
const GEOSGeometry *
geos );
526 static std::unique_ptr< QgsPolygon > fromGeosPolygon(
const GEOSGeometry *
geos );
542 static QgsPoint coordSeqPoint(
const GEOSCoordSequence *cs,
int i,
bool hasZ,
bool hasM );
544 static GEOSContextHandle_t getGEOSHandler();
550 double mPrecision = 0.0;
572 void cacheGeos()
const;
573 std::unique_ptr< QgsAbstractGeometry > overlay(
const QgsAbstractGeometry *geom, Overlay op, QString *errorMsg =
nullptr )
const;
574 bool relation(
const QgsAbstractGeometry *geom, Relation r, QString *errorMsg =
nullptr )
const;
575 static GEOSCoordSequence *createCoordinateSequence(
const QgsCurve *curve,
double precision,
bool forceClose =
false );
576 static std::unique_ptr< QgsLineString > sequenceToLinestring(
const GEOSGeometry *
geos,
bool hasZ,
bool hasM );
577 static int numberOfGeometries( GEOSGeometry *g );
578 static geos::unique_ptr nodeGeometries(
const GEOSGeometry *splitLine,
const GEOSGeometry *geom );
579 int mergeGeometriesMultiTypeSplit( QVector<GEOSGeometry *> &splitResult )
const;
584 static geos::unique_ptr createGeosCollection(
int typeId,
const QVector<GEOSGeometry *> &geoms );
586 static geos::unique_ptr createGeosPointXY(
double x,
double y,
bool hasZ,
double z,
bool hasM,
double m,
int coordDims,
double precision );
592 bool topologicalTestPointsSplit(
const GEOSGeometry *splitLine,
QgsPointSequence &testPoints, QString *errorMsg =
nullptr )
const;
594 EngineOperationResult splitLinearGeometry( GEOSGeometry *splitLine, QVector<QgsGeometry > &newGeometries,
bool skipIntersectionCheck )
const;
595 EngineOperationResult splitPolygonGeometry( GEOSGeometry *splitLine, QVector<QgsGeometry > &newGeometries,
bool skipIntersectionCheck )
const;
599 static geos::unique_ptr reshapePolygon(
const GEOSGeometry *polygon,
const GEOSGeometry *reshapeLineGeos,
double precision );
600 static int lineContainedInLine(
const GEOSGeometry *line1,
const GEOSGeometry *line2 );
601 static int pointContainedInLine(
const GEOSGeometry *point,
const GEOSGeometry *line );
602 static int geomDigits(
const GEOSGeometry *geom );
609 class GEOSException :
public std::runtime_error
612 explicit GEOSException(
const QString &message )
613 : std::runtime_error( message.toUtf8().constData() )
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 QgsAbstractGeometry * offsetCurve(double distance, int segments, int joinStyle, double miterLimit, QString *errorMsg=nullptr) const =0
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.
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.
OperationResult
Success or failure of a geometry operation.
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.