QGIS API Documentation 4.1.0-Master (467af3bbe65)
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
177class CORE_EXPORT QgsGeometry
178{
179 Q_GADGET
180 Q_PROPERTY( bool isNull READ isNull )
181 Q_PROPERTY( Qgis::GeometryType type READ type )
182
183 public:
184 // clang-format off
186 // clang-format on
187
189 QgsGeometry( const QgsGeometry & );
190
195 QgsGeometry &operator=( QgsGeometry const &rhs ) SIP_SKIP;
196
202
208 explicit QgsGeometry( std::unique_ptr< QgsAbstractGeometry > geom ) SIP_SKIP;
209
210 virtual ~QgsGeometry();
211
223
236
249
257 bool isNull() const SIP_HOLDGIL;
258
260 Q_INVOKABLE static QgsGeometry fromWkt( const QString &wkt );
262 static QgsGeometry fromPointXY( const QgsPointXY &point ) SIP_HOLDGIL;
263
269 static QgsGeometry fromPoint( const QgsPoint &point ) SIP_HOLDGIL;
270
272 static QgsGeometry fromMultiPointXY( const QgsMultiPointXY &multipoint );
273
284 static QgsGeometry fromPolylineXY( const QgsPolylineXY &polyline );
285
294 static QgsGeometry fromPolyline( const QgsPolyline &polyline );
295
299 static QgsGeometry fromMultiPolylineXY( const QgsMultiPolylineXY &multiline );
300
301#ifndef SIP_RUN
302
306#else
307
325#endif
326 static QgsGeometry fromPolygonXY( const QgsPolygonXY &polygon );
327
331 static QgsGeometry fromMultiPolygonXY( const QgsMultiPolygonXY &multipoly );
332
334 static QgsGeometry fromRect( const QgsRectangle &rect ) SIP_HOLDGIL;
335
343 static QgsGeometry fromBox3D( const QgsBox3D &box ) SIP_HOLDGIL;
344
345
347 static QgsGeometry collectGeometry( const QVector<QgsGeometry> &geometries );
348
364 static QgsGeometry collectTinPatches( const QVector<QgsGeometry> &geometries );
365
381 static QgsGeometry createWedgeBuffer( const QgsPoint &center, double azimuth, double angularWidth, double outerRadius, double innerRadius = 0 );
382
396 static QgsGeometry createWedgeBufferFromAngles( const QgsPoint &center, double startAngle, double endAngle, double outerRadius, double innerRadius = 0 );
397
403 void fromWkb( unsigned char *wkb, int length ) SIP_SKIP;
404
408 void fromWkb( const QByteArray &wkb );
409
415
420 Qgis::GeometryType type() const SIP_HOLDGIL;
421
428 bool isEmpty() const SIP_HOLDGIL;
429
431 bool isMultipart() const SIP_HOLDGIL;
432
446 Q_DECL_DEPRECATED bool equals( const QgsGeometry &geometry ) const SIP_DEPRECATED;
447
463 Q_DECL_DEPRECATED bool isGeosEqual( const QgsGeometry & ) const SIP_DEPRECATED;
464
483 bool isExactlyEqual( const QgsGeometry &geometry, Qgis::GeometryBackend backend = Qgis::GeometryBackend::QGIS ) const SIP_THROW( QgsNotSupportedException );
484
502 bool isTopologicallyEqual( const QgsGeometry &geometry, Qgis::GeometryBackend backend = Qgis::GeometryBackend::GEOS ) const SIP_THROW( QgsNotSupportedException );
503
521 bool isFuzzyEqual( const QgsGeometry &geometry, double epsilon, Qgis::GeometryBackend backend = Qgis::GeometryBackend::QGIS ) const SIP_THROW( QgsNotSupportedException );
522
529 bool isGeosValid( Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const;
530
538 bool isSimple() const;
539
553 bool isAxisParallelRectangle( double maximumDeviation, bool simpleRectanglesOnly = false ) const;
554
567 double area() const;
568
583
597 double length() const;
598
606 double distance( const QgsGeometry &geom ) const;
607
608#ifndef SIP_RUN
609
610 // TODO QGIS 5: consider renaming vertices_begin, vertices_end, parts_begin, parts_end, etc
611 // to camelCase
612
617
622#endif
623
647
648#ifndef SIP_RUN
649
659
669
679
689#endif
690
729
763
780 double hausdorffDistance( const QgsGeometry &geom ) const;
781
799 double hausdorffDistanceDensify( const QgsGeometry &geom, double densifyFraction ) const;
800
815 double frechetDistance( const QgsGeometry &geom ) const SIP_THROW( QgsNotSupportedException );
816
839 double frechetDistanceDensify( const QgsGeometry &geom, double densifyFraction ) const SIP_THROW( QgsNotSupportedException );
840
853 QgsPointXY closestVertex( const QgsPointXY &point, int &closestVertexIndex SIP_OUT, int &previousVertexIndex SIP_OUT, int &nextVertexIndex SIP_OUT, double &sqrDist SIP_OUT ) const;
854
862 double distanceToVertex( int vertex ) const;
863
870 double angleAtVertex( int vertex ) const;
871
884 void adjacentVertices( int atVertex, int &beforeVertex SIP_OUT, int &afterVertex SIP_OUT ) const;
885
898 bool insertVertex( double x, double y, int beforeVertex );
899
912 bool insertVertex( const QgsPoint &point, int beforeVertex );
913
921 bool addTopologicalPoint( const QgsPoint &point, double snappingTolerance = 1e-8, double segmentSearchEpsilon = 1e-12 );
922
930 bool moveVertex( double x, double y, int atVertex );
931
939 bool moveVertex( const QgsPoint &p, int atVertex );
940
953 bool deleteVertex( int atVertex );
954
962 bool toggleCircularAtVertex( int atVertex );
963
969 QgsPoint vertexAt( int atVertex ) const;
970
976 double sqrDistToVertexAt( QgsPointXY &point SIP_IN, int atVertex ) const;
977
982 QgsGeometry nearestPoint( const QgsGeometry &other ) const;
983
993 QgsGeometry shortestLine( const QgsGeometry &other ) const;
994
1001 double closestVertexWithContext( const QgsPointXY &point, int &atVertex SIP_OUT ) const;
1002
1014 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;
1015
1021 Qgis::GeometryOperationResult addRing( const QVector<QgsPointXY> &ring );
1022
1029
1037 Q_DECL_DEPRECATED Qgis::GeometryOperationResult addPart( const QVector<QgsPointXY> &points, Qgis::GeometryType geomType = Qgis::GeometryType::Unknown ) SIP_PYNAME( addPointsXY ) SIP_DEPRECATED;
1038
1046 Qgis::GeometryOperationResult addPartV2( const QVector<QgsPointXY> &points, Qgis::WkbType wkbType = Qgis::WkbType::Unknown ) SIP_PYNAME( addPointsXYV2 );
1047
1056
1065
1074
1083
1089 Qgis::GeometryOperationResult addPart( const QgsGeometry &newPart ) SIP_PYNAME( addPartGeometry );
1090
1096 QgsGeometry removeInteriorRings( double minimumAllowedArea = -1 ) const;
1097
1102 Qgis::GeometryOperationResult translate( double dx, double dy, double dz = 0.0, double dm = 0.0 );
1103
1119
1128 Qgis::GeometryOperationResult transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 );
1129
1136 Qgis::GeometryOperationResult rotate( double rotation, const QgsPointXY &center );
1137
1148 Q_DECL_DEPRECATED Qgis::GeometryOperationResult splitGeometry( const QVector<QgsPointXY> &splitLine, QVector<QgsGeometry> &newGeometries, bool topological, QVector<QgsPointXY> &topologyTestPoints, bool splitFeature = true ) SIP_SKIP;
1149
1171 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;
1172
1173
1174 /*
1175 This SIP code is to support overloaded methods of splitGeometry.
1176 When the deprecated method is removed in QGIS 5.0 this code can be dropped
1177 TODO QGIS 5 remove MethodCode
1178 */
1179#ifdef SIP_RUN
1180// clang-format off
1181
1200 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]]] );
1201 % MethodCode
1202 {
1203 int sipIsErr = 0;
1204 int state;
1205
1206 if ( PyList_Check( a0 ) && PyList_GET_SIZE( a0 ) )
1207 {
1208 PyObject *p0 = PyList_GetItem( a0, 0 );
1209 if ( sipCanConvertToType( p0, sipType_QgsPointXY, SIP_NOT_NONE ) && sipCanConvertToType( a0, sipType_QVector_0100QgsPointXY, SIP_NOT_NONE ) )
1210 {
1211 QVector<QgsGeometry> newGeometries;
1212 QVector<QgsPointXY> topologyTestPoints;
1213
1214 QVector<QgsPointXY> *splitLine = reinterpret_cast<QVector<QgsPointXY> *>( sipConvertToType( a0, sipType_QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
1215 if ( !sipIsErr )
1216 {
1217 Qgis::GeometryOperationResult result = sipCpp->splitGeometry( *splitLine, newGeometries, a1, topologyTestPoints, a2 );
1218
1219 PyObject *o0 = sipConvertFromEnum( static_cast<int>( result ), sipType_Qgis_GeometryOperationResult );
1220 PyObject *o1 = sipConvertFromType( &newGeometries, sipType_QVector_0100QgsGeometry, Py_None );
1221 PyObject *o2 = sipConvertFromType( &topologyTestPoints, sipType_QVector_0100QgsPointXY, Py_None );
1222
1223 sipRes = PyTuple_New( 3 );
1224 PyTuple_SET_ITEM( sipRes, 0, o0 );
1225 PyTuple_SET_ITEM( sipRes, 1, o1 );
1226 PyTuple_SET_ITEM( sipRes, 2, o2 );
1227 }
1228 sipReleaseType( splitLine, sipType_QVector_0100QgsPointXY, state );
1229 }
1230
1231 else if ( sipCanConvertToType( p0, sipType_QgsPoint, SIP_NOT_NONE ) && sipCanConvertToType( a0, sipType_QVector_0100QgsPoint, SIP_NOT_NONE ) )
1232 {
1233 QVector<QgsGeometry> newGeometries;
1234 QVector<QgsPoint> topologyTestPoints;
1235
1236 QVector<QgsPoint> *splitLine = reinterpret_cast<QVector<QgsPoint> *>( sipConvertToType( a0, sipType_QVector_0100QgsPoint, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
1237 if ( !sipIsErr )
1238 {
1239 Qgis::GeometryOperationResult result = sipCpp->splitGeometry( *splitLine, newGeometries, a1, topologyTestPoints, a2 );
1240
1241 PyObject *o0 = sipConvertFromEnum( static_cast<int>( result ), sipType_Qgis_GeometryOperationResult );
1242 PyObject *o1 = sipConvertFromType( &newGeometries, sipType_QVector_0100QgsGeometry, Py_None );
1243 PyObject *o2 = sipConvertFromType( &topologyTestPoints, sipType_QVector_0100QgsPoint, Py_None );
1244
1245 sipRes = PyTuple_New( 3 );
1246 PyTuple_SET_ITEM( sipRes, 0, o0 );
1247 PyTuple_SET_ITEM( sipRes, 1, o1 );
1248 PyTuple_SET_ITEM( sipRes, 2, o2 );
1249 }
1250 sipReleaseType( splitLine, sipType_QVector_0100QgsPoint, state );
1251 }
1252 else
1253 {
1254 sipIsErr = 1;
1255 PyErr_SetString( PyExc_TypeError, u"Could not convert first argument to a list of QgsPoint or QgsPointXY."_s.toUtf8().constData() );
1256 }
1257 }
1258 else
1259 {
1260 sipIsErr = 1;
1261 PyErr_SetString( PyExc_TypeError, u"First argument is not a list of points or is empty."_s.toUtf8().constData() );
1262 }
1263 }
1264 % End
1265// clang-format on
1266#endif
1267
1279 Qgis::GeometryOperationResult splitGeometry( const QgsCurve *curve, QVector<QgsGeometry> &newGeometries SIP_OUT, bool preserveCircular, bool topological, QgsPointSequence &topologyTestPoints SIP_OUT, bool splitFeature = true );
1280
1285 Qgis::GeometryOperationResult reshapeGeometry( const QgsLineString &reshapeLineString );
1286
1293 int makeDifferenceInPlace( const QgsGeometry &other, QgsFeedback* feedback = nullptr ) SIP_SKIP;
1294
1302 QgsGeometry makeDifference( const QgsGeometry &other, QgsFeedback* feedback = nullptr ) const;
1303
1308 QgsRectangle boundingBox() const;
1309
1315 QgsBox3D boundingBox3D() const;
1316
1329 QgsGeometry orientedMinimumBoundingBox( double &area SIP_OUT, double &angle SIP_OUT, double &width SIP_OUT, double &height SIP_OUT ) const;
1330
1340 QgsGeometry orientedMinimumBoundingBox() const SIP_SKIP;
1341
1349 QgsGeometry minimalEnclosingCircle( QgsPointXY &center SIP_OUT, double &radius SIP_OUT, unsigned int segments = 36 ) const;
1350
1355 QgsGeometry minimalEnclosingCircle( unsigned int segments = 36 ) const SIP_SKIP;
1356
1364 QgsGeometry orthogonalize( double tolerance = 1.0E-8, int maxIterations = 1000, double angleThreshold = 15.0 ) const;
1365
1378 QgsGeometry triangularWaves( double wavelength, double amplitude, bool strictWavelength = false ) const;
1379
1398 QgsGeometry triangularWavesRandomized( double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed = 0 ) const;
1399
1412 QgsGeometry squareWaves( double wavelength, double amplitude, bool strictWavelength = false ) const;
1413
1432 QgsGeometry squareWavesRandomized( double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed = 0 ) const;
1433
1446 QgsGeometry roundWaves( double wavelength, double amplitude, bool strictWavelength = false ) const;
1447
1466 QgsGeometry roundWavesRandomized( double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed = 0 ) const;
1467
1481 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;
1482
1494 QgsGeometry snappedToGrid( double hSpacing, double vSpacing, double dSpacing = 0, double mSpacing = 0 ) const;
1495
1515 bool removeDuplicateNodes( double epsilon = 4 * std::numeric_limits<double>::epsilon(), bool useZValues = false );
1516
1526 bool intersects( const QgsRectangle &rectangle ) const;
1527
1542 bool intersects( const QgsGeometry &geometry ) const;
1543
1552 bool boundingBoxIntersects( const QgsRectangle &rectangle ) const;
1553
1562 bool boundingBoxIntersects( const QgsGeometry &geometry ) const;
1563
1567 bool contains( const QgsPointXY *p ) const;
1568
1574 bool contains( double x, double y ) const;
1575
1585 bool contains( const QgsGeometry &geometry ) const;
1586
1596 bool disjoint( const QgsGeometry &geometry ) const;
1597
1607 bool touches( const QgsGeometry &geometry ) const;
1608
1618 bool overlaps( const QgsGeometry &geometry ) const;
1619
1629 bool within( const QgsGeometry &geometry ) const;
1630
1640 bool crosses( const QgsGeometry &geometry ) const;
1641
1651 QgsGeometry buffer( double distance, int segments, QgsFeedback* feedback = nullptr ) const;
1652
1665 QgsGeometry buffer( double distance, int segments, Qgis::EndCapStyle endCapStyle, Qgis::JoinStyle joinStyle, double miterLimit, QgsFeedback* feedback = nullptr ) const;
1666
1674 QgsGeometry offsetCurve( double distance, int segments, Qgis::JoinStyle joinStyle, double miterLimit ) const;
1675
1690 QgsGeometry singleSidedBuffer( double distance, int segments, Qgis::BufferSide side, Qgis::JoinStyle joinStyle = Qgis::JoinStyle::Round, double miterLimit = 2.0 ) const;
1691
1709 QgsGeometry taperedBuffer( double startWidth, double endWidth, int segments ) const;
1710
1725 QgsGeometry variableWidthBufferByM( int segments ) const;
1726
1732 QgsGeometry extendLine( double startDistance, double endDistance ) const;
1733
1739 QgsGeometry simplify( double tolerance, QgsFeedback* feedback = nullptr ) const;
1740
1749 QgsGeometry densifyByCount( int extraNodesPerSegment ) const;
1750
1764 QgsGeometry densifyByDistance( double distance ) const;
1765
1781 QgsGeometry convertToCurves( double distanceTolerance = 1e-8, double angleTolerance = 1e-8 ) const;
1782
1796 QgsGeometry centroid() const;
1797
1811 QgsGeometry pointOnSurface() const;
1812
1824 QgsGeometry poleOfInaccessibility( double precision, double *distanceToBoundary SIP_OUT = nullptr ) const;
1825
1849 QgsGeometry largestEmptyCircle( double tolerance, const QgsGeometry &boundary = QgsGeometry() ) const SIP_THROW( QgsNotSupportedException );
1850
1865 QgsGeometry minimumWidth() const SIP_THROW( QgsNotSupportedException );
1866
1888 double minimumClearance() const SIP_THROW( QgsNotSupportedException );
1889
1901 QgsGeometry minimumClearanceLine() const SIP_THROW( QgsNotSupportedException );
1902
1911 QgsGeometry convexHull() const;
1912
1928 QgsGeometry concaveHull( double targetPercent, bool allowHoles = false, QgsFeedback * feedback = nullptr ) const SIP_THROW( QgsNotSupportedException );
1929
1965 QgsGeometry concaveHullOfPolygons( double lengthRatio, bool allowHoles = false, bool isTight = false, QgsFeedback *feedback = nullptr ) const SIP_THROW( QgsNotSupportedException );
1966
1981 QgsGeometry voronoiDiagram( const QgsGeometry &extent = QgsGeometry(), double tolerance = 0.0, bool edgesOnly = false ) const;
1982
1993 QgsGeometry delaunayTriangulation( double tolerance = 0.0, bool edgesOnly = false ) const;
1994
2007 QgsGeometry constrainedDelaunayTriangulation() const SIP_THROW( QgsNotSupportedException );
2008
2026 Qgis::CoverageValidityResult validateCoverage( double gapWidth, QgsGeometry *invalidEdges SIP_OUT = nullptr ) const SIP_THROW( QgsNotSupportedException );
2027
2048 QgsGeometry simplifyCoverageVW( double tolerance, bool preserveBoundary ) const SIP_THROW( QgsNotSupportedException );
2049
2061 QgsGeometry unionCoverage() const;
2062
2073 QgsGeometry node() const;
2074
2089 QgsGeometry sharedPaths( const QgsGeometry &other ) const;
2090
2113 QgsGeometry subdivide( int maxNodes = 256, const QgsGeometryParameters &parameters = QgsGeometryParameters(), QgsFeedback* feedback = nullptr ) const;
2114
2129 QgsGeometry interpolate( double distance ) const;
2130
2141 double lineLocatePoint( const QgsGeometry &point ) const;
2142
2151 double interpolateAngle( double distance ) const;
2152
2166 QgsGeometry intersection( const QgsGeometry &geometry, const QgsGeometryParameters &parameters = QgsGeometryParameters(), QgsFeedback* feedback = nullptr ) const;
2167
2176 QgsGeometry clipped( const QgsRectangle &rectangle, QgsFeedback* feedback = nullptr );
2177
2194 QgsGeometry combine( const QgsGeometry &geometry, const QgsGeometryParameters &parameters = QgsGeometryParameters(), QgsFeedback* feedback = nullptr ) const;
2195
2206 QgsGeometry mergeLines( const QgsGeometryParameters &parameters = QgsGeometryParameters() ) const;
2207
2221 QgsGeometry difference( const QgsGeometry &geometry, const QgsGeometryParameters &parameters = QgsGeometryParameters(), QgsFeedback* feedback = nullptr ) const;
2222
2236 QgsGeometry symDifference( const QgsGeometry &geometry, const QgsGeometryParameters &parameters = QgsGeometryParameters(), QgsFeedback* feedback = nullptr ) const;
2237
2239 QgsGeometry extrude( double x, double y );
2240
2241#ifndef SIP_RUN
2242
2264 QVector< QgsPointXY > randomPointsInPolygon( int count, const std::function< bool( const QgsPointXY & ) > &acceptPoint, unsigned long seed = 0, QgsFeedback *feedback = nullptr, int maxTriesPerPoint = 0 ) const;
2265
2279 QVector< QgsPointXY > randomPointsInPolygon( int count, unsigned long seed = 0, QgsFeedback *feedback = nullptr ) const;
2281#else
2282// clang-format off
2283
2297 SIP_PYOBJECT randomPointsInPolygon( int count, unsigned long seed = 0 ) const SIP_TYPEHINT( QgsPolylineXY );
2298 % MethodCode
2299 const Qgis::GeometryType type = sipCpp->type();
2300 if ( sipCpp->isNull() )
2301 {
2302 PyErr_SetString( PyExc_ValueError, u"Cannot generate points inside a null geometry."_s.toUtf8().constData() );
2303 sipIsErr = 1;
2304 }
2305 else if ( type != Qgis::GeometryType::Polygon )
2306 {
2307 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() );
2308 sipIsErr = 1;
2309 }
2310 else
2311 {
2312 const sipTypeDef *qvector_type = sipFindType( "QVector<QgsPointXY>" );
2313 sipRes = sipConvertFromNewType( new QVector< QgsPointXY >( sipCpp->randomPointsInPolygon( a0, a1 ) ), qvector_type, Py_None );
2314 }
2315 % End
2316
2317
2318// clang-format on
2319#endif
2321
2329 int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;
2330
2337 QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;
2338
2344 Q_INVOKABLE QString asWkt( int precision = 17 ) const;
2345
2346#ifdef SIP_RUN
2347// clang-format off
2348 SIP_PYOBJECT __repr__();
2349 % MethodCode
2350 QString str;
2351 if ( sipCpp->isNull() )
2352 str = u"<QgsGeometry: null>"_s;
2353 else
2354 {
2355 QString wkt = sipCpp->asWkt();
2356 if ( wkt.length() > 1000 )
2357 wkt = wkt.left( 1000 ) + u"..."_s;
2358 str = u"<QgsGeometry: %1>"_s.arg( wkt );
2359 }
2360 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
2361 % End
2362// clang-format on
2363#endif
2364
2368 QString asJson( int precision = 17 ) const;
2369
2375 virtual json asJsonObject( int precision = 17 ) const SIP_SKIP;
2376
2413 QVector< QgsGeometry > coerceToType( Qgis::WkbType type, double defaultZ = 0, double defaultM = 0, bool avoidDuplicates = true ) const;
2414
2426 QgsGeometry convertToType( Qgis::GeometryType destType, bool destMultipart = false ) const;
2427
2428 /* Accessor functions for getting geometry data */
2429
2430#ifndef SIP_RUN
2431
2440 QgsPointXY asPoint() const;
2441#else
2442// clang-format off
2443
2454 SIP_PYOBJECT asPoint() const SIP_TYPEHINT( QgsPointXY );
2455 % MethodCode
2456 if ( sipCpp->isNull() )
2457 {
2458 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a point."_s.toUtf8().constData() );
2459 sipIsErr = 1;
2460 }
2461 else
2462 {
2463 const QgsAbstractGeometry *geom = sipCpp->constGet();
2465 {
2466 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() );
2467 sipIsErr = 1;
2468 }
2469 else
2470 {
2471 sipRes = sipConvertFromNewType( new QgsPointXY( sipCpp->asPoint() ), sipType_QgsPointXY, Py_None );
2472 }
2473 }
2474 % End
2475// clang-format on
2476#endif
2477
2478#ifndef SIP_RUN
2479
2488 QgsPolylineXY asPolyline() const;
2489#else
2490// clang-format off
2491
2503 SIP_PYOBJECT asPolyline() const SIP_TYPEHINT( QgsPolylineXY );
2504 % MethodCode
2505 const Qgis::WkbType type = sipCpp->wkbType();
2506 if ( sipCpp->isNull() )
2507 {
2508 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a polyline."_s.toUtf8().constData() );
2509 sipIsErr = 1;
2510 }
2512 {
2513 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() );
2514 sipIsErr = 1;
2515 }
2516 else
2517 {
2518 const sipTypeDef *qvector_type = sipFindType( "QVector< QgsPointXY >" );
2519 sipRes = sipConvertFromNewType( new QgsPolylineXY( sipCpp->asPolyline() ), qvector_type, Py_None );
2520 }
2521 % End
2522// clang-format on
2523#endif
2524
2525#ifndef SIP_RUN
2526
2535 QgsPolygonXY asPolygon() const;
2536#else
2537// clang-format off
2538
2550 SIP_PYOBJECT asPolygon() const SIP_TYPEHINT( QgsPolygonXY );
2551 % MethodCode
2552 const Qgis::WkbType type = sipCpp->wkbType();
2553 if ( sipCpp->isNull() )
2554 {
2555 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a polygon."_s.toUtf8().constData() );
2556 sipIsErr = 1;
2557 }
2559 {
2560 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() );
2561 sipIsErr = 1;
2562 }
2563 else
2564 {
2565 const sipTypeDef *qvector_type = sipFindType( "QVector<QVector<QgsPointXY>>" );
2566 sipRes = sipConvertFromNewType( new QgsPolygonXY( sipCpp->asPolygon() ), qvector_type, Py_None );
2567 }
2568 % End
2569// clang-format on
2570#endif
2571
2572#ifndef SIP_RUN
2573
2581 QgsMultiPointXY asMultiPoint() const;
2582#else
2583// clang-format off
2584
2595 SIP_PYOBJECT asMultiPoint() const SIP_TYPEHINT( QgsMultiPointXY );
2596 % MethodCode
2597 const Qgis::WkbType type = sipCpp->wkbType();
2598 if ( sipCpp->isNull() )
2599 {
2600 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a multipoint."_s.toUtf8().constData() );
2601 sipIsErr = 1;
2602 }
2604 {
2605 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() );
2606 sipIsErr = 1;
2607 }
2608 else
2609 {
2610 const sipTypeDef *qvector_type = sipFindType( "QVector< QgsPointXY >" );
2611 sipRes = sipConvertFromNewType( new QgsPolylineXY( sipCpp->asMultiPoint() ), qvector_type, Py_None );
2612 }
2613 % End
2614// clang-format on
2615#endif
2616
2617#ifndef SIP_RUN
2618
2627 QgsMultiPolylineXY asMultiPolyline() const;
2628#else
2629// clang-format off
2630
2642 SIP_PYOBJECT asMultiPolyline() const SIP_TYPEHINT( QgsMultiPolylineXY );
2643 % MethodCode
2644 const Qgis::WkbType type = sipCpp->wkbType();
2645 if ( sipCpp->isNull() )
2646 {
2647 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a multilinestring."_s.toUtf8().constData() );
2648 sipIsErr = 1;
2649 }
2651 {
2652 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() );
2653 sipIsErr = 1;
2654 }
2655 else
2656 {
2657 const sipTypeDef *qvector_type = sipFindType( "QVector<QVector<QgsPointXY>>" );
2658 sipRes = sipConvertFromNewType( new QgsMultiPolylineXY( sipCpp->asMultiPolyline() ), qvector_type, Py_None );
2659 }
2660 % End
2661// clang-format on
2662#endif
2663
2664#ifndef SIP_RUN
2665
2674 QgsMultiPolygonXY asMultiPolygon() const;
2675#else
2676// clang-format off
2677
2689 SIP_PYOBJECT asMultiPolygon() const SIP_TYPEHINT( QgsMultiPolygonXY );
2690 % MethodCode
2691 const Qgis::WkbType type = sipCpp->wkbType();
2692 if ( sipCpp->isNull() )
2693 {
2694 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a multipolygon."_s.toUtf8().constData() );
2695 sipIsErr = 1;
2696 }
2698 {
2699 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() );
2700 sipIsErr = 1;
2701 }
2702 else
2703 {
2704 const sipTypeDef *qvector_type = sipFindType( "QVector<QVector<QVector<QgsPointXY>>>" );
2705 sipRes = sipConvertFromNewType( new QgsMultiPolygonXY( sipCpp->asMultiPolygon() ), qvector_type, Py_None );
2706 }
2707 % End
2708// clang-format on
2709#endif
2710
2714 QVector<QgsGeometry> asGeometryCollection() const;
2715
2720 QPointF asQPointF() const SIP_HOLDGIL;
2721
2733 QPolygonF asQPolygonF() const SIP_HOLDGIL;
2734
2740 bool deleteRing( int ringNum, int partNum = 0 );
2741
2746 bool deletePart( int partNum );
2747
2756 bool convertToMultiType();
2757
2773 bool convertToCurvedMultiType();
2774
2784 bool convertToSingleType();
2785
2795 bool convertGeometryCollectionToSubclass( Qgis::GeometryType geomType );
2796
2808 Q_DECL_DEPRECATED int avoidIntersections( const QList<QgsVectorLayer *> &avoidIntersectionsLayers, const QHash<QgsVectorLayer *, QSet<QgsFeatureId> > &ignoreFeatures SIP_PYARGREMOVE = ( QHash<QgsVectorLayer *, QSet<QgsFeatureId> >() ) ) SIP_DEPRECATED;
2809
2821 Qgis::GeometryOperationResult avoidIntersectionsV2( const QList<QgsVectorLayer *> &avoidIntersectionsLayers, const QHash<QgsVectorLayer *, QSet<QgsFeatureId> > &ignoreFeatures SIP_PYARGREMOVE = ( QHash<QgsVectorLayer *, QSet<QgsFeatureId> >() ) );
2822
2844 QgsGeometry makeValid( Qgis::MakeValidMethod method = Qgis::MakeValidMethod::Linework, bool keepCollapsed = false, QgsFeedback* feedback = nullptr ) const SIP_THROW( QgsNotSupportedException );
2845
2855 Qgis::AngularDirection polygonOrientation() const;
2856
2871
2886
2887
2902 QgsGeometry forceRHR() const;
2903
2914 QgsGeometry forcePolygonClockwise() const;
2915
2926 QgsGeometry forcePolygonCounterClockwise() const;
2927
2932 class CORE_EXPORT Error
2933 {
2934 public:
2936 : mMessage( u"none"_s )
2937 {}
2938
2939 explicit Error( const QString &m )
2940 : mMessage( m )
2941 {}
2942
2943 Error( const QString &m, const QgsPointXY &p )
2944 : mMessage( m )
2945 , mLocation( p )
2946 , mHasLocation( true ) {}
2947
2951 QString what() const;
2952
2956 QgsPointXY where() const;
2957
2961 bool hasWhere() const;
2962
2963#ifdef SIP_RUN
2964// clang-format off
2965 SIP_PYOBJECT __repr__();
2966 % MethodCode
2967 QString str = u"<QgsGeometry.Error: %1>"_s.arg( sipCpp->what() );
2968 sipRes = PyUnicode_FromString( str.toUtf8().data() );
2969 % End
2970// clang-format on
2971#endif
2972
2973 // TODO c++20 - replace with = default
2974 bool operator==( const QgsGeometry::Error &other ) const
2975 {
2976 return other.mMessage == mMessage && other.mHasLocation == mHasLocation && other.mLocation == mLocation;
2977 }
2978
2979 private:
2980 QString mMessage;
2981 QgsPointXY mLocation;
2982 bool mHasLocation = false;
2983 };
2984
2992 void validateGeometry( QVector<QgsGeometry::Error> &errors SIP_OUT, Qgis::GeometryValidationEngine method = Qgis::GeometryValidationEngine::QgisInternal, Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const;
2993
3003 void normalize();
3004
3015 static QgsGeometry unaryUnion( const QVector<QgsGeometry> &geometries, const QgsGeometryParameters &parameters = QgsGeometryParameters(), QgsFeedback* feedback = nullptr );
3016
3024 static QgsGeometry polygonize( const QVector<QgsGeometry> &geometries );
3025
3032 void convertToStraightSegment( double tolerance = M_PI / 180., QgsAbstractGeometry::SegmentationToleranceType toleranceType = QgsAbstractGeometry::MaximumAngle );
3033
3039 bool requiresConversionToStraightSegments() const;
3040
3045 void mapToPixel( const QgsMapToPixel &mtp );
3046
3051 void draw( QPainter &p ) const;
3052
3062 bool vertexIdFromVertexNr( int number, QgsVertexId &id SIP_OUT ) const;
3063
3074 int vertexNrFromVertexId( QgsVertexId id ) const;
3075
3082 QString lastError() const SIP_HOLDGIL;
3083
3093 void filterVertices( const std::function< bool( const QgsPoint & ) > &filter ) SIP_SKIP;
3094
3109 void transformVertices( const std::function< QgsPoint( const QgsPoint & ) > &transform ) SIP_SKIP;
3110
3115 static QgsGeometry fromQPointF( QPointF point ) SIP_HOLDGIL;
3116
3123 static QgsGeometry fromQPolygonF( const QPolygonF &polygon );
3124
3132 Q_DECL_DEPRECATED static QgsPolylineXY createPolylineFromQPolygonF( const QPolygonF &polygon ) SIP_DEPRECATED;
3133
3141 Q_DECL_DEPRECATED static QgsPolygonXY createPolygonFromQPolygonF( const QPolygonF &polygon ) SIP_DEPRECATED;
3142
3143#ifndef SIP_RUN
3144
3153 static bool compare( const QgsPolylineXY &p1, const QgsPolylineXY &p2, double epsilon = 4 * std::numeric_limits<double>::epsilon() );
3154
3163 static bool compare( const QgsPolygonXY &p1, const QgsPolygonXY &p2, double epsilon = 4 * std::numeric_limits<double>::epsilon() );
3164
3174 static bool compare( const QgsMultiPolygonXY &p1, const QgsMultiPolygonXY &p2, double epsilon = 4 * std::numeric_limits<double>::epsilon() );
3175#else
3176// clang-format off
3177
3196 static bool compare( PyObject *obj1, PyObject *obj2, double epsilon = 4 * std::numeric_limits<double>::epsilon() );
3197 % MethodCode
3198 {
3199 sipRes = false;
3200 int state0;
3201 int state1;
3202 int sipIsErr = 0;
3203
3204 if ( PyList_Check( a0 ) && PyList_Check( a1 ) && PyList_GET_SIZE( a0 ) && PyList_GET_SIZE( a1 ) )
3205 {
3206 PyObject *o0 = PyList_GetItem( a0, 0 );
3207 PyObject *o1 = PyList_GetItem( a1, 0 );
3208 if ( o0 && o1 )
3209 {
3210 // compare polyline - polyline
3211 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 ) )
3212 {
3213 QgsPolylineXY *p0;
3214 QgsPolylineXY *p1;
3215 p0 = reinterpret_cast<QgsPolylineXY *>( sipConvertToType( a0, sipType_QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
3216 p1 = reinterpret_cast<QgsPolylineXY *>( sipConvertToType( a1, sipType_QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
3217 if ( !sipIsErr )
3218 {
3219 sipRes = QgsGeometry::compare( *p0, *p1, a2 );
3220 }
3221 sipReleaseType( p0, sipType_QVector_0100QgsPointXY, state0 );
3222 sipReleaseType( p1, sipType_QVector_0100QgsPointXY, state1 );
3223 }
3224 else if ( PyList_Check( o0 ) && PyList_Check( o1 ) && PyList_GET_SIZE( o0 ) && PyList_GET_SIZE( o1 ) )
3225 {
3226 PyObject *oo0 = PyList_GetItem( o0, 0 );
3227 PyObject *oo1 = PyList_GetItem( o1, 0 );
3228 if ( oo0 && oo1 )
3229 {
3230 // compare polygon - polygon
3231 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 ) )
3232 {
3233 QgsPolygonXY *p0;
3234 QgsPolygonXY *p1;
3235 p0 = reinterpret_cast<QgsPolygonXY *>( sipConvertToType( a0, sipType_QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
3236 p1 = reinterpret_cast<QgsPolygonXY *>( sipConvertToType( a1, sipType_QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
3237 if ( !sipIsErr )
3238 {
3239 sipRes = QgsGeometry::compare( *p0, *p1, a2 );
3240 }
3241 sipReleaseType( p0, sipType_QVector_0600QVector_0100QgsPointXY, state0 );
3242 sipReleaseType( p1, sipType_QVector_0600QVector_0100QgsPointXY, state1 );
3243 }
3244 else if ( PyList_Check( oo0 ) && PyList_Check( oo1 ) && PyList_GET_SIZE( oo0 ) && PyList_GET_SIZE( oo1 ) )
3245 {
3246 PyObject *ooo0 = PyList_GetItem( oo0, 0 );
3247 PyObject *ooo1 = PyList_GetItem( oo1, 0 );
3248 if ( ooo0 && ooo1 )
3249 {
3250 // compare multipolygon - multipolygon
3251 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 ) )
3252 {
3255 p0 = reinterpret_cast<QgsMultiPolygonXY *>( sipConvertToType( a0, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
3256 p1 = reinterpret_cast<QgsMultiPolygonXY *>( sipConvertToType( a1, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
3257 if ( !sipIsErr )
3258 {
3259 sipRes = QgsGeometry::compare( *p0, *p1, a2 );
3260 }
3261 sipReleaseType( p0, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, state0 );
3262 sipReleaseType( p1, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, state1 );
3263 }
3264 }
3265 }
3266 }
3267 }
3268 }
3269 }
3270 }
3271 % End
3272// clang-format on
3273#endif
3274
3290 QgsGeometry smooth( unsigned int iterations = 1, double offset = 0.25, double minimumDistance = -1.0, double maxAngle = 180.0 ) const;
3291
3331 static QgsGeometryEngine *createGeometryEngine( const QgsAbstractGeometry *geometry, double precision = 0.0, Qgis::GeosCreationFlags flags = Qgis::GeosCreationFlag::SkipEmptyInteriorRings ) SIP_FACTORY;
3332
3338 static void convertPointList( const QVector<QgsPointXY> &input, QgsPointSequence &output );
3339
3345 static void convertPointList( const QgsPointSequence &input, QVector<QgsPointXY> &output );
3346
3348 operator QVariant() const
3349 {
3350 return QVariant::fromValue( *this );
3351 }
3352
3358 {
3359 Chamfer = 1,
3360 Fillet,
3361 };
3362#ifndef SIP_RUN
3363 Q_ENUM( ChamferFilletOperationType )
3364#endif
3365
3382 QgsGeometry fillet( int vertexIndex, double radius, int segments = 8 ) const;
3383
3402 static QgsGeometry fillet( const QgsPoint &segment1Start, const QgsPoint &segment1End, const QgsPoint &segment2Start, const QgsPoint &segment2End, double radius, int segments = 8 ) SIP_THROW( QgsInvalidArgumentException );
3403
3417 QgsGeometry chamfer( int vertexIndex, double distance1, double distance2 = -1.0 ) const;
3418
3437 static QgsGeometry chamfer( const QgsPoint &segment1Start, const QgsPoint &segment1End, const QgsPoint &segment2Start, const QgsPoint &segment2End, double distance1, double distance2 = -1.0 ) SIP_THROW( QgsInvalidArgumentException );
3438
3439
3440 private:
3441 QgsGeometryPrivate *d; //implicitly shared data pointer
3442
3444 mutable QString mLastError;
3445
3450 void detach();
3451
3456 void reset( std::unique_ptr< QgsAbstractGeometry > newGeometry );
3457
3458 static void convertPolygon( const QgsPolygon &input, QgsPolygonXY &output );
3459
3461 QgsGeometry convertToPoint( bool destMultipart ) const;
3463 QgsGeometry convertToLine( bool destMultipart ) const;
3465 QgsGeometry convertToPolygon( bool destMultipart ) const;
3466
3478 std::unique_ptr< QgsLineString > smoothLine( const QgsLineString &line, unsigned int iterations = 1, double offset = 0.25, double minimumDistance = -1, double maxAngle = 180.0 ) const;
3479
3491 std::unique_ptr< QgsPolygon > smoothPolygon( const QgsPolygon &polygon, unsigned int iterations = 1, double offset = 0.25, double minimumDistance = -1, double maxAngle = 180.0 ) const;
3492
3493 QgsGeometry doChamferFillet( ChamferFilletOperationType op, int vertexIndex, double distance1, double distance2, int segments ) const;
3494
3496
3497}; // class QgsGeometry
3498
3500
3502CORE_EXPORT QDataStream &operator<<( QDataStream &out, const QgsGeometry &geometry );
3504CORE_EXPORT QDataStream &operator>>( QDataStream &in, QgsGeometry &geometry );
3505
3506#endif
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:62
@ CounterClockwise
Counter-clockwise direction.
Definition qgis.h:3600
@ Clockwise
Clockwise direction.
Definition qgis.h:3599
GeometryOperationResult
Success or failure of a geometry operation.
Definition qgis.h:2161
QFlags< GeometryValidityFlag > GeometryValidityFlags
Geometry validity flags.
Definition qgis.h:2195
GeometryValidationEngine
Available engines for validating geometries.
Definition qgis.h:2204
@ QgisInternal
Use internal QgsGeometryValidator method.
Definition qgis.h:2205
@ SkipEmptyInteriorRings
Skip any empty polygon interior ring.
Definition qgis.h:2281
QFlags< GeosCreationFlag > GeosCreationFlags
Geos geometry creation behavior flags.
Definition qgis.h:2290
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:6714
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:2816
@ Forward
Forward transform (from source to destination).
Definition qgis.h:2817
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.
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.
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.
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.
bool isFuzzyEqual(const QgsGeometry &geometry, double epsilon, Qgis::GeometryBackend backend=Qgis::GeometryBackend::QGIS) const
Compares the geometry with another geometry within the tolerance epsilon using the specified backend.
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:239
#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:34