QGIS API Documentation 4.3.0-Master (bf28115e945)
Loading...
Searching...
No Matches
qgsgeometry.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsgeometry.h - Geometry (stored as Open Geospatial Consortium WKB)
3 -------------------------------------------------------------------
4Date : 02 May 2005
5Copyright : (C) 2005 by Brendan Morley
6email : morb at ozemail dot com dot au
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#ifndef QGSGEOMETRY_H
17#define QGSGEOMETRY_H
18
19#include <climits>
20#include <functional>
21#include <limits>
22#include <memory>
23
24#include "qgis_core.h"
25#include "qgis_sip.h"
26#include "qgsabstractgeometry.h"
27#include "qgsfeatureid.h"
28#include "qgspoint.h"
29#include "qgspointxy.h"
30#include "qgsvertexid.h"
31
32#include <QDomDocument>
33#include <QJsonObject>
34#include <QSet>
35#include <QString>
36#include <QVector>
37
38using namespace Qt::StringLiterals;
39
40#ifndef SIP_RUN
41#include <nlohmann/json_fwd.hpp>
42using namespace nlohmann;
43#endif
44
46class QgsVectorLayer;
47class QgsMapToPixel;
48class QPainter;
49class QgsPolygon;
50class QgsLineString;
52class QgsCurve;
53class QgsFeedback;
54
63typedef QVector<QgsPointXY> QgsPolylineXY;
64
71#ifndef SIP_RUN
73#else
74typedef QVector<QgsPoint> QgsPolyline;
75#endif
76
84#ifndef SIP_RUN
85typedef QVector<QgsPolyline> QgsMultiPolyline;
86#else
87typedef QVector<QVector< QgsPoint >> QgsMultiPolyline;
88#endif
89
91#ifndef SIP_RUN
92typedef QVector<QgsPolylineXY> QgsPolygonXY;
93#else
94typedef QVector<QVector<QgsPointXY>> QgsPolygonXY;
95#endif
96
98typedef QVector<QgsPointXY> QgsMultiPointXY;
99
101#ifndef SIP_RUN
102typedef QVector<QgsPolylineXY> QgsMultiPolylineXY;
103#else
104typedef QVector<QVector<QgsPointXY>> QgsMultiPolylineXY;
105#endif
106
108#ifndef SIP_RUN
109typedef QVector<QgsPolygonXY> QgsMultiPolygonXY;
110#else
111typedef QVector<QVector<QVector<QgsPointXY>>> QgsMultiPolygonXY;
112#endif
113
114class QgsRectangle;
115
116class QgsConstWkbPtr;
117
118struct QgsGeometryPrivate;
119
126class CORE_EXPORT QgsGeometryParameters
127{
128 public:
139 double gridSize() const { return mGridSize; }
140
151 void setGridSize( double size ) { mGridSize = size; }
152
153 private:
154 double mGridSize = -1;
155};
156
157
165{
166 public:
187 double snappingDistance() const { return mSnappingDistance; }
188
194 void setSnappingDistance( double distance ) { mSnappingDistance = distance; }
195
216 double maximumGapWidth() const { return mMaximumGapWidth; }
217
223 void setMaximumGapWidth( double width ) { mMaximumGapWidth = width; }
224
230 Qgis::CoverageCleanOverlapMergeStrategy overlapMergeStrategy() const { return mOverlapMergeStrategy; } //#spellok
231
237 void setOverlapMergeStrategy( Qgis::CoverageCleanOverlapMergeStrategy strategy ) { mOverlapMergeStrategy = strategy; } //#spellok
238
239 private:
240 double mSnappingDistance = -1;
241 double mMaximumGapWidth = 0;
243};
244
245
266class CORE_EXPORT QgsGeometry
267{
268 Q_GADGET
269 Q_PROPERTY( bool isNull READ isNull )
270 Q_PROPERTY( Qgis::GeometryType type READ type )
271
272 public:
273 // clang-format off
275 // clang-format on
276
278 QgsGeometry( const QgsGeometry & );
279
284 QgsGeometry &operator=( QgsGeometry const &rhs ) SIP_SKIP;
285
291
297 explicit QgsGeometry( std::unique_ptr< QgsAbstractGeometry > geom ) SIP_SKIP;
298
299 virtual ~QgsGeometry();
300
312
325
338
346 bool isNull() const SIP_HOLDGIL;
347
349 Q_INVOKABLE static QgsGeometry fromWkt( const QString &wkt );
351 static QgsGeometry fromPointXY( const QgsPointXY &point ) SIP_HOLDGIL;
352
358 static QgsGeometry fromPoint( const QgsPoint &point ) SIP_HOLDGIL;
359
361 static QgsGeometry fromMultiPointXY( const QgsMultiPointXY &multipoint );
362
373 static QgsGeometry fromPolylineXY( const QgsPolylineXY &polyline );
374
383 static QgsGeometry fromPolyline( const QgsPolyline &polyline );
384
388 static QgsGeometry fromMultiPolylineXY( const QgsMultiPolylineXY &multiline );
389
390#ifndef SIP_RUN
391
395#else
396
414#endif
415 static QgsGeometry fromPolygonXY( const QgsPolygonXY &polygon );
416
420 static QgsGeometry fromMultiPolygonXY( const QgsMultiPolygonXY &multipoly );
421
423 static QgsGeometry fromRect( const QgsRectangle &rect ) SIP_HOLDGIL;
424
432 static QgsGeometry fromBox3D( const QgsBox3D &box ) SIP_HOLDGIL;
433
434
436 static QgsGeometry collectGeometry( const QVector<QgsGeometry> &geometries );
437
453 static QgsGeometry collectTinPatches( const QVector<QgsGeometry> &geometries );
454
470 static QgsGeometry createWedgeBuffer( const QgsPoint &center, double azimuth, double angularWidth, double outerRadius, double innerRadius = 0 );
471
485 static QgsGeometry createWedgeBufferFromAngles( const QgsPoint &center, double startAngle, double endAngle, double outerRadius, double innerRadius = 0 );
486
492 void fromWkb( unsigned char *wkb, int length ) SIP_SKIP;
493
497 void fromWkb( const QByteArray &wkb );
498
504
509 Qgis::GeometryType type() const SIP_HOLDGIL;
510
517 bool isEmpty() const SIP_HOLDGIL;
518
520 bool isMultipart() const SIP_HOLDGIL;
521
535 Q_DECL_DEPRECATED bool equals( const QgsGeometry &geometry ) const SIP_DEPRECATED;
536
552 Q_DECL_DEPRECATED bool isGeosEqual( const QgsGeometry & ) const SIP_DEPRECATED;
553
572 bool isExactlyEqual( const QgsGeometry &geometry, Qgis::GeometryBackend backend = Qgis::GeometryBackend::QGIS ) const SIP_THROW( QgsNotSupportedException );
573
591 bool isTopologicallyEqual( const QgsGeometry &geometry, Qgis::GeometryBackend backend = Qgis::GeometryBackend::GEOS ) const SIP_THROW( QgsNotSupportedException );
592
610 bool isFuzzyEqual( const QgsGeometry &geometry, double epsilon = 1e-4, Qgis::GeometryBackend backend = Qgis::GeometryBackend::QGIS ) const SIP_THROW( QgsNotSupportedException );
611
618 bool isGeosValid( Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const;
619
627 bool isSimple() const;
628
642 bool isAxisParallelRectangle( double maximumDeviation, bool simpleRectanglesOnly = false ) const;
643
656 double area() const;
657
672
686 double length() const;
687
695 double distance( const QgsGeometry &geom ) const;
696
697#ifndef SIP_RUN
698
699 // TODO QGIS 5: consider renaming vertices_begin, vertices_end, parts_begin, parts_end, etc
700 // to camelCase
701
706
711#endif
712
736
737#ifndef SIP_RUN
738
748
758
768
778#endif
779
818
852
869 double hausdorffDistance( const QgsGeometry &geom ) const;
870
888 double hausdorffDistanceDensify( const QgsGeometry &geom, double densifyFraction ) const;
889
904 double frechetDistance( const QgsGeometry &geom ) const SIP_THROW( QgsNotSupportedException );
905
928 double frechetDistanceDensify( const QgsGeometry &geom, double densifyFraction ) const SIP_THROW( QgsNotSupportedException );
929
942 QgsPointXY closestVertex( const QgsPointXY &point, int &closestVertexIndex SIP_OUT, int &previousVertexIndex SIP_OUT, int &nextVertexIndex SIP_OUT, double &sqrDist SIP_OUT ) const;
943
951 double distanceToVertex( int vertex ) const;
952
959 double angleAtVertex( int vertex ) const;
960
973 void adjacentVertices( int atVertex, int &beforeVertex SIP_OUT, int &afterVertex SIP_OUT ) const;
974
987 bool insertVertex( double x, double y, int beforeVertex );
988
1001 bool insertVertex( const QgsPoint &point, int beforeVertex );
1002
1010 bool addTopologicalPoint( const QgsPoint &point, double snappingTolerance = 1e-8, double segmentSearchEpsilon = 1e-12 );
1011
1019 bool moveVertex( double x, double y, int atVertex );
1020
1028 bool moveVertex( const QgsPoint &p, int atVertex );
1029
1042 bool deleteVertex( int atVertex );
1043
1057 bool deleteVertices( const QSet<int> &atVertices );
1058
1066 bool toggleCircularAtVertex( int atVertex );
1067
1073 QgsPoint vertexAt( int atVertex ) const;
1074
1080 double sqrDistToVertexAt( QgsPointXY &point SIP_IN, int atVertex ) const;
1081
1086 QgsGeometry nearestPoint( const QgsGeometry &other ) const;
1087
1097 QgsGeometry shortestLine( const QgsGeometry &other ) const;
1098
1105 double closestVertexWithContext( const QgsPointXY &point, int &atVertex SIP_OUT ) const;
1106
1118 double closestSegmentWithContext( const QgsPointXY &point, QgsPointXY &minDistPoint SIP_OUT, int &nextVertexIndex SIP_OUT, int *leftOrRightOfSegment SIP_OUT = nullptr, double epsilon = Qgis::DEFAULT_SEGMENT_EPSILON ) const;
1119
1125 Qgis::GeometryOperationResult addRing( const QVector<QgsPointXY> &ring );
1126
1133
1141 Q_DECL_DEPRECATED Qgis::GeometryOperationResult addPart( const QVector<QgsPointXY> &points, Qgis::GeometryType geomType = Qgis::GeometryType::Unknown ) SIP_PYNAME( addPointsXY ) SIP_DEPRECATED;
1142
1150 Qgis::GeometryOperationResult addPartV2( const QVector<QgsPointXY> &points, Qgis::WkbType wkbType = Qgis::WkbType::Unknown ) SIP_PYNAME( addPointsXYV2 );
1151
1160
1169
1178
1187
1193 Qgis::GeometryOperationResult addPart( const QgsGeometry &newPart ) SIP_PYNAME( addPartGeometry );
1194
1200 QgsGeometry removeInteriorRings( double minimumAllowedArea = -1 ) const;
1201
1206 Qgis::GeometryOperationResult translate( double dx, double dy, double dz = 0.0, double dm = 0.0 );
1207
1223
1232 Qgis::GeometryOperationResult transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 );
1233
1240 Qgis::GeometryOperationResult rotate( double rotation, const QgsPointXY &center );
1241
1252 Q_DECL_DEPRECATED Qgis::GeometryOperationResult splitGeometry( const QVector<QgsPointXY> &splitLine, QVector<QgsGeometry> &newGeometries, bool topological, QVector<QgsPointXY> &topologyTestPoints, bool splitFeature = true ) SIP_SKIP;
1253
1275 Qgis::GeometryOperationResult splitGeometry( const QgsPointSequence &splitLine, QVector<QgsGeometry> &newGeometries SIP_OUT, bool topological, QgsPointSequence &topologyTestPoints SIP_OUT, bool splitFeature = true, bool skipIntersectionTest SIP_PYARGREMOVE = false ) SIP_SKIP;
1276
1277
1278 /*
1279 This SIP code is to support overloaded methods of splitGeometry.
1280 When the deprecated method is removed in QGIS 5.0 this code can be dropped
1281 TODO QGIS 5 remove MethodCode
1282 */
1283#ifdef SIP_RUN
1284// clang-format off
1285
1304 SIP_PYOBJECT splitGeometry( SIP_PYOBJECT splitLine SIP_TYPEHINT( List[Union[QgsPoint, QgsPointXY]] ), bool topological, bool splitFeature = true ) SIP_TYPEHINT( Tuple[Qgis.GeometryOperationResult, Union[List[QgsPoint], List[QgsPointXY]], Union[List[QgsPoint], List[QgsPointXY]]] );
1305 % MethodCode
1306 {
1307 int sipIsErr = 0;
1308 int state;
1309
1310 if ( PyList_Check( a0 ) && PyList_GET_SIZE( a0 ) )
1311 {
1312 PyObject *p0 = PyList_GetItem( a0, 0 );
1313 if ( sipCanConvertToType( p0, sipType_QgsPointXY, SIP_NOT_NONE ) && sipCanConvertToType( a0, sipType_QVector_0100QgsPointXY, SIP_NOT_NONE ) )
1314 {
1315 QVector<QgsGeometry> newGeometries;
1316 QVector<QgsPointXY> topologyTestPoints;
1317
1318 QVector<QgsPointXY> *splitLine = reinterpret_cast<QVector<QgsPointXY> *>( sipConvertToType( a0, sipType_QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
1319 if ( !sipIsErr )
1320 {
1321 Qgis::GeometryOperationResult result = sipCpp->splitGeometry( *splitLine, newGeometries, a1, topologyTestPoints, a2 );
1322
1323 PyObject *o0 = sipConvertFromEnum( static_cast<int>( result ), sipType_Qgis_GeometryOperationResult );
1324 PyObject *o1 = sipConvertFromType( &newGeometries, sipType_QVector_0100QgsGeometry, Py_None );
1325 PyObject *o2 = sipConvertFromType( &topologyTestPoints, sipType_QVector_0100QgsPointXY, Py_None );
1326
1327 sipRes = PyTuple_New( 3 );
1328 PyTuple_SET_ITEM( sipRes, 0, o0 );
1329 PyTuple_SET_ITEM( sipRes, 1, o1 );
1330 PyTuple_SET_ITEM( sipRes, 2, o2 );
1331 }
1332 sipReleaseType( splitLine, sipType_QVector_0100QgsPointXY, state );
1333 }
1334
1335 else if ( sipCanConvertToType( p0, sipType_QgsPoint, SIP_NOT_NONE ) && sipCanConvertToType( a0, sipType_QVector_0100QgsPoint, SIP_NOT_NONE ) )
1336 {
1337 QVector<QgsGeometry> newGeometries;
1338 QVector<QgsPoint> topologyTestPoints;
1339
1340 QVector<QgsPoint> *splitLine = reinterpret_cast<QVector<QgsPoint> *>( sipConvertToType( a0, sipType_QVector_0100QgsPoint, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
1341 if ( !sipIsErr )
1342 {
1343 Qgis::GeometryOperationResult result = sipCpp->splitGeometry( *splitLine, newGeometries, a1, topologyTestPoints, a2 );
1344
1345 PyObject *o0 = sipConvertFromEnum( static_cast<int>( result ), sipType_Qgis_GeometryOperationResult );
1346 PyObject *o1 = sipConvertFromType( &newGeometries, sipType_QVector_0100QgsGeometry, Py_None );
1347 PyObject *o2 = sipConvertFromType( &topologyTestPoints, sipType_QVector_0100QgsPoint, Py_None );
1348
1349 sipRes = PyTuple_New( 3 );
1350 PyTuple_SET_ITEM( sipRes, 0, o0 );
1351 PyTuple_SET_ITEM( sipRes, 1, o1 );
1352 PyTuple_SET_ITEM( sipRes, 2, o2 );
1353 }
1354 sipReleaseType( splitLine, sipType_QVector_0100QgsPoint, state );
1355 }
1356 else
1357 {
1358 sipIsErr = 1;
1359 PyErr_SetString( PyExc_TypeError, u"Could not convert first argument to a list of QgsPoint or QgsPointXY."_s.toUtf8().constData() );
1360 }
1361 }
1362 else
1363 {
1364 sipIsErr = 1;
1365 PyErr_SetString( PyExc_TypeError, u"First argument is not a list of points or is empty."_s.toUtf8().constData() );
1366 }
1367 }
1368 % End
1369// clang-format on
1370#endif
1371
1383 Qgis::GeometryOperationResult splitGeometry( const QgsCurve *curve, QVector<QgsGeometry> &newGeometries SIP_OUT, bool preserveCircular, bool topological, QgsPointSequence &topologyTestPoints SIP_OUT, bool splitFeature = true );
1384
1389 Qgis::GeometryOperationResult reshapeGeometry( const QgsLineString &reshapeLineString );
1390
1397 int makeDifferenceInPlace( const QgsGeometry &other, QgsFeedback* feedback = nullptr ) SIP_SKIP;
1398
1406 QgsGeometry makeDifference( const QgsGeometry &other, QgsFeedback* feedback = nullptr ) const;
1407
1412 QgsRectangle boundingBox() const;
1413
1419 QgsBox3D boundingBox3D() const;
1420
1433 QgsGeometry orientedMinimumBoundingBox( double &area SIP_OUT, double &angle SIP_OUT, double &width SIP_OUT, double &height SIP_OUT ) const;
1434
1444 QgsGeometry orientedMinimumBoundingBox() const SIP_SKIP;
1445
1453 QgsGeometry minimalEnclosingCircle( QgsPointXY &center SIP_OUT, double &radius SIP_OUT, unsigned int segments = 36 ) const;
1454
1459 QgsGeometry minimalEnclosingCircle( unsigned int segments = 36 ) const SIP_SKIP;
1460
1468 QgsGeometry orthogonalize( double tolerance = 1.0E-8, int maxIterations = 1000, double angleThreshold = 15.0 ) const;
1469
1482 QgsGeometry triangularWaves( double wavelength, double amplitude, bool strictWavelength = false ) const;
1483
1502 QgsGeometry triangularWavesRandomized( double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed = 0 ) const;
1503
1516 QgsGeometry squareWaves( double wavelength, double amplitude, bool strictWavelength = false ) const;
1517
1536 QgsGeometry squareWavesRandomized( double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed = 0 ) const;
1537
1550 QgsGeometry roundWaves( double wavelength, double amplitude, bool strictWavelength = false ) const;
1551
1570 QgsGeometry roundWavesRandomized( double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed = 0 ) const;
1571
1585 QgsGeometry applyDashPattern( const QVector< double > &pattern, Qgis::DashPatternLineEndingRule startRule = Qgis::DashPatternLineEndingRule::NoRule, Qgis::DashPatternLineEndingRule endRule = Qgis::DashPatternLineEndingRule::NoRule, Qgis::DashPatternSizeAdjustment adjustment = Qgis::DashPatternSizeAdjustment::ScaleBothDashAndGap, double patternOffset = 0 ) const;
1586
1598 QgsGeometry snappedToGrid( double hSpacing, double vSpacing, double dSpacing = 0, double mSpacing = 0 ) const;
1599
1619 bool removeDuplicateNodes( double epsilon = 4 * std::numeric_limits<double>::epsilon(), bool useZValues = false );
1620
1630 Q_INVOKABLE bool intersects( const QgsRectangle &rectangle ) const;
1631
1646 Q_INVOKABLE bool intersects( const QgsGeometry &geometry ) const;
1647
1656 Q_INVOKABLE bool boundingBoxIntersects( const QgsRectangle &rectangle ) const;
1657
1666 Q_INVOKABLE bool boundingBoxIntersects( const QgsGeometry &geometry ) const;
1667
1671 bool contains( const QgsPointXY *p ) const;
1672
1678 Q_INVOKABLE bool contains( double x, double y ) const;
1679
1689 Q_INVOKABLE bool contains( const QgsGeometry &geometry ) const;
1690
1700 Q_INVOKABLE bool disjoint( const QgsGeometry &geometry ) const;
1701
1711 Q_INVOKABLE bool touches( const QgsGeometry &geometry ) const;
1712
1722 Q_INVOKABLE bool overlaps( const QgsGeometry &geometry ) const;
1723
1733 Q_INVOKABLE bool within( const QgsGeometry &geometry ) const;
1734
1744 Q_INVOKABLE bool crosses( const QgsGeometry &geometry ) const;
1745
1755 QgsGeometry buffer( double distance, int segments, QgsFeedback* feedback = nullptr ) const;
1756
1769 QgsGeometry buffer( double distance, int segments, Qgis::EndCapStyle endCapStyle, Qgis::JoinStyle joinStyle, double miterLimit, QgsFeedback* feedback = nullptr ) const;
1770
1778 QgsGeometry offsetCurve( double distance, int segments, Qgis::JoinStyle joinStyle, double miterLimit ) const;
1779
1794 QgsGeometry singleSidedBuffer( double distance, int segments, Qgis::BufferSide side, Qgis::JoinStyle joinStyle = Qgis::JoinStyle::Round, double miterLimit = 2.0 ) const;
1795
1813 QgsGeometry taperedBuffer( double startWidth, double endWidth, int segments ) const;
1814
1829 QgsGeometry variableWidthBufferByM( int segments ) const;
1830
1836 QgsGeometry extendLine( double startDistance, double endDistance ) const;
1837
1843 QgsGeometry simplify( double tolerance, QgsFeedback* feedback = nullptr ) const;
1844
1853 QgsGeometry densifyByCount( int extraNodesPerSegment ) const;
1854
1868 QgsGeometry densifyByDistance( double distance ) const;
1869
1885 QgsGeometry convertToCurves( double distanceTolerance = 1e-8, double angleTolerance = 1e-8 ) const;
1886
1900 QgsGeometry centroid() const;
1901
1915 QgsGeometry pointOnSurface() const;
1916
1928 QgsGeometry poleOfInaccessibility( double precision, double *distanceToBoundary SIP_OUT = nullptr ) const;
1929
1953 QgsGeometry largestEmptyCircle( double tolerance, const QgsGeometry &boundary = QgsGeometry() ) const SIP_THROW( QgsNotSupportedException );
1954
1969 QgsGeometry minimumWidth() const SIP_THROW( QgsNotSupportedException );
1970
1992 double minimumClearance() const SIP_THROW( QgsNotSupportedException );
1993
2005 QgsGeometry minimumClearanceLine() const SIP_THROW( QgsNotSupportedException );
2006
2015 QgsGeometry convexHull() const;
2016
2032 QgsGeometry concaveHull( double targetPercent, bool allowHoles = false, QgsFeedback * feedback = nullptr ) const SIP_THROW( QgsNotSupportedException );
2033
2069 QgsGeometry concaveHullOfPolygons( double lengthRatio, bool allowHoles = false, bool isTight = false, QgsFeedback *feedback = nullptr ) const SIP_THROW( QgsNotSupportedException );
2070
2085 QgsGeometry voronoiDiagram( const QgsGeometry &extent = QgsGeometry(), double tolerance = 0.0, bool edgesOnly = false ) const;
2086
2097 QgsGeometry delaunayTriangulation( double tolerance = 0.0, bool edgesOnly = false ) const;
2098
2111 QgsGeometry constrainedDelaunayTriangulation() const SIP_THROW( QgsNotSupportedException );
2112
2130 Qgis::CoverageValidityResult validateCoverage( double gapWidth, QgsGeometry *invalidEdges SIP_OUT = nullptr ) const SIP_THROW( QgsNotSupportedException );
2131
2152 QgsGeometry simplifyCoverageVW( double tolerance, bool preserveBoundary ) const SIP_THROW( QgsNotSupportedException );
2153
2165 QgsGeometry unionCoverage() const;
2166
2184 QgsGeometry cleanCoverage( const QgsCoverageCleanParameters &parameters, QgsFeedback *feedback = nullptr ) const SIP_THROW( QgsNotSupportedException );
2185
2196 QgsGeometry node() const;
2197
2212 QgsGeometry sharedPaths( const QgsGeometry &other ) const;
2213
2236 QgsGeometry subdivide( int maxNodes = 256, const QgsGeometryParameters &parameters = QgsGeometryParameters(), QgsFeedback* feedback = nullptr ) const;
2237
2252 QgsGeometry interpolate( double distance ) const;
2253
2264 double lineLocatePoint( const QgsGeometry &point ) const;
2265
2274 double interpolateAngle( double distance ) const;
2275
2289 QgsGeometry intersection( const QgsGeometry &geometry, const QgsGeometryParameters &parameters = QgsGeometryParameters(), QgsFeedback* feedback = nullptr ) const;
2290
2299 QgsGeometry clipped( const QgsRectangle &rectangle, QgsFeedback* feedback = nullptr );
2300
2317 QgsGeometry combine( const QgsGeometry &geometry, const QgsGeometryParameters &parameters = QgsGeometryParameters(), QgsFeedback* feedback = nullptr ) const;
2318
2329 QgsGeometry mergeLines( const QgsGeometryParameters &parameters = QgsGeometryParameters() ) const;
2330
2344 QgsGeometry difference( const QgsGeometry &geometry, const QgsGeometryParameters &parameters = QgsGeometryParameters(), QgsFeedback* feedback = nullptr ) const;
2345
2359 QgsGeometry symDifference( const QgsGeometry &geometry, const QgsGeometryParameters &parameters = QgsGeometryParameters(), QgsFeedback* feedback = nullptr ) const;
2360
2362 QgsGeometry extrude( double x, double y );
2363
2364#ifndef SIP_RUN
2365
2387 QVector< QgsPointXY > randomPointsInPolygon( int count, const std::function< bool( const QgsPointXY & ) > &acceptPoint, unsigned long seed = 0, QgsFeedback *feedback = nullptr, int maxTriesPerPoint = 0 ) const;
2388
2402 QVector< QgsPointXY > randomPointsInPolygon( int count, unsigned long seed = 0, QgsFeedback *feedback = nullptr ) const;
2404#else
2405// clang-format off
2406
2420 SIP_PYOBJECT randomPointsInPolygon( int count, unsigned long seed = 0 ) const SIP_TYPEHINT( QgsPolylineXY );
2421 % MethodCode
2422 const Qgis::GeometryType type = sipCpp->type();
2423 if ( sipCpp->isNull() )
2424 {
2425 PyErr_SetString( PyExc_ValueError, u"Cannot generate points inside a null geometry."_s.toUtf8().constData() );
2426 sipIsErr = 1;
2427 }
2428 else if ( type != Qgis::GeometryType::Polygon )
2429 {
2430 PyErr_SetString( PyExc_TypeError, u"Cannot generate points inside a %1 geometry. Only Polygon types are permitted."_s.arg( QgsWkbTypes::displayString( sipCpp->wkbType() ) ).toUtf8().constData() );
2431 sipIsErr = 1;
2432 }
2433 else
2434 {
2435 const sipTypeDef *qvector_type = sipFindType( "QVector<QgsPointXY>" );
2436 sipRes = sipConvertFromNewType( new QVector< QgsPointXY >( sipCpp->randomPointsInPolygon( a0, a1 ) ), qvector_type, Py_None );
2437 }
2438 % End
2439
2440
2441// clang-format on
2442#endif
2444
2452 int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;
2453
2460 QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;
2461
2467 Q_INVOKABLE QString asWkt( int precision = 17 ) const;
2468
2469#ifdef SIP_RUN
2470// clang-format off
2471 SIP_PYOBJECT __repr__();
2472 % MethodCode
2473 QString str;
2474 if ( sipCpp->isNull() )
2475 str = u"<QgsGeometry: null>"_s;
2476 else
2477 {
2478 QString wkt = sipCpp->asWkt();
2479 if ( wkt.length() > 1000 )
2480 wkt = wkt.left( 1000 ) + u"..."_s;
2481 str = u"<QgsGeometry: %1>"_s.arg( wkt );
2482 }
2483 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
2484 % End
2485// clang-format on
2486#endif
2487
2492 QString asJson( int precision = 17 ) const;
2493
2499 QString asGeoJson( int precision = 17, Qgis::GeoJsonProfile profile = Qgis::GeoJsonProfile::Legacy ) const;
2500
2506 virtual json asJsonObject( int precision = 17, Qgis::GeoJsonProfile profile = Qgis::GeoJsonProfile::Legacy ) const SIP_SKIP;
2507
2544 QVector< QgsGeometry > coerceToType( Qgis::WkbType type, double defaultZ = 0, double defaultM = 0, bool avoidDuplicates = true ) const;
2545
2557 QgsGeometry convertToType( Qgis::GeometryType destType, bool destMultipart = false ) const;
2558
2559 /* Accessor functions for getting geometry data */
2560
2561#ifndef SIP_RUN
2562
2571 QgsPointXY asPoint() const;
2572#else
2573// clang-format off
2574
2585 SIP_PYOBJECT asPoint() const SIP_TYPEHINT( QgsPointXY );
2586 % MethodCode
2587 if ( sipCpp->isNull() )
2588 {
2589 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a point."_s.toUtf8().constData() );
2590 sipIsErr = 1;
2591 }
2592 else
2593 {
2594 const QgsAbstractGeometry *geom = sipCpp->constGet();
2596 {
2597 PyErr_SetString( PyExc_TypeError, u"%1 geometry cannot be converted to a point. Only Point types are permitted."_s.arg( QgsWkbTypes::displayString( geom->wkbType() ) ).toUtf8().constData() );
2598 sipIsErr = 1;
2599 }
2600 else
2601 {
2602 sipRes = sipConvertFromNewType( new QgsPointXY( sipCpp->asPoint() ), sipType_QgsPointXY, Py_None );
2603 }
2604 }
2605 % End
2606// clang-format on
2607#endif
2608
2609#ifndef SIP_RUN
2610
2619 QgsPolylineXY asPolyline() const;
2620#else
2621// clang-format off
2622
2634 SIP_PYOBJECT asPolyline() const SIP_TYPEHINT( QgsPolylineXY );
2635 % MethodCode
2636 const Qgis::WkbType type = sipCpp->wkbType();
2637 if ( sipCpp->isNull() )
2638 {
2639 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a polyline."_s.toUtf8().constData() );
2640 sipIsErr = 1;
2641 }
2643 {
2644 PyErr_SetString( PyExc_TypeError, u"%1 geometry cannot be converted to a polyline. Only single line or curve types are permitted."_s.arg( QgsWkbTypes::displayString( type ) ).toUtf8().constData() );
2645 sipIsErr = 1;
2646 }
2647 else
2648 {
2649 const sipTypeDef *qvector_type = sipFindType( "QVector< QgsPointXY >" );
2650 sipRes = sipConvertFromNewType( new QgsPolylineXY( sipCpp->asPolyline() ), qvector_type, Py_None );
2651 }
2652 % End
2653// clang-format on
2654#endif
2655
2656#ifndef SIP_RUN
2657
2666 QgsPolygonXY asPolygon() const;
2667#else
2668// clang-format off
2669
2681 SIP_PYOBJECT asPolygon() const SIP_TYPEHINT( QgsPolygonXY );
2682 % MethodCode
2683 const Qgis::WkbType type = sipCpp->wkbType();
2684 if ( sipCpp->isNull() )
2685 {
2686 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a polygon."_s.toUtf8().constData() );
2687 sipIsErr = 1;
2688 }
2690 {
2691 PyErr_SetString( PyExc_TypeError, u"%1 geometry cannot be converted to a polygon. Only single polygon or curve polygon types are permitted."_s.arg( QgsWkbTypes::displayString( type ) ).toUtf8().constData() );
2692 sipIsErr = 1;
2693 }
2694 else
2695 {
2696 const sipTypeDef *qvector_type = sipFindType( "QVector<QVector<QgsPointXY>>" );
2697 sipRes = sipConvertFromNewType( new QgsPolygonXY( sipCpp->asPolygon() ), qvector_type, Py_None );
2698 }
2699 % End
2700// clang-format on
2701#endif
2702
2703#ifndef SIP_RUN
2704
2712 QgsMultiPointXY asMultiPoint() const;
2713#else
2714// clang-format off
2715
2726 SIP_PYOBJECT asMultiPoint() const SIP_TYPEHINT( QgsMultiPointXY );
2727 % MethodCode
2728 const Qgis::WkbType type = sipCpp->wkbType();
2729 if ( sipCpp->isNull() )
2730 {
2731 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a multipoint."_s.toUtf8().constData() );
2732 sipIsErr = 1;
2733 }
2735 {
2736 PyErr_SetString( PyExc_TypeError, u"%1 geometry cannot be converted to a multipoint. Only multipoint types are permitted."_s.arg( QgsWkbTypes::displayString( type ) ).toUtf8().constData() );
2737 sipIsErr = 1;
2738 }
2739 else
2740 {
2741 const sipTypeDef *qvector_type = sipFindType( "QVector< QgsPointXY >" );
2742 sipRes = sipConvertFromNewType( new QgsPolylineXY( sipCpp->asMultiPoint() ), qvector_type, Py_None );
2743 }
2744 % End
2745// clang-format on
2746#endif
2747
2748#ifndef SIP_RUN
2749
2758 QgsMultiPolylineXY asMultiPolyline() const;
2759#else
2760// clang-format off
2761
2773 SIP_PYOBJECT asMultiPolyline() const SIP_TYPEHINT( QgsMultiPolylineXY );
2774 % MethodCode
2775 const Qgis::WkbType type = sipCpp->wkbType();
2776 if ( sipCpp->isNull() )
2777 {
2778 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a multilinestring."_s.toUtf8().constData() );
2779 sipIsErr = 1;
2780 }
2782 {
2783 PyErr_SetString( PyExc_TypeError, u"%1 geometry cannot be converted to a multilinestring. Only multi linestring or curves are permitted."_s.arg( QgsWkbTypes::displayString( type ) ).toUtf8().constData() );
2784 sipIsErr = 1;
2785 }
2786 else
2787 {
2788 const sipTypeDef *qvector_type = sipFindType( "QVector<QVector<QgsPointXY>>" );
2789 sipRes = sipConvertFromNewType( new QgsMultiPolylineXY( sipCpp->asMultiPolyline() ), qvector_type, Py_None );
2790 }
2791 % End
2792// clang-format on
2793#endif
2794
2795#ifndef SIP_RUN
2796
2805 QgsMultiPolygonXY asMultiPolygon() const;
2806#else
2807// clang-format off
2808
2820 SIP_PYOBJECT asMultiPolygon() const SIP_TYPEHINT( QgsMultiPolygonXY );
2821 % MethodCode
2822 const Qgis::WkbType type = sipCpp->wkbType();
2823 if ( sipCpp->isNull() )
2824 {
2825 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a multipolygon."_s.toUtf8().constData() );
2826 sipIsErr = 1;
2827 }
2829 {
2830 PyErr_SetString( PyExc_TypeError, u"%1 geometry cannot be converted to a multipolygon. Only multi polygon or curves are permitted."_s.arg( QgsWkbTypes::displayString( type ) ).toUtf8().constData() );
2831 sipIsErr = 1;
2832 }
2833 else
2834 {
2835 const sipTypeDef *qvector_type = sipFindType( "QVector<QVector<QVector<QgsPointXY>>>" );
2836 sipRes = sipConvertFromNewType( new QgsMultiPolygonXY( sipCpp->asMultiPolygon() ), qvector_type, Py_None );
2837 }
2838 % End
2839// clang-format on
2840#endif
2841
2845 QVector<QgsGeometry> asGeometryCollection() const;
2846
2851 QPointF asQPointF() const SIP_HOLDGIL;
2852
2864 QPolygonF asQPolygonF() const SIP_HOLDGIL;
2865
2871 bool deleteRing( int ringNum, int partNum = 0 );
2872
2877 bool deletePart( int partNum );
2878
2887 bool convertToMultiType();
2888
2904 bool convertToCurvedMultiType();
2905
2915 bool convertToSingleType();
2916
2926 bool convertGeometryCollectionToSubclass( Qgis::GeometryType geomType );
2927
2939 Q_DECL_DEPRECATED int avoidIntersections( const QList<QgsVectorLayer *> &avoidIntersectionsLayers, const QHash<QgsVectorLayer *, QSet<QgsFeatureId> > &ignoreFeatures SIP_PYARGREMOVE = ( QHash<QgsVectorLayer *, QSet<QgsFeatureId> >() ) ) SIP_DEPRECATED;
2940
2952 Qgis::GeometryOperationResult avoidIntersectionsV2( const QList<QgsVectorLayer *> &avoidIntersectionsLayers, const QHash<QgsVectorLayer *, QSet<QgsFeatureId> > &ignoreFeatures SIP_PYARGREMOVE = ( QHash<QgsVectorLayer *, QSet<QgsFeatureId> >() ) );
2953
2975 QgsGeometry makeValid( Qgis::MakeValidMethod method = Qgis::MakeValidMethod::Linework, bool keepCollapsed = false, QgsFeedback* feedback = nullptr ) const SIP_THROW( QgsNotSupportedException );
2976
2986 Qgis::AngularDirection polygonOrientation() const;
2987
3002
3017
3018
3033 QgsGeometry forceRHR() const;
3034
3045 QgsGeometry forcePolygonClockwise() const;
3046
3057 QgsGeometry forcePolygonCounterClockwise() const;
3058
3063 class CORE_EXPORT Error
3064 {
3065 public:
3067 : mMessage( u"none"_s )
3068 {}
3069
3070 explicit Error( const QString &m )
3071 : mMessage( m )
3072 {}
3073
3074 Error( const QString &m, const QgsPointXY &p )
3075 : mMessage( m )
3076 , mLocation( p )
3077 , mHasLocation( true ) {}
3078
3082 QString what() const;
3083
3087 QgsPointXY where() const;
3088
3092 bool hasWhere() const;
3093
3094#ifdef SIP_RUN
3095// clang-format off
3096 SIP_PYOBJECT __repr__();
3097 % MethodCode
3098 QString str = u"<QgsGeometry.Error: %1>"_s.arg( sipCpp->what() );
3099 sipRes = PyUnicode_FromString( str.toUtf8().data() );
3100 % End
3101// clang-format on
3102#endif
3103
3104 // TODO c++20 - replace with = default
3105 bool operator==( const QgsGeometry::Error &other ) const
3106 {
3107 return other.mMessage == mMessage && other.mHasLocation == mHasLocation && other.mLocation == mLocation;
3108 }
3109
3110 private:
3111 QString mMessage;
3112 QgsPointXY mLocation;
3113 bool mHasLocation = false;
3114 };
3115
3123 void validateGeometry( QVector<QgsGeometry::Error> &errors SIP_OUT, Qgis::GeometryValidationEngine method = Qgis::GeometryValidationEngine::QgisInternal, Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const;
3124
3134 void normalize();
3135
3146 static QgsGeometry unaryUnion( const QVector<QgsGeometry> &geometries, const QgsGeometryParameters &parameters = QgsGeometryParameters(), QgsFeedback* feedback = nullptr );
3147
3155 static QgsGeometry polygonize( const QVector<QgsGeometry> &geometries );
3156
3163 void convertToStraightSegment( double tolerance = M_PI / 180., QgsAbstractGeometry::SegmentationToleranceType toleranceType = QgsAbstractGeometry::MaximumAngle );
3164
3170 bool requiresConversionToStraightSegments() const;
3171
3176 void mapToPixel( const QgsMapToPixel &mtp );
3177
3182 void draw( QPainter &p ) const;
3183
3193 bool vertexIdFromVertexNr( int number, QgsVertexId &id SIP_OUT ) const;
3194
3205 int vertexNrFromVertexId( QgsVertexId id ) const;
3206
3213 QString lastError() const SIP_HOLDGIL;
3214
3224 void filterVertices( const std::function< bool( const QgsPoint & ) > &filter ) SIP_SKIP;
3225
3240 void transformVertices( const std::function< QgsPoint( const QgsPoint & ) > &transform ) SIP_SKIP;
3241
3246 static QgsGeometry fromQPointF( QPointF point ) SIP_HOLDGIL;
3247
3254 static QgsGeometry fromQPolygonF( const QPolygonF &polygon );
3255
3263 Q_DECL_DEPRECATED static QgsPolylineXY createPolylineFromQPolygonF( const QPolygonF &polygon ) SIP_DEPRECATED;
3264
3272 Q_DECL_DEPRECATED static QgsPolygonXY createPolygonFromQPolygonF( const QPolygonF &polygon ) SIP_DEPRECATED;
3273
3274#ifndef SIP_RUN
3275
3284 static bool compare( const QgsPolylineXY &p1, const QgsPolylineXY &p2, double epsilon = 4 * std::numeric_limits<double>::epsilon() );
3285
3294 static bool compare( const QgsPolygonXY &p1, const QgsPolygonXY &p2, double epsilon = 4 * std::numeric_limits<double>::epsilon() );
3295
3305 static bool compare( const QgsMultiPolygonXY &p1, const QgsMultiPolygonXY &p2, double epsilon = 4 * std::numeric_limits<double>::epsilon() );
3306#else
3307// clang-format off
3308
3327 static bool compare( PyObject *obj1, PyObject *obj2, double epsilon = 4 * std::numeric_limits<double>::epsilon() );
3328 % MethodCode
3329 {
3330 sipRes = false;
3331 int state0;
3332 int state1;
3333 int sipIsErr = 0;
3334
3335 if ( PyList_Check( a0 ) && PyList_Check( a1 ) && PyList_GET_SIZE( a0 ) && PyList_GET_SIZE( a1 ) )
3336 {
3337 PyObject *o0 = PyList_GetItem( a0, 0 );
3338 PyObject *o1 = PyList_GetItem( a1, 0 );
3339 if ( o0 && o1 )
3340 {
3341 // compare polyline - polyline
3342 if ( sipCanConvertToType( o0, sipType_QgsPointXY, SIP_NOT_NONE ) && sipCanConvertToType( o1, sipType_QgsPointXY, SIP_NOT_NONE ) && sipCanConvertToType( a0, sipType_QVector_0100QgsPointXY, SIP_NOT_NONE ) && sipCanConvertToType( a1, sipType_QVector_0100QgsPointXY, SIP_NOT_NONE ) )
3343 {
3344 QgsPolylineXY *p0;
3345 QgsPolylineXY *p1;
3346 p0 = reinterpret_cast<QgsPolylineXY *>( sipConvertToType( a0, sipType_QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
3347 p1 = reinterpret_cast<QgsPolylineXY *>( sipConvertToType( a1, sipType_QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
3348 if ( !sipIsErr )
3349 {
3350 sipRes = QgsGeometry::compare( *p0, *p1, a2 );
3351 }
3352 sipReleaseType( p0, sipType_QVector_0100QgsPointXY, state0 );
3353 sipReleaseType( p1, sipType_QVector_0100QgsPointXY, state1 );
3354 }
3355 else if ( PyList_Check( o0 ) && PyList_Check( o1 ) && PyList_GET_SIZE( o0 ) && PyList_GET_SIZE( o1 ) )
3356 {
3357 PyObject *oo0 = PyList_GetItem( o0, 0 );
3358 PyObject *oo1 = PyList_GetItem( o1, 0 );
3359 if ( oo0 && oo1 )
3360 {
3361 // compare polygon - polygon
3362 if ( sipCanConvertToType( oo0, sipType_QgsPointXY, SIP_NOT_NONE ) && sipCanConvertToType( oo1, sipType_QgsPointXY, SIP_NOT_NONE ) && sipCanConvertToType( a0, sipType_QVector_0600QVector_0100QgsPointXY, SIP_NOT_NONE ) && sipCanConvertToType( a1, sipType_QVector_0600QVector_0100QgsPointXY, SIP_NOT_NONE ) )
3363 {
3364 QgsPolygonXY *p0;
3365 QgsPolygonXY *p1;
3366 p0 = reinterpret_cast<QgsPolygonXY *>( sipConvertToType( a0, sipType_QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
3367 p1 = reinterpret_cast<QgsPolygonXY *>( sipConvertToType( a1, sipType_QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
3368 if ( !sipIsErr )
3369 {
3370 sipRes = QgsGeometry::compare( *p0, *p1, a2 );
3371 }
3372 sipReleaseType( p0, sipType_QVector_0600QVector_0100QgsPointXY, state0 );
3373 sipReleaseType( p1, sipType_QVector_0600QVector_0100QgsPointXY, state1 );
3374 }
3375 else if ( PyList_Check( oo0 ) && PyList_Check( oo1 ) && PyList_GET_SIZE( oo0 ) && PyList_GET_SIZE( oo1 ) )
3376 {
3377 PyObject *ooo0 = PyList_GetItem( oo0, 0 );
3378 PyObject *ooo1 = PyList_GetItem( oo1, 0 );
3379 if ( ooo0 && ooo1 )
3380 {
3381 // compare multipolygon - multipolygon
3382 if ( sipCanConvertToType( ooo0, sipType_QgsPointXY, SIP_NOT_NONE ) && sipCanConvertToType( ooo1, sipType_QgsPointXY, SIP_NOT_NONE ) && sipCanConvertToType( a0, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, SIP_NOT_NONE ) && sipCanConvertToType( a1, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, SIP_NOT_NONE ) )
3383 {
3386 p0 = reinterpret_cast<QgsMultiPolygonXY *>( sipConvertToType( a0, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
3387 p1 = reinterpret_cast<QgsMultiPolygonXY *>( sipConvertToType( a1, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
3388 if ( !sipIsErr )
3389 {
3390 sipRes = QgsGeometry::compare( *p0, *p1, a2 );
3391 }
3392 sipReleaseType( p0, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, state0 );
3393 sipReleaseType( p1, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, state1 );
3394 }
3395 }
3396 }
3397 }
3398 }
3399 }
3400 }
3401 }
3402 % End
3403// clang-format on
3404#endif
3405
3421 QgsGeometry smooth( unsigned int iterations = 1, double offset = 0.25, double minimumDistance = -1.0, double maxAngle = 180.0 ) const;
3422
3462 static QgsGeometryEngine *createGeometryEngine( const QgsAbstractGeometry *geometry, double precision = 0.0, Qgis::GeosCreationFlags flags = Qgis::GeosCreationFlag::SkipEmptyInteriorRings ) SIP_FACTORY;
3463
3469 static void convertPointList( const QVector<QgsPointXY> &input, QgsPointSequence &output );
3470
3476 static void convertPointList( const QgsPointSequence &input, QVector<QgsPointXY> &output );
3477
3479 operator QVariant() const
3480 {
3481 return QVariant::fromValue( *this );
3482 }
3483
3489 {
3490 Chamfer = 1,
3491 Fillet,
3492 };
3493#ifndef SIP_RUN
3494 Q_ENUM( ChamferFilletOperationType )
3495#endif
3496
3513 QgsGeometry fillet( int vertexIndex, double radius, int segments = 8 ) const;
3514
3533 static QgsGeometry fillet( const QgsPoint &segment1Start, const QgsPoint &segment1End, const QgsPoint &segment2Start, const QgsPoint &segment2End, double radius, int segments = 8 ) SIP_THROW( QgsInvalidArgumentException );
3534
3548 QgsGeometry chamfer( int vertexIndex, double distance1, double distance2 = -1.0 ) const;
3549
3568 static QgsGeometry chamfer( const QgsPoint &segment1Start, const QgsPoint &segment1End, const QgsPoint &segment2Start, const QgsPoint &segment2End, double distance1, double distance2 = -1.0 ) SIP_THROW( QgsInvalidArgumentException );
3569
3570
3571 private:
3572 QgsGeometryPrivate *d; //implicitly shared data pointer
3573
3575 mutable QString mLastError;
3576
3581 void detach();
3582
3587 void reset( std::unique_ptr< QgsAbstractGeometry > newGeometry );
3588
3589 static void convertPolygon( const QgsPolygon &input, QgsPolygonXY &output );
3590
3592 QgsGeometry convertToPoint( bool destMultipart ) const;
3594 QgsGeometry convertToLine( bool destMultipart ) const;
3596 QgsGeometry convertToPolygon( bool destMultipart ) const;
3597
3609 std::unique_ptr< QgsLineString > smoothLine( const QgsLineString &line, unsigned int iterations = 1, double offset = 0.25, double minimumDistance = -1, double maxAngle = 180.0 ) const;
3610
3622 std::unique_ptr< QgsPolygon > smoothPolygon( const QgsPolygon &polygon, unsigned int iterations = 1, double offset = 0.25, double minimumDistance = -1, double maxAngle = 180.0 ) const;
3623
3624 QgsGeometry doChamferFillet( ChamferFilletOperationType op, int vertexIndex, double distance1, double distance2, int segments ) const;
3625
3627
3628}; // class QgsGeometry
3629
3631
3633CORE_EXPORT QDataStream &operator<<( QDataStream &out, const QgsGeometry &geometry );
3635CORE_EXPORT QDataStream &operator>>( QDataStream &in, QgsGeometry &geometry );
3636
3637#endif
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:62
CoverageCleanOverlapMergeStrategy
Merge strategies for coverage cleaning operations.
Definition qgis.h:6920
@ LongestBorder
Polygon with longest common border is selected to merge overlapping polygons into.
Definition qgis.h:6921
@ CounterClockwise
Counter-clockwise direction.
Definition qgis.h:3629
@ Clockwise
Clockwise direction.
Definition qgis.h:3628
GeometryOperationResult
Success or failure of a geometry operation.
Definition qgis.h:2176
QFlags< GeometryValidityFlag > GeometryValidityFlags
Geometry validity flags.
Definition qgis.h:2210
GeometryValidationEngine
Available engines for validating geometries.
Definition qgis.h:2219
@ QgisInternal
Use internal QgsGeometryValidator method.
Definition qgis.h:2220
@ SkipEmptyInteriorRings
Skip any empty polygon interior ring.
Definition qgis.h:2296
QFlags< GeosCreationFlag > GeosCreationFlags
Geos geometry creation behavior flags.
Definition qgis.h:2305
GeoJsonProfile
GeoJson export Profile according to OGC Features and Geometries JSON - Part 1: Core https://docs....
Definition qgis.h:5045
@ Legacy
Legacy GeoJson profile used in QGIS prior to 4.2, which included some non-standard extensions and dev...
Definition qgis.h:5046
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
Definition qgis.h:379
@ Point
Points.
Definition qgis.h:380
@ Line
Lines.
Definition qgis.h:381
@ Polygon
Polygons.
Definition qgis.h:382
@ Unknown
Unknown types.
Definition qgis.h:383
static const double DEFAULT_SEGMENT_EPSILON
Default snapping tolerance for segments.
Definition qgis.h:7003
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:294
@ Point
Point.
Definition qgis.h:296
@ Unknown
Unknown.
Definition qgis.h:295
TransformDirection
Indicates the direction (forward or inverse) of a transform.
Definition qgis.h:2845
@ Forward
Forward transform (from source to destination).
Definition qgis.h:2846
The part_iterator class provides an STL-style iterator for const references to geometry parts.
The part_iterator class provides an STL-style iterator for geometry parts.
The vertex_iterator class provides an STL-style iterator for vertices.
Abstract base class for all geometries.
SegmentationToleranceType
Segmentation tolerance as maximum angle or maximum difference between approximation and circle.
@ MaximumAngle
Maximum angle between generating radii (lines from arc center to output vertices).
virtual const QgsAbstractGeometry * simplifiedTypeRef() const
Returns a reference to the simplest lossless representation of this geometry, e.g.
QFlags< WkbFlag > WkbFlags
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
A 3-dimensional box composed of x, y, z coordinates.
Definition qgsbox3d.h:45
Compound curve geometry type.
A const WKB pointer.
Definition qgswkbptr.h:211
Handles coordinate transforms between two coordinate systems.
Encapsulates parameters for a coverage cleaning operation.
void setSnappingDistance(double distance)
Sets the snapping distance.
double maximumGapWidth() const
Returns the maximum gap width.
Qgis::CoverageCleanOverlapMergeStrategy overlapMergeStrategy() const
Returns the overlap merge strategy to use during cleaning.
double snappingDistance() const
Returns the snapping distance.
void setOverlapMergeStrategy(Qgis::CoverageCleanOverlapMergeStrategy strategy)
Sets the overlap merge strategy to use during cleaning.
void setMaximumGapWidth(double width)
Sets the maximum gap width.
Custom exception class for Coordinate Reference System related exceptions.
Abstract base class for curved geometry type.
Definition qgscurve.h:36
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition qgsfeedback.h:44
Java-style iterator for const traversal of parts of a geometry.
A geometry engine is a low-level representation of a QgsAbstractGeometry object, optimised for use wi...
Encapsulates parameters under which a geometry operation is performed.
double gridSize() const
Returns the grid size which will be used to snap vertices of a geometry.
void setGridSize(double size)
Sets the grid size which will be used to snap vertices of a geometry.
Java-style iterator for traversal of parts of a geometry.
A geometry error.
Error(const QString &m)
Error(const QString &m, const QgsPointXY &p)
bool operator==(const QgsGeometry::Error &other) const
A geometry is the spatial representation of a feature.
double closestSegmentWithContext(const QgsPointXY &point, QgsPointXY &minDistPoint, int &nextVertexIndex, int *leftOrRightOfSegment=nullptr, double epsilon=Qgis::DEFAULT_SEGMENT_EPSILON) const
Searches for the closest segment of geometry to the given point.
QVector< QgsPointXY > randomPointsInPolygon(int count, const std::function< bool(const QgsPointXY &) > &acceptPoint, unsigned long seed=0, QgsFeedback *feedback=nullptr, int maxTriesPerPoint=0) const
Returns a list of count random points generated inside a (multi)polygon geometry (if acceptPoint is s...
double hausdorffDistanceDensify(const QgsGeometry &geom, double densifyFraction) const
Returns the Hausdorff distance between this geometry and geom.
double area3D() const
Returns the 3-dimensional surface area of the geometry.
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
void adjacentVertices(int atVertex, int &beforeVertex, int &afterVertex) const
Returns the indexes of the vertices before and after the given vertex index.
QVector< QgsPointXY > randomPointsInPolygon(int count, unsigned long seed=0, QgsFeedback *feedback=nullptr) const
Returns a list of count random points generated inside a (multi)polygon geometry.
bool deleteVertex(int atVertex)
Deletes the vertex at the given position number and item (first number is index 0).
double length() const
Returns the planar, 2-dimensional length of geometry.
static bool compare(const QgsPolylineXY &p1, const QgsPolylineXY &p2, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compares two polylines for equality within a specified tolerance.
QgsVertexIterator vertices() const
Returns a read-only, Java-style iterator for traversal of vertices of all the geometry,...
ChamferFilletOperationType
Privatly used in chamfer/fillet functions.
QgsAbstractGeometry::const_part_iterator const_parts_begin() const
Returns STL-style const iterator pointing to the first part of the geometry.
static QgsGeometry collectTinPatches(const QVector< QgsGeometry > &geometries)
Collects all patches from a list of TIN or Triangle geometries into a single TIN geometry.
bool addTopologicalPoint(const QgsPoint &point, double snappingTolerance=1e-8, double segmentSearchEpsilon=1e-12)
Adds a vertex to the segment which intersect point but don't already have a vertex there.
bool isExactlyEqual(const QgsGeometry &geometry, Qgis::GeometryBackend backend=Qgis::GeometryBackend::QGIS) const
Compares the geometry with another geometry using the specified backend.
QgsGeometry nearestPoint(const QgsGeometry &other) const
Returns the nearest (closest) point on this geometry to another geometry.
static QgsGeometry collectGeometry(const QVector< QgsGeometry > &geometries)
Creates a new multipart geometry from a list of QgsGeometry objects.
static QgsGeometry fromMultiPolylineXY(const QgsMultiPolylineXY &multiline)
Creates a new geometry from a QgsMultiPolylineXY object.
double frechetDistance(const QgsGeometry &geom) const
Returns the Fréchet distance between this geometry and geom, restricted to discrete points for both g...
bool isAxisParallelRectangle(double maximumDeviation, bool simpleRectanglesOnly=false) const
Returns true if the geometry is a polygon that is almost an axis-parallel rectangle.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
static QgsGeometry fromPolylineXY(const QgsPolylineXY &polyline)
Creates a new LineString geometry from a list of QgsPointXY points.
QgsPoint vertexAt(int atVertex) const
Returns coordinates of a vertex.
QgsPointXY closestVertex(const QgsPointXY &point, int &closestVertexIndex, int &previousVertexIndex, int &nextVertexIndex, double &sqrDist) const
Returns the vertex closest to the given point, the corresponding vertex index, squared distance snap ...
double distance(const QgsGeometry &geom) const
Returns the minimum distance between this geometry and another geometry.
static QgsGeometry fromMultiPointXY(const QgsMultiPointXY &multipoint)
Creates a new geometry from a QgsMultiPointXY object.
QgsAbstractGeometry * get()
Returns a modifiable (non-const) reference to the underlying abstract geometry primitive.
friend class QgsInternalGeometryEngine
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
static Q_INVOKABLE QgsGeometry fromWkt(const QString &wkt)
Creates a new geometry from a WKT string.
QgsAbstractGeometry::part_iterator parts_begin()
Returns STL-style iterator pointing to the first part of the geometry.
Q_DECL_DEPRECATED bool equals(const QgsGeometry &geometry) const
Test if this geometry is exactly equal to another geometry.
bool isGeosValid(Qgis::GeometryValidityFlags flags=Qgis::GeometryValidityFlags()) const
Checks validity of the geometry using GEOS.
bool insertVertex(double x, double y, int beforeVertex)
Insert a new vertex before the given vertex index, ring and item (first number is index 0) If the req...
static QgsGeometry fromPointXY(const QgsPointXY &point)
Creates a new geometry from a QgsPointXY object.
Qgis::GeometryOperationResult addRing(const QVector< QgsPointXY > &ring)
Adds a new ring to this geometry.
Qgis::GeometryType type
bool isSimple() const
Determines whether the geometry is simple (according to OGC definition), i.e.
static QgsGeometry fromPolyline(const QgsPolyline &polyline)
Creates a new LineString geometry from a list of QgsPoint points.
double area() const
Returns the planar, 2-dimensional area of the geometry.
bool isMultipart() const
Returns true if WKB of the geometry is of WKBMulti* type.
Qgis::AngularDirection polygonOrientation() const
Returns the orientation of the polygon.
double hausdorffDistance(const QgsGeometry &geom) const
Returns the Hausdorff distance between this geometry and geom.
bool deleteVertices(const QSet< int > &atVertices)
Deletes vertices at the given positions (first number is index 0).
Q_DECL_DEPRECATED Qgis::GeometryOperationResult addPart(const QVector< QgsPointXY > &points, Qgis::GeometryType geomType=Qgis::GeometryType::Unknown)
Adds a new part to a the geometry.
QgsGeometryPartIterator parts()
Returns Java-style iterator for traversal of parts of the geometry.
void set(QgsAbstractGeometry *geometry)
Sets the underlying geometry store.
static QgsGeometry fromPolygonXY(const QgsPolygonXY &polygon)
Creates a new geometry from a QgsPolygonXY.
double sqrDistToVertexAt(QgsPointXY &point, int atVertex) const
Returns the squared Cartesian distance between the given point to the given vertex index (vertex at t...
void fromWkb(unsigned char *wkb, int length)
Set the geometry, feeding in the buffer containing OGC Well-Known Binary and the buffer's length.
static QgsGeometry fromMultiPolygonXY(const QgsMultiPolygonXY &multipoly)
Creates a new geometry from a QgsMultiPolygonXY.
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
bool isPolygonClockwise() const
Returns True if the Polygon is clockwise.
double distanceToVertex(int vertex) const
Returns the distance along this geometry from its first vertex to the specified vertex.
QgsAbstractGeometry::const_part_iterator const_parts_end() const
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry.
QgsAbstractGeometry::part_iterator parts_end()
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry.
QgsAbstractGeometry::vertex_iterator vertices_begin() const
Returns STL-style iterator pointing to the first vertex of the geometry.
bool isFuzzyEqual(const QgsGeometry &geometry, double epsilon=1e-4, Qgis::GeometryBackend backend=Qgis::GeometryBackend::QGIS) const
Compares the geometry with another geometry within the tolerance epsilon using the specified backend.
static QgsGeometry createWedgeBuffer(const QgsPoint &center, double azimuth, double angularWidth, double outerRadius, double innerRadius=0)
Creates a wedge shaped buffer from a center point.
double frechetDistanceDensify(const QgsGeometry &geom, double densifyFraction) const
Returns the Fréchet distance between this geometry and geom, restricted to discrete points for both g...
bool isTopologicallyEqual(const QgsGeometry &geometry, Qgis::GeometryBackend backend=Qgis::GeometryBackend::GEOS) const
Compares the geometry with another geometry using the specified backend.
QgsGeometryConstPartIterator constParts() const
Returns Java-style iterator for traversal of parts of the geometry.
bool isPolygonCounterClockwise() const
Returns True if the Polygon is counter-clockwise.
Qgis::GeometryOperationResult addPartV2(const QVector< QgsPointXY > &points, Qgis::WkbType wkbType=Qgis::WkbType::Unknown)
Adds a new part to a the geometry.
Qgis::GeometryOperationResult rotate(double rotation, const QgsPointXY &center)
Rotate this geometry around the Z axis.
Qgis::GeometryOperationResult translate(double dx, double dy, double dz=0.0, double dm=0.0)
Translates this geometry by dx, dy, dz and dm.
double angleAtVertex(int vertex) const
Returns the bisector angle for this geometry at the specified vertex.
double closestVertexWithContext(const QgsPointXY &point, int &atVertex) const
Searches for the closest vertex in this geometry to the given point.
Q_DECL_DEPRECATED Qgis::GeometryOperationResult splitGeometry(const QVector< QgsPointXY > &splitLine, QVector< QgsGeometry > &newGeometries, bool topological, QVector< QgsPointXY > &topologyTestPoints, bool splitFeature=true)
Splits this geometry according to a given line.
bool toggleCircularAtVertex(int atVertex)
Converts the vertex at the given position from/to circular.
Qgis::WkbType wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.).
bool moveVertex(double x, double y, int atVertex)
Moves the vertex at the given position number and item (first number is index 0) to the given coordin...
Q_DECL_DEPRECATED bool isGeosEqual(const QgsGeometry &) const
Compares the geometry with another geometry using GEOS.
static QgsGeometry fromBox3D(const QgsBox3D &box)
Creates a new geometry from a QgsBox3D object Returns a 2D polygon geometry if the box is purely 2d,...
QgsAbstractGeometry::vertex_iterator vertices_end() const
Returns STL-style iterator pointing to the imaginary vertex after the last vertex of the geometry.
static QgsGeometry createWedgeBufferFromAngles(const QgsPoint &center, double startAngle, double endAngle, double outerRadius, double innerRadius=0)
Creates a wedge shaped buffer from a center point.
QgsGeometry removeInteriorRings(double minimumAllowedArea=-1) const
Removes the interior rings from a (multi)polygon geometry.
static QgsGeometry fromPoint(const QgsPoint &point)
Creates a new geometry from a QgsPoint object.
QgsGeometry shortestLine(const QgsGeometry &other) const
Returns the shortest line joining this geometry to another geometry.
Custom exception class when argument are invalid.
Line string geometry type, with support for z-dimension and m-values.
Perform transforms between map coordinates and device coordinates.
Custom exception class which is raised when an operation is not supported.
Represents a 2D point.
Definition qgspointxy.h:62
Point geometry type, with support for z-dimension and m-values.
Definition qgspoint.h:53
Polygon geometry type.
Definition qgspolygon.h:37
A rectangle specified with double values.
Represents a vector layer which manages a vector based dataset.
Java-style iterator for traversal of vertices of a geometry.
static Qgis::GeometryType geometryType(Qgis::WkbType type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
static Q_INVOKABLE QString displayString(Qgis::WkbType type)
Returns a non-translated display string type for a WKB type, e.g., the geometry name used in WKT geom...
static Qgis::WkbType flatType(Qgis::WkbType type)
Returns the flat type for a WKB type.
static Q_INVOKABLE bool isMultiType(Qgis::WkbType type)
Returns true if the WKB type is a multi type.
As part of the API refactoring and improvements which landed in QGIS
#define SIP_TYPEHINT(type)
Definition qgis_sip.h:237
#define SIP_IN
Definition qgis_sip.h:70
#define SIP_DEPRECATED
Definition qgis_sip.h:113
#define SIP_SKIP
Definition qgis_sip.h:133
#define SIP_PYNAME(name)
Definition qgis_sip.h:88
#define SIP_PYARGREMOVE
Definition qgis_sip.h:158
#define SIP_TRANSFER
Definition qgis_sip.h:35
#define SIP_OUT
Definition qgis_sip.h:57
#define SIP_HOLDGIL
Definition qgis_sip.h:178
#define SIP_FACTORY
Definition qgis_sip.h:83
#define SIP_THROW(name,...)
Definition qgis_sip.h:210
QVector< QgsPoint > QgsPointSequence
Q_DECLARE_METATYPE(QgsDatabaseQueryLogEntry)
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
QVector< QgsPolylineXY > QgsPolygonXY
Polygon: first item of the list is outer ring, inner rings (if any) start from second item.
Definition qgsgeometry.h:92
QVector< QgsPolylineXY > QgsMultiPolylineXY
A collection of QgsPolylines that share a common collection of attributes.
QVector< QgsPointXY > QgsMultiPointXY
A collection of QgsPoints that share a common collection of attributes.
Definition qgsgeometry.h:98
QVector< QgsPointXY > QgsPolylineXY
Polyline as represented as a vector of two-dimensional points.
Definition qgsgeometry.h:63
QVector< QgsPolyline > QgsMultiPolyline
Multi polyline represented as a vector of polylines.
Definition qgsgeometry.h:85
QVector< QgsPolygonXY > QgsMultiPolygonXY
A collection of QgsPolygons that share a common collection of attributes.
QgsPointSequence QgsPolyline
Polyline as represented as a vector of points.
Definition qgsgeometry.h:72
Utility class for identifying a unique vertex within a geometry.
Definition qgsvertexid.h:35