QGIS API Documentation 4.1.0-Master (60fea48833c)
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 bool equals( const QgsGeometry &geometry ) const;
447
463 bool isGeosEqual( const QgsGeometry & ) const;
464
471 bool isGeosValid( Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const;
472
480 bool isSimple() const;
481
495 bool isAxisParallelRectangle( double maximumDeviation, bool simpleRectanglesOnly = false ) const;
496
509 double area() const;
510
525
539 double length() const;
540
548 double distance( const QgsGeometry &geom ) const;
549
550#ifndef SIP_RUN
551
552 // TODO QGIS 5: consider renaming vertices_begin, vertices_end, parts_begin, parts_end, etc
553 // to camelCase
554
559
564#endif
565
589
590#ifndef SIP_RUN
591
601
611
621
631#endif
632
671
705
722 double hausdorffDistance( const QgsGeometry &geom ) const;
723
741 double hausdorffDistanceDensify( const QgsGeometry &geom, double densifyFraction ) const;
742
757 double frechetDistance( const QgsGeometry &geom ) const SIP_THROW( QgsNotSupportedException );
758
781 double frechetDistanceDensify( const QgsGeometry &geom, double densifyFraction ) const SIP_THROW( QgsNotSupportedException );
782
795 QgsPointXY closestVertex( const QgsPointXY &point, int &closestVertexIndex SIP_OUT, int &previousVertexIndex SIP_OUT, int &nextVertexIndex SIP_OUT, double &sqrDist SIP_OUT ) const;
796
804 double distanceToVertex( int vertex ) const;
805
812 double angleAtVertex( int vertex ) const;
813
826 void adjacentVertices( int atVertex, int &beforeVertex SIP_OUT, int &afterVertex SIP_OUT ) const;
827
840 bool insertVertex( double x, double y, int beforeVertex );
841
854 bool insertVertex( const QgsPoint &point, int beforeVertex );
855
863 bool addTopologicalPoint( const QgsPoint &point, double snappingTolerance = 1e-8, double segmentSearchEpsilon = 1e-12 );
864
872 bool moveVertex( double x, double y, int atVertex );
873
881 bool moveVertex( const QgsPoint &p, int atVertex );
882
895 bool deleteVertex( int atVertex );
896
904 bool toggleCircularAtVertex( int atVertex );
905
911 QgsPoint vertexAt( int atVertex ) const;
912
918 double sqrDistToVertexAt( QgsPointXY &point SIP_IN, int atVertex ) const;
919
924 QgsGeometry nearestPoint( const QgsGeometry &other ) const;
925
935 QgsGeometry shortestLine( const QgsGeometry &other ) const;
936
943 double closestVertexWithContext( const QgsPointXY &point, int &atVertex SIP_OUT ) const;
944
956 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;
957
963 Qgis::GeometryOperationResult addRing( const QVector<QgsPointXY> &ring );
964
971
979 Q_DECL_DEPRECATED Qgis::GeometryOperationResult addPart( const QVector<QgsPointXY> &points, Qgis::GeometryType geomType = Qgis::GeometryType::Unknown ) SIP_PYNAME( addPointsXY ) SIP_DEPRECATED;
980
988 Qgis::GeometryOperationResult addPartV2( const QVector<QgsPointXY> &points, Qgis::WkbType wkbType = Qgis::WkbType::Unknown ) SIP_PYNAME( addPointsXYV2 );
989
998
1007
1016
1025
1031 Qgis::GeometryOperationResult addPart( const QgsGeometry &newPart ) SIP_PYNAME( addPartGeometry );
1032
1038 QgsGeometry removeInteriorRings( double minimumAllowedArea = -1 ) const;
1039
1044 Qgis::GeometryOperationResult translate( double dx, double dy, double dz = 0.0, double dm = 0.0 );
1045
1061
1070 Qgis::GeometryOperationResult transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 );
1071
1078 Qgis::GeometryOperationResult rotate( double rotation, const QgsPointXY &center );
1079
1090 Q_DECL_DEPRECATED Qgis::GeometryOperationResult splitGeometry( const QVector<QgsPointXY> &splitLine, QVector<QgsGeometry> &newGeometries, bool topological, QVector<QgsPointXY> &topologyTestPoints, bool splitFeature = true ) SIP_SKIP;
1091
1113 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;
1114
1115
1116 /*
1117 This SIP code is to support overloaded methods of splitGeometry.
1118 When the deprecated method is removed in QGIS 5.0 this code can be dropped
1119 TODO QGIS 5 remove MethodCode
1120 */
1121#ifdef SIP_RUN
1122// clang-format off
1123
1142 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]]] );
1143 % MethodCode
1144 {
1145 int sipIsErr = 0;
1146 int state;
1147
1148 if ( PyList_Check( a0 ) && PyList_GET_SIZE( a0 ) )
1149 {
1150 PyObject *p0 = PyList_GetItem( a0, 0 );
1151 if ( sipCanConvertToType( p0, sipType_QgsPointXY, SIP_NOT_NONE ) && sipCanConvertToType( a0, sipType_QVector_0100QgsPointXY, SIP_NOT_NONE ) )
1152 {
1153 QVector<QgsGeometry> newGeometries;
1154 QVector<QgsPointXY> topologyTestPoints;
1155
1156 QVector<QgsPointXY> *splitLine = reinterpret_cast<QVector<QgsPointXY> *>( sipConvertToType( a0, sipType_QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
1157 if ( !sipIsErr )
1158 {
1159 Qgis::GeometryOperationResult result = sipCpp->splitGeometry( *splitLine, newGeometries, a1, topologyTestPoints, a2 );
1160
1161 PyObject *o0 = sipConvertFromEnum( static_cast<int>( result ), sipType_Qgis_GeometryOperationResult );
1162 PyObject *o1 = sipConvertFromType( &newGeometries, sipType_QVector_0100QgsGeometry, Py_None );
1163 PyObject *o2 = sipConvertFromType( &topologyTestPoints, sipType_QVector_0100QgsPointXY, Py_None );
1164
1165 sipRes = PyTuple_New( 3 );
1166 PyTuple_SET_ITEM( sipRes, 0, o0 );
1167 PyTuple_SET_ITEM( sipRes, 1, o1 );
1168 PyTuple_SET_ITEM( sipRes, 2, o2 );
1169 }
1170 sipReleaseType( splitLine, sipType_QVector_0100QgsPointXY, state );
1171 }
1172
1173 else if ( sipCanConvertToType( p0, sipType_QgsPoint, SIP_NOT_NONE ) && sipCanConvertToType( a0, sipType_QVector_0100QgsPoint, SIP_NOT_NONE ) )
1174 {
1175 QVector<QgsGeometry> newGeometries;
1176 QVector<QgsPoint> topologyTestPoints;
1177
1178 QVector<QgsPoint> *splitLine = reinterpret_cast<QVector<QgsPoint> *>( sipConvertToType( a0, sipType_QVector_0100QgsPoint, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
1179 if ( !sipIsErr )
1180 {
1181 Qgis::GeometryOperationResult result = sipCpp->splitGeometry( *splitLine, newGeometries, a1, topologyTestPoints, a2 );
1182
1183 PyObject *o0 = sipConvertFromEnum( static_cast<int>( result ), sipType_Qgis_GeometryOperationResult );
1184 PyObject *o1 = sipConvertFromType( &newGeometries, sipType_QVector_0100QgsGeometry, Py_None );
1185 PyObject *o2 = sipConvertFromType( &topologyTestPoints, sipType_QVector_0100QgsPoint, Py_None );
1186
1187 sipRes = PyTuple_New( 3 );
1188 PyTuple_SET_ITEM( sipRes, 0, o0 );
1189 PyTuple_SET_ITEM( sipRes, 1, o1 );
1190 PyTuple_SET_ITEM( sipRes, 2, o2 );
1191 }
1192 sipReleaseType( splitLine, sipType_QVector_0100QgsPoint, state );
1193 }
1194 else
1195 {
1196 sipIsErr = 1;
1197 PyErr_SetString( PyExc_TypeError, u"Could not convert first argument to a list of QgsPoint or QgsPointXY."_s.toUtf8().constData() );
1198 }
1199 }
1200 else
1201 {
1202 sipIsErr = 1;
1203 PyErr_SetString( PyExc_TypeError, u"First argument is not a list of points or is empty."_s.toUtf8().constData() );
1204 }
1205 }
1206 % End
1207// clang-format on
1208#endif
1209
1221 Qgis::GeometryOperationResult splitGeometry( const QgsCurve *curve, QVector<QgsGeometry> &newGeometries SIP_OUT, bool preserveCircular, bool topological, QgsPointSequence &topologyTestPoints SIP_OUT, bool splitFeature = true );
1222
1227 Qgis::GeometryOperationResult reshapeGeometry( const QgsLineString &reshapeLineString );
1228
1234 int makeDifferenceInPlace( const QgsGeometry &other ) SIP_SKIP;
1235
1242 QgsGeometry makeDifference( const QgsGeometry &other ) const;
1243
1248 QgsRectangle boundingBox() const;
1249
1255 QgsBox3D boundingBox3D() const;
1256
1269 QgsGeometry orientedMinimumBoundingBox( double &area SIP_OUT, double &angle SIP_OUT, double &width SIP_OUT, double &height SIP_OUT ) const;
1270
1280 QgsGeometry orientedMinimumBoundingBox() const SIP_SKIP;
1281
1289 QgsGeometry minimalEnclosingCircle( QgsPointXY &center SIP_OUT, double &radius SIP_OUT, unsigned int segments = 36 ) const;
1290
1295 QgsGeometry minimalEnclosingCircle( unsigned int segments = 36 ) const SIP_SKIP;
1296
1304 QgsGeometry orthogonalize( double tolerance = 1.0E-8, int maxIterations = 1000, double angleThreshold = 15.0 ) const;
1305
1318 QgsGeometry triangularWaves( double wavelength, double amplitude, bool strictWavelength = false ) const;
1319
1338 QgsGeometry triangularWavesRandomized( double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed = 0 ) const;
1339
1352 QgsGeometry squareWaves( double wavelength, double amplitude, bool strictWavelength = false ) const;
1353
1372 QgsGeometry squareWavesRandomized( double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed = 0 ) const;
1373
1386 QgsGeometry roundWaves( double wavelength, double amplitude, bool strictWavelength = false ) const;
1387
1406 QgsGeometry roundWavesRandomized( double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed = 0 ) const;
1407
1421 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;
1422
1434 QgsGeometry snappedToGrid( double hSpacing, double vSpacing, double dSpacing = 0, double mSpacing = 0 ) const;
1435
1455 bool removeDuplicateNodes( double epsilon = 4 * std::numeric_limits<double>::epsilon(), bool useZValues = false );
1456
1466 bool intersects( const QgsRectangle &rectangle ) const;
1467
1482 bool intersects( const QgsGeometry &geometry ) const;
1483
1492 bool boundingBoxIntersects( const QgsRectangle &rectangle ) const;
1493
1502 bool boundingBoxIntersects( const QgsGeometry &geometry ) const;
1503
1507 bool contains( const QgsPointXY *p ) const;
1508
1514 bool contains( double x, double y ) const;
1515
1525 bool contains( const QgsGeometry &geometry ) const;
1526
1536 bool disjoint( const QgsGeometry &geometry ) const;
1537
1547 bool touches( const QgsGeometry &geometry ) const;
1548
1558 bool overlaps( const QgsGeometry &geometry ) const;
1559
1569 bool within( const QgsGeometry &geometry ) const;
1570
1580 bool crosses( const QgsGeometry &geometry ) const;
1581
1589 QgsGeometry buffer( double distance, int segments ) const;
1590
1602 QgsGeometry buffer( double distance, int segments, Qgis::EndCapStyle endCapStyle, Qgis::JoinStyle joinStyle, double miterLimit ) const;
1603
1611 QgsGeometry offsetCurve( double distance, int segments, Qgis::JoinStyle joinStyle, double miterLimit ) const;
1612
1627 QgsGeometry singleSidedBuffer( double distance, int segments, Qgis::BufferSide side, Qgis::JoinStyle joinStyle = Qgis::JoinStyle::Round, double miterLimit = 2.0 ) const;
1628
1646 QgsGeometry taperedBuffer( double startWidth, double endWidth, int segments ) const;
1647
1662 QgsGeometry variableWidthBufferByM( int segments ) const;
1663
1669 QgsGeometry extendLine( double startDistance, double endDistance ) const;
1670
1672 QgsGeometry simplify( double tolerance ) const;
1673
1682 QgsGeometry densifyByCount( int extraNodesPerSegment ) const;
1683
1697 QgsGeometry densifyByDistance( double distance ) const;
1698
1714 QgsGeometry convertToCurves( double distanceTolerance = 1e-8, double angleTolerance = 1e-8 ) const;
1715
1729 QgsGeometry centroid() const;
1730
1744 QgsGeometry pointOnSurface() const;
1745
1757 QgsGeometry poleOfInaccessibility( double precision, double *distanceToBoundary SIP_OUT = nullptr ) const;
1758
1782 QgsGeometry largestEmptyCircle( double tolerance, const QgsGeometry &boundary = QgsGeometry() ) const SIP_THROW( QgsNotSupportedException );
1783
1798 QgsGeometry minimumWidth() const SIP_THROW( QgsNotSupportedException );
1799
1821 double minimumClearance() const SIP_THROW( QgsNotSupportedException );
1822
1834 QgsGeometry minimumClearanceLine() const SIP_THROW( QgsNotSupportedException );
1835
1844 QgsGeometry convexHull() const;
1845
1859 QgsGeometry concaveHull( double targetPercent, bool allowHoles = false ) const SIP_THROW( QgsNotSupportedException );
1860
1875 QgsGeometry voronoiDiagram( const QgsGeometry &extent = QgsGeometry(), double tolerance = 0.0, bool edgesOnly = false ) const;
1876
1887 QgsGeometry delaunayTriangulation( double tolerance = 0.0, bool edgesOnly = false ) const;
1888
1901 QgsGeometry constrainedDelaunayTriangulation() const SIP_THROW( QgsNotSupportedException );
1902
1920 Qgis::CoverageValidityResult validateCoverage( double gapWidth, QgsGeometry *invalidEdges SIP_OUT = nullptr ) const SIP_THROW( QgsNotSupportedException );
1921
1942 QgsGeometry simplifyCoverageVW( double tolerance, bool preserveBoundary ) const SIP_THROW( QgsNotSupportedException );
1943
1955 QgsGeometry unionCoverage() const;
1956
1967 QgsGeometry node() const;
1968
1983 QgsGeometry sharedPaths( const QgsGeometry &other ) const;
1984
2006 QgsGeometry subdivide( int maxNodes = 256, const QgsGeometryParameters &parameters = QgsGeometryParameters() ) const;
2007
2022 QgsGeometry interpolate( double distance ) const;
2023
2034 double lineLocatePoint( const QgsGeometry &point ) const;
2035
2044 double interpolateAngle( double distance ) const;
2045
2057 QgsGeometry intersection( const QgsGeometry &geometry, const QgsGeometryParameters &parameters = QgsGeometryParameters() ) const;
2058
2065 QgsGeometry clipped( const QgsRectangle &rectangle );
2066
2081 QgsGeometry combine( const QgsGeometry &geometry, const QgsGeometryParameters &parameters = QgsGeometryParameters() ) const;
2082
2093 QgsGeometry mergeLines( const QgsGeometryParameters &parameters = QgsGeometryParameters() ) const;
2094
2106 QgsGeometry difference( const QgsGeometry &geometry, const QgsGeometryParameters &parameters = QgsGeometryParameters() ) const;
2107
2119 QgsGeometry symDifference( const QgsGeometry &geometry, const QgsGeometryParameters &parameters = QgsGeometryParameters() ) const;
2120
2122 QgsGeometry extrude( double x, double y );
2123
2124#ifndef SIP_RUN
2125
2147 QVector< QgsPointXY > randomPointsInPolygon( int count, const std::function< bool( const QgsPointXY & ) > &acceptPoint, unsigned long seed = 0, QgsFeedback *feedback = nullptr, int maxTriesPerPoint = 0 ) const;
2148
2162 QVector< QgsPointXY > randomPointsInPolygon( int count, unsigned long seed = 0, QgsFeedback *feedback = nullptr ) const;
2164#else
2165// clang-format off
2166
2180 SIP_PYOBJECT randomPointsInPolygon( int count, unsigned long seed = 0 ) const SIP_TYPEHINT( QgsPolylineXY );
2181 % MethodCode
2182 const Qgis::GeometryType type = sipCpp->type();
2183 if ( sipCpp->isNull() )
2184 {
2185 PyErr_SetString( PyExc_ValueError, u"Cannot generate points inside a null geometry."_s.toUtf8().constData() );
2186 sipIsErr = 1;
2187 }
2188 else if ( type != Qgis::GeometryType::Polygon )
2189 {
2190 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() );
2191 sipIsErr = 1;
2192 }
2193 else
2194 {
2195 const sipTypeDef *qvector_type = sipFindType( "QVector<QgsPointXY>" );
2196 sipRes = sipConvertFromNewType( new QVector< QgsPointXY >( sipCpp->randomPointsInPolygon( a0, a1 ) ), qvector_type, Py_None );
2197 }
2198 % End
2199
2200
2201// clang-format on
2202#endif
2204
2212 int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;
2213
2220 QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;
2221
2227 Q_INVOKABLE QString asWkt( int precision = 17 ) const;
2228
2229#ifdef SIP_RUN
2230// clang-format off
2231 SIP_PYOBJECT __repr__();
2232 % MethodCode
2233 QString str;
2234 if ( sipCpp->isNull() )
2235 str = u"<QgsGeometry: null>"_s;
2236 else
2237 {
2238 QString wkt = sipCpp->asWkt();
2239 if ( wkt.length() > 1000 )
2240 wkt = wkt.left( 1000 ) + u"..."_s;
2241 str = u"<QgsGeometry: %1>"_s.arg( wkt );
2242 }
2243 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
2244 % End
2245// clang-format on
2246#endif
2247
2251 QString asJson( int precision = 17 ) const;
2252
2258 virtual json asJsonObject( int precision = 17 ) const SIP_SKIP;
2259
2296 QVector< QgsGeometry > coerceToType( Qgis::WkbType type, double defaultZ = 0, double defaultM = 0, bool avoidDuplicates = true ) const;
2297
2309 QgsGeometry convertToType( Qgis::GeometryType destType, bool destMultipart = false ) const;
2310
2311 /* Accessor functions for getting geometry data */
2312
2313#ifndef SIP_RUN
2314
2323 QgsPointXY asPoint() const;
2324#else
2325// clang-format off
2326
2337 SIP_PYOBJECT asPoint() const SIP_TYPEHINT( QgsPointXY );
2338 % MethodCode
2339 if ( sipCpp->isNull() )
2340 {
2341 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a point."_s.toUtf8().constData() );
2342 sipIsErr = 1;
2343 }
2344 else
2345 {
2346 const QgsAbstractGeometry *geom = sipCpp->constGet();
2348 {
2349 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() );
2350 sipIsErr = 1;
2351 }
2352 else
2353 {
2354 sipRes = sipConvertFromNewType( new QgsPointXY( sipCpp->asPoint() ), sipType_QgsPointXY, Py_None );
2355 }
2356 }
2357 % End
2358// clang-format on
2359#endif
2360
2361#ifndef SIP_RUN
2362
2371 QgsPolylineXY asPolyline() const;
2372#else
2373// clang-format off
2374
2386 SIP_PYOBJECT asPolyline() const SIP_TYPEHINT( QgsPolylineXY );
2387 % MethodCode
2388 const Qgis::WkbType type = sipCpp->wkbType();
2389 if ( sipCpp->isNull() )
2390 {
2391 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a polyline."_s.toUtf8().constData() );
2392 sipIsErr = 1;
2393 }
2395 {
2396 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() );
2397 sipIsErr = 1;
2398 }
2399 else
2400 {
2401 const sipTypeDef *qvector_type = sipFindType( "QVector< QgsPointXY >" );
2402 sipRes = sipConvertFromNewType( new QgsPolylineXY( sipCpp->asPolyline() ), qvector_type, Py_None );
2403 }
2404 % End
2405// clang-format on
2406#endif
2407
2408#ifndef SIP_RUN
2409
2418 QgsPolygonXY asPolygon() const;
2419#else
2420// clang-format off
2421
2433 SIP_PYOBJECT asPolygon() const SIP_TYPEHINT( QgsPolygonXY );
2434 % MethodCode
2435 const Qgis::WkbType type = sipCpp->wkbType();
2436 if ( sipCpp->isNull() )
2437 {
2438 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a polygon."_s.toUtf8().constData() );
2439 sipIsErr = 1;
2440 }
2442 {
2443 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() );
2444 sipIsErr = 1;
2445 }
2446 else
2447 {
2448 const sipTypeDef *qvector_type = sipFindType( "QVector<QVector<QgsPointXY>>" );
2449 sipRes = sipConvertFromNewType( new QgsPolygonXY( sipCpp->asPolygon() ), qvector_type, Py_None );
2450 }
2451 % End
2452// clang-format on
2453#endif
2454
2455#ifndef SIP_RUN
2456
2464 QgsMultiPointXY asMultiPoint() const;
2465#else
2466// clang-format off
2467
2478 SIP_PYOBJECT asMultiPoint() const SIP_TYPEHINT( QgsMultiPointXY );
2479 % MethodCode
2480 const Qgis::WkbType type = sipCpp->wkbType();
2481 if ( sipCpp->isNull() )
2482 {
2483 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a multipoint."_s.toUtf8().constData() );
2484 sipIsErr = 1;
2485 }
2487 {
2488 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() );
2489 sipIsErr = 1;
2490 }
2491 else
2492 {
2493 const sipTypeDef *qvector_type = sipFindType( "QVector< QgsPointXY >" );
2494 sipRes = sipConvertFromNewType( new QgsPolylineXY( sipCpp->asMultiPoint() ), qvector_type, Py_None );
2495 }
2496 % End
2497// clang-format on
2498#endif
2499
2500#ifndef SIP_RUN
2501
2510 QgsMultiPolylineXY asMultiPolyline() const;
2511#else
2512// clang-format off
2513
2525 SIP_PYOBJECT asMultiPolyline() const SIP_TYPEHINT( QgsMultiPolylineXY );
2526 % MethodCode
2527 const Qgis::WkbType type = sipCpp->wkbType();
2528 if ( sipCpp->isNull() )
2529 {
2530 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a multilinestring."_s.toUtf8().constData() );
2531 sipIsErr = 1;
2532 }
2534 {
2535 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() );
2536 sipIsErr = 1;
2537 }
2538 else
2539 {
2540 const sipTypeDef *qvector_type = sipFindType( "QVector<QVector<QgsPointXY>>" );
2541 sipRes = sipConvertFromNewType( new QgsMultiPolylineXY( sipCpp->asMultiPolyline() ), qvector_type, Py_None );
2542 }
2543 % End
2544// clang-format on
2545#endif
2546
2547#ifndef SIP_RUN
2548
2557 QgsMultiPolygonXY asMultiPolygon() const;
2558#else
2559// clang-format off
2560
2572 SIP_PYOBJECT asMultiPolygon() const SIP_TYPEHINT( QgsMultiPolygonXY );
2573 % MethodCode
2574 const Qgis::WkbType type = sipCpp->wkbType();
2575 if ( sipCpp->isNull() )
2576 {
2577 PyErr_SetString( PyExc_ValueError, u"Null geometry cannot be converted to a multipolygon."_s.toUtf8().constData() );
2578 sipIsErr = 1;
2579 }
2581 {
2582 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() );
2583 sipIsErr = 1;
2584 }
2585 else
2586 {
2587 const sipTypeDef *qvector_type = sipFindType( "QVector<QVector<QVector<QgsPointXY>>>" );
2588 sipRes = sipConvertFromNewType( new QgsMultiPolygonXY( sipCpp->asMultiPolygon() ), qvector_type, Py_None );
2589 }
2590 % End
2591// clang-format on
2592#endif
2593
2597 QVector<QgsGeometry> asGeometryCollection() const;
2598
2603 QPointF asQPointF() const SIP_HOLDGIL;
2604
2616 QPolygonF asQPolygonF() const SIP_HOLDGIL;
2617
2623 bool deleteRing( int ringNum, int partNum = 0 );
2624
2629 bool deletePart( int partNum );
2630
2639 bool convertToMultiType();
2640
2656 bool convertToCurvedMultiType();
2657
2667 bool convertToSingleType();
2668
2678 bool convertGeometryCollectionToSubclass( Qgis::GeometryType geomType );
2679
2691 Q_DECL_DEPRECATED int avoidIntersections( const QList<QgsVectorLayer *> &avoidIntersectionsLayers, const QHash<QgsVectorLayer *, QSet<QgsFeatureId> > &ignoreFeatures SIP_PYARGREMOVE = ( QHash<QgsVectorLayer *, QSet<QgsFeatureId> >() ) ) SIP_DEPRECATED;
2692
2704 Qgis::GeometryOperationResult avoidIntersectionsV2( const QList<QgsVectorLayer *> &avoidIntersectionsLayers, const QHash<QgsVectorLayer *, QSet<QgsFeatureId> > &ignoreFeatures SIP_PYARGREMOVE = ( QHash<QgsVectorLayer *, QSet<QgsFeatureId> >() ) );
2705
2726 QgsGeometry makeValid( Qgis::MakeValidMethod method = Qgis::MakeValidMethod::Linework, bool keepCollapsed = false ) const SIP_THROW( QgsNotSupportedException );
2727
2737 Qgis::AngularDirection polygonOrientation() const;
2738
2753
2768
2769
2784 QgsGeometry forceRHR() const;
2785
2796 QgsGeometry forcePolygonClockwise() const;
2797
2808 QgsGeometry forcePolygonCounterClockwise() const;
2809
2814 class CORE_EXPORT Error
2815 {
2816 public:
2818 : mMessage( u"none"_s )
2819 {}
2820
2821 explicit Error( const QString &m )
2822 : mMessage( m )
2823 {}
2824
2825 Error( const QString &m, const QgsPointXY &p )
2826 : mMessage( m )
2827 , mLocation( p )
2828 , mHasLocation( true ) {}
2829
2833 QString what() const;
2834
2838 QgsPointXY where() const;
2839
2843 bool hasWhere() const;
2844
2845#ifdef SIP_RUN
2846// clang-format off
2847 SIP_PYOBJECT __repr__();
2848 % MethodCode
2849 QString str = u"<QgsGeometry.Error: %1>"_s.arg( sipCpp->what() );
2850 sipRes = PyUnicode_FromString( str.toUtf8().data() );
2851 % End
2852// clang-format on
2853#endif
2854
2855 // TODO c++20 - replace with = default
2856 bool operator==( const QgsGeometry::Error &other ) const
2857 {
2858 return other.mMessage == mMessage && other.mHasLocation == mHasLocation && other.mLocation == mLocation;
2859 }
2860
2861 private:
2862 QString mMessage;
2863 QgsPointXY mLocation;
2864 bool mHasLocation = false;
2865 };
2866
2874 void validateGeometry( QVector<QgsGeometry::Error> &errors SIP_OUT, Qgis::GeometryValidationEngine method = Qgis::GeometryValidationEngine::QgisInternal, Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const;
2875
2885 void normalize();
2886
2895 static QgsGeometry unaryUnion( const QVector<QgsGeometry> &geometries, const QgsGeometryParameters &parameters = QgsGeometryParameters() );
2896
2904 static QgsGeometry polygonize( const QVector<QgsGeometry> &geometries );
2905
2912 void convertToStraightSegment( double tolerance = M_PI / 180., QgsAbstractGeometry::SegmentationToleranceType toleranceType = QgsAbstractGeometry::MaximumAngle );
2913
2919 bool requiresConversionToStraightSegments() const;
2920
2925 void mapToPixel( const QgsMapToPixel &mtp );
2926
2931 void draw( QPainter &p ) const;
2932
2942 bool vertexIdFromVertexNr( int number, QgsVertexId &id SIP_OUT ) const;
2943
2954 int vertexNrFromVertexId( QgsVertexId id ) const;
2955
2962 QString lastError() const SIP_HOLDGIL;
2963
2973 void filterVertices( const std::function< bool( const QgsPoint & ) > &filter ) SIP_SKIP;
2974
2989 void transformVertices( const std::function< QgsPoint( const QgsPoint & ) > &transform ) SIP_SKIP;
2990
2995 static QgsGeometry fromQPointF( QPointF point ) SIP_HOLDGIL;
2996
3003 static QgsGeometry fromQPolygonF( const QPolygonF &polygon );
3004
3012 Q_DECL_DEPRECATED static QgsPolylineXY createPolylineFromQPolygonF( const QPolygonF &polygon ) SIP_DEPRECATED;
3013
3021 Q_DECL_DEPRECATED static QgsPolygonXY createPolygonFromQPolygonF( const QPolygonF &polygon ) SIP_DEPRECATED;
3022
3023#ifndef SIP_RUN
3024
3033 static bool compare( const QgsPolylineXY &p1, const QgsPolylineXY &p2, double epsilon = 4 * std::numeric_limits<double>::epsilon() );
3034
3043 static bool compare( const QgsPolygonXY &p1, const QgsPolygonXY &p2, double epsilon = 4 * std::numeric_limits<double>::epsilon() );
3044
3054 static bool compare( const QgsMultiPolygonXY &p1, const QgsMultiPolygonXY &p2, double epsilon = 4 * std::numeric_limits<double>::epsilon() );
3055#else
3056// clang-format off
3057
3076 static bool compare( PyObject *obj1, PyObject *obj2, double epsilon = 4 * std::numeric_limits<double>::epsilon() );
3077 % MethodCode
3078 {
3079 sipRes = false;
3080 int state0;
3081 int state1;
3082 int sipIsErr = 0;
3083
3084 if ( PyList_Check( a0 ) && PyList_Check( a1 ) && PyList_GET_SIZE( a0 ) && PyList_GET_SIZE( a1 ) )
3085 {
3086 PyObject *o0 = PyList_GetItem( a0, 0 );
3087 PyObject *o1 = PyList_GetItem( a1, 0 );
3088 if ( o0 && o1 )
3089 {
3090 // compare polyline - polyline
3091 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 ) )
3092 {
3093 QgsPolylineXY *p0;
3094 QgsPolylineXY *p1;
3095 p0 = reinterpret_cast<QgsPolylineXY *>( sipConvertToType( a0, sipType_QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
3096 p1 = reinterpret_cast<QgsPolylineXY *>( sipConvertToType( a1, sipType_QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
3097 if ( !sipIsErr )
3098 {
3099 sipRes = QgsGeometry::compare( *p0, *p1, a2 );
3100 }
3101 sipReleaseType( p0, sipType_QVector_0100QgsPointXY, state0 );
3102 sipReleaseType( p1, sipType_QVector_0100QgsPointXY, state1 );
3103 }
3104 else if ( PyList_Check( o0 ) && PyList_Check( o1 ) && PyList_GET_SIZE( o0 ) && PyList_GET_SIZE( o1 ) )
3105 {
3106 PyObject *oo0 = PyList_GetItem( o0, 0 );
3107 PyObject *oo1 = PyList_GetItem( o1, 0 );
3108 if ( oo0 && oo1 )
3109 {
3110 // compare polygon - polygon
3111 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 ) )
3112 {
3113 QgsPolygonXY *p0;
3114 QgsPolygonXY *p1;
3115 p0 = reinterpret_cast<QgsPolygonXY *>( sipConvertToType( a0, sipType_QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
3116 p1 = reinterpret_cast<QgsPolygonXY *>( sipConvertToType( a1, sipType_QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
3117 if ( !sipIsErr )
3118 {
3119 sipRes = QgsGeometry::compare( *p0, *p1, a2 );
3120 }
3121 sipReleaseType( p0, sipType_QVector_0600QVector_0100QgsPointXY, state0 );
3122 sipReleaseType( p1, sipType_QVector_0600QVector_0100QgsPointXY, state1 );
3123 }
3124 else if ( PyList_Check( oo0 ) && PyList_Check( oo1 ) && PyList_GET_SIZE( oo0 ) && PyList_GET_SIZE( oo1 ) )
3125 {
3126 PyObject *ooo0 = PyList_GetItem( oo0, 0 );
3127 PyObject *ooo1 = PyList_GetItem( oo1, 0 );
3128 if ( ooo0 && ooo1 )
3129 {
3130 // compare multipolygon - multipolygon
3131 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 ) )
3132 {
3135 p0 = reinterpret_cast<QgsMultiPolygonXY *>( sipConvertToType( a0, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
3136 p1 = reinterpret_cast<QgsMultiPolygonXY *>( sipConvertToType( a1, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
3137 if ( !sipIsErr )
3138 {
3139 sipRes = QgsGeometry::compare( *p0, *p1, a2 );
3140 }
3141 sipReleaseType( p0, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, state0 );
3142 sipReleaseType( p1, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, state1 );
3143 }
3144 }
3145 }
3146 }
3147 }
3148 }
3149 }
3150 }
3151 % End
3152// clang-format on
3153#endif
3154
3170 QgsGeometry smooth( unsigned int iterations = 1, double offset = 0.25, double minimumDistance = -1.0, double maxAngle = 180.0 ) const;
3171
3211 static QgsGeometryEngine *createGeometryEngine( const QgsAbstractGeometry *geometry, double precision = 0.0, Qgis::GeosCreationFlags flags = Qgis::GeosCreationFlag::SkipEmptyInteriorRings ) SIP_FACTORY;
3212
3218 static void convertPointList( const QVector<QgsPointXY> &input, QgsPointSequence &output );
3219
3225 static void convertPointList( const QgsPointSequence &input, QVector<QgsPointXY> &output );
3226
3228 operator QVariant() const
3229 {
3230 return QVariant::fromValue( *this );
3231 }
3232
3238 {
3239 Chamfer = 1,
3240 Fillet,
3241 };
3242#ifndef SIP_RUN
3243 Q_ENUM( ChamferFilletOperationType )
3244#endif
3245
3262 QgsGeometry fillet( int vertexIndex, double radius, int segments = 8 ) const;
3263
3282 static QgsGeometry fillet( const QgsPoint &segment1Start, const QgsPoint &segment1End, const QgsPoint &segment2Start, const QgsPoint &segment2End, double radius, int segments = 8 ) SIP_THROW( QgsInvalidArgumentException );
3283
3297 QgsGeometry chamfer( int vertexIndex, double distance1, double distance2 = -1.0 ) const;
3298
3317 static QgsGeometry chamfer( const QgsPoint &segment1Start, const QgsPoint &segment1End, const QgsPoint &segment2Start, const QgsPoint &segment2End, double distance1, double distance2 = -1.0 ) SIP_THROW( QgsInvalidArgumentException );
3318
3319
3320 private:
3321 QgsGeometryPrivate *d; //implicitly shared data pointer
3322
3324 mutable QString mLastError;
3325
3330 void detach();
3331
3336 void reset( std::unique_ptr< QgsAbstractGeometry > newGeometry );
3337
3338 static void convertPolygon( const QgsPolygon &input, QgsPolygonXY &output );
3339
3341 QgsGeometry convertToPoint( bool destMultipart ) const;
3343 QgsGeometry convertToLine( bool destMultipart ) const;
3345 QgsGeometry convertToPolygon( bool destMultipart ) const;
3346
3358 std::unique_ptr< QgsLineString > smoothLine( const QgsLineString &line, unsigned int iterations = 1, double offset = 0.25, double minimumDistance = -1, double maxAngle = 180.0 ) const;
3359
3371 std::unique_ptr< QgsPolygon > smoothPolygon( const QgsPolygon &polygon, unsigned int iterations = 1, double offset = 0.25, double minimumDistance = -1, double maxAngle = 180.0 ) const;
3372
3373 QgsGeometry doChamferFillet( ChamferFilletOperationType op, int vertexIndex, double distance1, double distance2, int segments ) const;
3374
3376
3377}; // class QgsGeometry
3378
3380
3382CORE_EXPORT QDataStream &operator<<( QDataStream &out, const QgsGeometry &geometry );
3384CORE_EXPORT QDataStream &operator>>( QDataStream &in, QgsGeometry &geometry );
3385
3386#endif
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:62
@ CounterClockwise
Counter-clockwise direction.
Definition qgis.h:3548
@ Clockwise
Clockwise direction.
Definition qgis.h:3547
GeometryOperationResult
Success or failure of a geometry operation.
Definition qgis.h:2121
QFlags< GeometryValidityFlag > GeometryValidityFlags
Geometry validity flags.
Definition qgis.h:2155
GeometryValidationEngine
Available engines for validating geometries.
Definition qgis.h:2164
@ QgisInternal
Use internal QgsGeometryValidator method.
Definition qgis.h:2165
@ SkipEmptyInteriorRings
Skip any empty polygon interior ring.
Definition qgis.h:2229
QFlags< GeosCreationFlag > GeosCreationFlags
Geos geometry creation behavior flags.
Definition qgis.h:2238
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:6615
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:2764
@ Forward
Forward transform (from source to destination).
Definition qgis.h:2765
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.
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.
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...
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...
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.
#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