21 #include <QDomDocument>
22 #include <QJsonObject>
31 #include "qgis_core.h"
41 #include "json_fwd.hpp"
42 using namespace nlohmann;
138 double mGridSize = -1;
164 Q_PROPERTY(
bool isNull READ isNull )
329 static QgsGeometry collectGeometry(
const QVector<QgsGeometry> &geometries );
346 static QgsGeometry createWedgeBuffer(
const QgsPoint ¢er,
double azimuth,
double angularWidth,
347 double outerRadius,
double innerRadius = 0 );
354 void fromWkb(
unsigned char *wkb,
int length )
SIP_SKIP;
359 void fromWkb(
const QByteArray &wkb );
379 bool isEmpty() const;
422 bool isGeosValid(
Qgis::GeometryValidityFlags flags =
Qgis::GeometryValidityFlags() ) const;
431 bool isSimple() const;
446 bool isAxisParallelRectangle(
double maximumDeviation,
bool simpleRectanglesOnly = false ) const;
474 double length() const;
657 double hausdorffDistance(
const QgsGeometry &geom )
const;
676 double hausdorffDistanceDensify(
const QgsGeometry &geom,
double densifyFraction )
const;
739 double distanceToVertex(
int vertex )
const;
747 double angleAtVertex(
int vertex )
const;
761 void adjacentVertices(
int atVertex,
int &beforeVertex
SIP_OUT,
int &afterVertex
SIP_OUT )
const;
775 bool insertVertex(
double x,
double y,
int beforeVertex );
789 bool insertVertex(
const QgsPoint &point,
int beforeVertex );
798 bool addTopologicalPoint(
const QgsPoint &point,
double snappingTolerance = 1e-8,
double segmentSearchEpsilon = 1e-12 );
807 bool moveVertex(
double x,
double y,
int atVertex );
816 bool moveVertex(
const QgsPoint &p,
int atVertex );
829 bool deleteVertex(
int atVertex );
838 bool toggleCircularAtVertex(
int atVertex );
845 QgsPoint vertexAt(
int atVertex )
const;
877 double closestVertexWithContext(
const QgsPointXY &point,
int &atVertex
SIP_OUT )
const;
942 QgsGeometry removeInteriorRings(
double minimumAllowedArea = -1 )
const;
974 Qgis::GeometryOperationResult transform( const QTransform &t,
double zTranslate = 0.0,
double zScale = 1.0,
double mTranslate = 0.0,
double mScale = 1.0 );
982 Qgis::GeometryOperationResult rotate(
double rotation, const
QgsPointXY ¢er );
994 Q_DECL_DEPRECATED
Qgis::GeometryOperationResult splitGeometry( const QVector<
QgsPointXY> &splitLine, QVector<
QgsGeometry> &newGeometries,
bool topological, QVector<
QgsPointXY> &topologyTestPoints,
bool splitFeature = true )
SIP_SKIP;
1051 if ( PyList_Check( a0 ) && PyList_GET_SIZE( a0 ) )
1053 PyObject *p0 = PyList_GetItem( a0, 0 );
1054 if ( sipCanConvertToType( p0, sipType_QgsPointXY, SIP_NOT_NONE ) &&
1055 sipCanConvertToType( a0, sipType_QVector_0100QgsPointXY, SIP_NOT_NONE ) )
1057 QVector<QgsGeometry> newGeometries;
1058 QVector<QgsPointXY> topologyTestPoints;
1060 QVector<QgsPointXY> *splitLine =
reinterpret_cast<QVector<QgsPointXY> *
>( sipConvertToType( a0, sipType_QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
1063 sipReleaseType( splitLine, sipType_QVector_0100QgsPointXY, state );
1069 PyObject *o0 = sipConvertFromEnum(
static_cast<int>( result ), sipType_Qgis_GeometryOperationResult );
1070 PyObject *o1 = sipConvertFromType( &newGeometries, sipType_QVector_0100QgsGeometry, Py_None );
1071 PyObject *o2 = sipConvertFromType( &topologyTestPoints, sipType_QVector_0100QgsPointXY, Py_None );
1073 sipRes = PyTuple_New( 3 );
1074 PyTuple_SET_ITEM( sipRes, 0, o0 );
1075 PyTuple_SET_ITEM( sipRes, 1, o1 );
1076 PyTuple_SET_ITEM( sipRes, 2, o2 );
1080 else if ( sipCanConvertToType( p0, sipType_QgsPoint, SIP_NOT_NONE ) &&
1081 sipCanConvertToType( a0, sipType_QVector_0100QgsPoint, SIP_NOT_NONE ) )
1083 QVector<QgsGeometry> newGeometries;
1084 QVector<QgsPoint> topologyTestPoints;
1086 QVector<QgsPoint> *splitLine =
reinterpret_cast<QVector<QgsPoint> *
>( sipConvertToType( a0, sipType_QVector_0100QgsPoint, 0, SIP_NOT_NONE, &state, &sipIsErr ) );
1089 sipReleaseType( splitLine, sipType_QVector_0100QgsPoint, state );
1095 PyObject *o0 = sipConvertFromEnum(
static_cast<int>( result ), sipType_Qgis_GeometryOperationResult );
1096 PyObject *o1 = sipConvertFromType( &newGeometries, sipType_QVector_0100QgsGeometry, Py_None );
1097 PyObject *o2 = sipConvertFromType( &topologyTestPoints, sipType_QVector_0100QgsPoint, Py_None );
1099 sipRes = PyTuple_New( 3 );
1100 PyTuple_SET_ITEM( sipRes, 0, o0 );
1101 PyTuple_SET_ITEM( sipRes, 1, o1 );
1102 PyTuple_SET_ITEM( sipRes, 2, o2 );
1108 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"Could not convert first argument to a list of QgsPoint or QgsPointXY." ).toUtf8().constData() );
1114 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"First argument is not a list of points or is empty." ).toUtf8().constData() );
1211 QgsGeometry orthogonalize(
double tolerance = 1.0E-8,
int maxIterations = 1000,
double angleThreshold = 15.0 ) const;
1225 QgsGeometry triangularWaves(
double wavelength,
double amplitude,
bool strictWavelength = false ) const;
1245 QgsGeometry triangularWavesRandomized(
double minimumWavelength,
double maximumWavelength,
double minimumAmplitude,
double maximumAmplitude,
unsigned long seed = 0 ) const;
1259 QgsGeometry squareWaves(
double wavelength,
double amplitude,
bool strictWavelength = false ) const;
1279 QgsGeometry squareWavesRandomized(
double minimumWavelength,
double maximumWavelength,
double minimumAmplitude,
double maximumAmplitude,
unsigned long seed = 0 ) const;
1293 QgsGeometry roundWaves(
double wavelength,
double amplitude,
bool strictWavelength = false ) const;
1313 QgsGeometry roundWavesRandomized(
double minimumWavelength,
double maximumWavelength,
double minimumAmplitude,
double maximumAmplitude,
unsigned long seed = 0 ) const;
1328 QgsGeometry applyDashPattern( const QVector<
double > &pattern,
1329 Qgis::DashPatternLineEndingRule startRule =
Qgis::DashPatternLineEndingRule::NoRule,
1330 Qgis::DashPatternLineEndingRule endRule =
Qgis::DashPatternLineEndingRule::NoRule,
1331 Qgis::DashPatternSizeAdjustment adjustment =
Qgis::DashPatternSizeAdjustment::ScaleBothDashAndGap,
1332 double patternOffset = 0 ) const;
1345 QgsGeometry snappedToGrid(
double hSpacing,
double vSpacing,
double dSpacing = 0,
double mSpacing = 0 ) const;
1366 bool removeDuplicateNodes(
double epsilon = 4 * std::numeric_limits<
double>::epsilon(),
bool useZValues = false );
1377 bool intersects( const
QgsRectangle &rectangle ) const;
1393 bool intersects( const
QgsGeometry &geometry ) const;
1403 bool boundingBoxIntersects( const
QgsRectangle &rectangle ) const;
1413 bool boundingBoxIntersects( const
QgsGeometry &geometry ) const;
1429 bool contains( const
QgsGeometry &geometry ) const;
1440 bool disjoint( const
QgsGeometry &geometry ) const;
1451 bool touches( const
QgsGeometry &geometry ) const;
1462 bool overlaps( const
QgsGeometry &geometry ) const;
1484 bool crosses( const
QgsGeometry &geometry ) const;
1493 QgsGeometry buffer(
double distance,
int segments ) const;
1506 QgsGeometry buffer(
double distance,
int segments,
Qgis::EndCapStyle endCapStyle,
Qgis::JoinStyle joinStyle,
double miterLimit ) const;
1515 QgsGeometry offsetCurve(
double distance,
int segments,
Qgis::JoinStyle joinStyle,
double miterLimit ) const;
1531 QgsGeometry singleSidedBuffer(
double distance,
int segments,
Qgis::BufferSide side,
1532 Qgis::JoinStyle joinStyle =
Qgis::JoinStyle::Round,
1533 double miterLimit = 2.0 ) const;
1552 QgsGeometry taperedBuffer(
double startWidth,
double endWidth,
int segments ) const;
1568 QgsGeometry variableWidthBufferByM(
int segments ) const;
1575 QgsGeometry extendLine(
double startDistance,
double endDistance ) const;
1588 QgsGeometry densifyByCount(
int extraNodesPerSegment ) const;
1603 QgsGeometry densifyByDistance(
double distance ) const;
1620 QgsGeometry convertToCurves(
double distanceTolerance = 1e-8,
double angleTolerance = 1e-8 ) const;
1793 QgsGeometry delaunayTriangulation(
double tolerance = 0.0,
bool edgesOnly = false ) const;
1940 double lineLocatePoint( const
QgsGeometry &point ) const;
1950 double interpolateAngle(
double distance ) const;
2084 const
Qgis::GeometryType type = sipCpp->type();
2085 if ( sipCpp->isNull() )
2087 PyErr_SetString( PyExc_ValueError, QStringLiteral(
"Cannot generate points inside a null geometry." ).toUtf8().constData() );
2092 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"Cannot generate points inside a %1 geometry. Only Polygon types are permitted." ).arg(
QgsWkbTypes::displayString( sipCpp->wkbType() ) ).toUtf8().constData() );
2097 const sipTypeDef *qvector_type = sipFindType(
"QVector<QgsPointXY>" );
2098 sipRes = sipConvertFromNewType(
new QVector< QgsPointXY >( sipCpp->randomPointsInPolygon( a0, a1 ) ), qvector_type, Py_None );
2128 QString asWkt(
int precision = 17 )
const;
2131 SIP_PYOBJECT __repr__();
2134 if ( sipCpp->isNull() )
2135 str = QStringLiteral(
"<QgsGeometry: null>" );
2138 QString wkt = sipCpp->asWkt();
2139 if ( wkt.length() > 1000 )
2140 wkt = wkt.left( 1000 ) + QStringLiteral(
"..." );
2141 str = QStringLiteral(
"<QgsGeometry: %1>" ).arg( wkt );
2143 sipRes = PyUnicode_FromString(
str.toUtf8().constData() );
2150 QString asJson(
int precision = 17 )
const;
2185 QVector<
QgsGeometry > coerceToType(
Qgis::WkbType type,
double defaultZ = 0,
double defaultM = 0 ) const;
2198 QgsGeometry convertToType(
Qgis::GeometryType destType,
bool destMultipart = false ) const;
2227 if ( sipCpp->isNull() )
2229 PyErr_SetString( PyExc_ValueError, QStringLiteral(
"Null geometry cannot be converted to a point." ).toUtf8().constData() );
2237 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"%1 geometry cannot be converted to a point. Only Point types are permitted." ).arg(
QgsWkbTypes::displayString( geom->
wkbType() ) ).toUtf8().constData() );
2242 sipRes = sipConvertFromNewType(
new QgsPointXY( sipCpp->asPoint() ), sipType_QgsPointXY, Py_None );
2274 const
Qgis::WkbType type = sipCpp->wkbType();
2275 if ( sipCpp->isNull() )
2277 PyErr_SetString( PyExc_ValueError, QStringLiteral(
"Null geometry cannot be converted to a polyline." ).toUtf8().constData() );
2282 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"%1 geometry cannot be converted to a polyline. Only single line or curve types are permitted." ).arg(
QgsWkbTypes::displayString( type ) ).toUtf8().constData() );
2287 const sipTypeDef *qvector_type = sipFindType(
"QVector< QgsPointXY >" );
2288 sipRes = sipConvertFromNewType(
new QgsPolylineXY( sipCpp->asPolyline() ), qvector_type, Py_None );
2319 const
Qgis::WkbType type = sipCpp->wkbType();
2320 if ( sipCpp->isNull() )
2322 PyErr_SetString( PyExc_ValueError, QStringLiteral(
"Null geometry cannot be converted to a polygon." ).toUtf8().constData() );
2327 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"%1 geometry cannot be converted to a polygon. Only single polygon or curve polygon types are permitted." ).arg(
QgsWkbTypes::displayString( type ) ).toUtf8().constData() );
2332 const sipTypeDef *qvector_type = sipFindType(
"QVector<QVector<QgsPointXY>>" );
2333 sipRes = sipConvertFromNewType(
new QgsPolygonXY( sipCpp->asPolygon() ), qvector_type, Py_None );
2362 const
Qgis::WkbType type = sipCpp->wkbType();
2363 if ( sipCpp->isNull() )
2365 PyErr_SetString( PyExc_ValueError, QStringLiteral(
"Null geometry cannot be converted to a multipoint." ).toUtf8().constData() );
2370 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"%1 geometry cannot be converted to a multipoint. Only multipoint types are permitted." ).arg(
QgsWkbTypes::displayString( type ) ).toUtf8().constData() );
2375 const sipTypeDef *qvector_type = sipFindType(
"QVector< QgsPointXY >" );
2376 sipRes = sipConvertFromNewType(
new QgsPolylineXY( sipCpp->asMultiPoint() ), qvector_type, Py_None );
2407 const
Qgis::WkbType type = sipCpp->wkbType();
2408 if ( sipCpp->isNull() )
2410 PyErr_SetString( PyExc_ValueError, QStringLiteral(
"Null geometry cannot be converted to a multilinestring." ).toUtf8().constData() );
2415 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"%1 geometry cannot be converted to a multilinestring. Only multi linestring or curves are permitted." ).arg(
QgsWkbTypes::displayString( type ) ).toUtf8().constData() );
2420 const sipTypeDef *qvector_type = sipFindType(
"QVector<QVector<QgsPointXY>>" );
2421 sipRes = sipConvertFromNewType(
new QgsMultiPolylineXY( sipCpp->asMultiPolyline() ), qvector_type, Py_None );
2452 const
Qgis::WkbType type = sipCpp->wkbType();
2453 if ( sipCpp->isNull() )
2455 PyErr_SetString( PyExc_ValueError, QStringLiteral(
"Null geometry cannot be converted to a multipolygon." ).toUtf8().constData() );
2460 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"%1 geometry cannot be converted to a multipolygon. Only multi polygon or curves are permitted." ).arg(
QgsWkbTypes::displayString( type ) ).toUtf8().constData() );
2465 const sipTypeDef *qvector_type = sipFindType(
"QVector<QVector<QVector<QgsPointXY>>>" );
2466 sipRes = sipConvertFromNewType(
new QgsMultiPolygonXY( sipCpp->asMultiPolygon() ), qvector_type, Py_None );
2474 QVector<QgsGeometry> asGeometryCollection()
const;
2500 bool deleteRing(
int ringNum,
int partNum = 0 );
2506 bool deletePart(
int partNum );
2516 bool convertToMultiType();
2533 bool convertToCurvedMultiType();
2544 bool convertToSingleType();
2555 bool convertGeometryCollectionToSubclass(
Qgis::GeometryType geomType );
2568 Q_DECL_DEPRECATED
int avoidIntersections( const QList<
QgsVectorLayer *> &avoidIntersectionsLayers,
2582 Qgis::GeometryOperationResult avoidIntersectionsV2( const QList<
QgsVectorLayer *> &avoidIntersectionsLayers,
2616 Qgis::AngularDirection polygonOrientation() const;
2697 : mMessage( QStringLiteral(
"none" ) )
2707 , mHasLocation( true ) {}
2712 QString what()
const;
2722 bool hasWhere()
const;
2725 SIP_PYOBJECT __repr__();
2727 QString
str = QStringLiteral(
"<QgsGeometry.Error: %1>" ).arg( sipCpp->what() );
2728 sipRes = PyUnicode_FromString(
str.toUtf8().data() );
2735 return other.mMessage == mMessage && other.mHasLocation == mHasLocation && other.mLocation == mLocation;
2741 bool mHasLocation =
false;
2781 static QgsGeometry polygonize(
const QVector<QgsGeometry> &geometries );
2796 bool requiresConversionToStraightSegments()
const;
2808 void draw( QPainter &p )
const;
2850 void filterVertices( const std::function<
bool( const
QgsPoint & ) > &filter )
SIP_SKIP;
2880 static
QgsGeometry fromQPolygonF( const QPolygonF &polygon );
2911 double epsilon = 4 * std::numeric_limits<double>::epsilon() );
2922 double epsilon = 4 * std::numeric_limits<double>::epsilon() );
2934 double epsilon = 4 * std::numeric_limits<double>::epsilon() );
2955 static bool compare( PyObject *obj1, PyObject *obj2,
double epsilon = 4 * std::numeric_limits<double>::epsilon() );
2963 if ( PyList_Check( a0 ) && PyList_Check( a1 ) &&
2964 PyList_GET_SIZE( a0 ) && PyList_GET_SIZE( a1 ) )
2966 PyObject *o0 = PyList_GetItem( a0, 0 );
2967 PyObject *o1 = PyList_GetItem( a1, 0 );
2971 if ( sipCanConvertToType( o0, sipType_QgsPointXY, SIP_NOT_NONE ) &&
2972 sipCanConvertToType( o1, sipType_QgsPointXY, SIP_NOT_NONE ) &&
2973 sipCanConvertToType( a0, sipType_QVector_0100QgsPointXY, SIP_NOT_NONE ) &&
2974 sipCanConvertToType( a1, sipType_QVector_0100QgsPointXY, SIP_NOT_NONE ) )
2978 p0 =
reinterpret_cast<QgsPolylineXY *
>( sipConvertToType( a0, sipType_QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
2979 p1 =
reinterpret_cast<QgsPolylineXY *
>( sipConvertToType( a1, sipType_QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
2982 sipReleaseType( p0, sipType_QVector_0100QgsPointXY, state0 );
2983 sipReleaseType( p1, sipType_QVector_0100QgsPointXY, state1 );
2990 else if ( PyList_Check( o0 ) && PyList_Check( o1 ) &&
2991 PyList_GET_SIZE( o0 ) && PyList_GET_SIZE( o1 ) )
2993 PyObject *oo0 = PyList_GetItem( o0, 0 );
2994 PyObject *oo1 = PyList_GetItem( o1, 0 );
2998 if ( sipCanConvertToType( oo0, sipType_QgsPointXY, SIP_NOT_NONE ) &&
2999 sipCanConvertToType( oo1, sipType_QgsPointXY, SIP_NOT_NONE ) &&
3000 sipCanConvertToType( a0, sipType_QVector_0600QVector_0100QgsPointXY, SIP_NOT_NONE ) &&
3001 sipCanConvertToType( a1, sipType_QVector_0600QVector_0100QgsPointXY, SIP_NOT_NONE ) )
3005 p0 =
reinterpret_cast<QgsPolygonXY *
>( sipConvertToType( a0, sipType_QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
3006 p1 =
reinterpret_cast<QgsPolygonXY *
>( sipConvertToType( a1, sipType_QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
3009 sipReleaseType( p0, sipType_QVector_0600QVector_0100QgsPointXY, state0 );
3010 sipReleaseType( p1, sipType_QVector_0600QVector_0100QgsPointXY, state1 );
3017 else if ( PyList_Check( oo0 ) && PyList_Check( oo1 ) &&
3018 PyList_GET_SIZE( oo0 ) && PyList_GET_SIZE( oo1 ) )
3020 PyObject *ooo0 = PyList_GetItem( oo0, 0 );
3021 PyObject *ooo1 = PyList_GetItem( oo1, 0 );
3025 if ( sipCanConvertToType( ooo0, sipType_QgsPointXY, SIP_NOT_NONE ) &&
3026 sipCanConvertToType( ooo1, sipType_QgsPointXY, SIP_NOT_NONE ) &&
3027 sipCanConvertToType( a0, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, SIP_NOT_NONE ) &&
3028 sipCanConvertToType( a1, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, SIP_NOT_NONE ) )
3032 p0 =
reinterpret_cast<QgsMultiPolygonXY *
>( sipConvertToType( a0, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
3033 p1 =
reinterpret_cast<QgsMultiPolygonXY *
>( sipConvertToType( a1, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
3036 sipReleaseType( p0, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, state0 );
3037 sipReleaseType( p1, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, state1 );
3069 QgsGeometry smooth(
unsigned int iterations = 1,
double offset = 0.25,
3070 double minimumDistance = -1.0,
double maxAngle = 180.0 )
const;
3126 operator QVariant()
const
3128 return QVariant::fromValue( *
this );
3136 mutable QString mLastError;
3148 void reset( std::unique_ptr< QgsAbstractGeometry > newGeometry );
3153 QgsGeometry convertToPoint(
bool destMultipart )
const;
3155 QgsGeometry convertToLine(
bool destMultipart )
const;
3157 QgsGeometry convertToPolygon(
bool destMultipart )
const;
3170 std::unique_ptr< QgsLineString > smoothLine(
const QgsLineString &line,
unsigned int iterations = 1,
double offset = 0.25,
3171 double minimumDistance = -1,
double maxAngle = 180.0 )
const;
3184 std::unique_ptr< QgsPolygon > smoothPolygon(
const QgsPolygon &polygon,
unsigned int iterations = 1,
double offset = 0.25,
3185 double minimumDistance = -1,
double maxAngle = 180.0 )
const;
The Qgis class provides global constants for use throughout the application.
@ CounterClockwise
Counter-clockwise direction.
@ Clockwise
Clockwise direction.
GeometryOperationResult
Success or failure of a geometry operation.
QFlags< GeometryValidityFlag > GeometryValidityFlags
Geometry validity flags.
GeometryValidationEngine
Available engines for validating geometries.
@ QgisInternal
Use internal QgsGeometryValidator method.
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
WkbType
The WKB type describes the number of dimensions a geometry has.
TransformDirection
Indicates the direction (forward or inverse) of a transform.
@ Forward
Forward transform (from source to destination)
The part_iterator class provides STL-style iterator for const references to geometry parts.
The part_iterator class provides STL-style iterator for geometry parts.
The vertex_iterator class provides 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.
Custom exception class for Coordinate Reference System related exceptions.
Abstract base class for curved geometry type.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
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.
Error(const QString &m, const QgsPointXY &p)
bool operator==(const QgsGeometry::Error &other) const
A geometry is the spatial representation of a feature.
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...
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.
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.
bool isPolygonClockwise() const
Returns True if the Polygon is clockwise.
This class offers geometry processing methods.
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.
A class to represent a 2D point.
Point geometry type, with support for z-dimension and m-values.
A rectangle specified with double values.
Represents a vector layer which manages a vector based data sets.
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 bool isMultiType(Qgis::WkbType type)
Returns true if the WKB type is a multi type.
static 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.
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
CORE_EXPORT QgsMeshVertex centroid(const QgsMeshFace &face, const QVector< QgsMeshVertex > &vertices)
Returns the centroid of the face.
std::unique_ptr< GEOSGeometry, GeosDeleter > unique_ptr
Scoped GEOS pointer.
const double DEFAULT_SEGMENT_EPSILON
Default snapping tolerance for segments.
#define SIP_TYPEHINT(type)
#define SIP_THROW(name,...)
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.
QVector< QgsPolylineXY > QgsMultiPolylineXY
A collection of QgsPolylines that share a common collection of attributes.
CORE_EXPORT QDataStream & operator>>(QDataStream &in, QgsGeometry &geometry)
Reads a geometry from stream in into geometry. QGIS version compatibility is not guaranteed.
QVector< QgsPointXY > QgsMultiPointXY
A collection of QgsPoints that share a common collection of attributes.
QVector< QgsPointXY > QgsPolylineXY
Polyline as represented as a vector of two-dimensional points.
CORE_EXPORT QDataStream & operator<<(QDataStream &out, const QgsGeometry &geometry)
Writes the geometry to stream out. QGIS version compatibility is not guaranteed.
QVector< QgsPolygonXY > QgsMultiPolygonXY
A collection of QgsPolygons that share a common collection of attributes.
QgsPointSequence QgsPolyline
Polyline as represented as a vector of points.
Utility class for identifying a unique vertex within a geometry.