32#include <QPainterPath> 
   34#include <nlohmann/json.hpp> 
   48  auto result = std::make_unique< QgsCurvePolygon >();
 
   50  return result.release();
 
 
   55  return QStringLiteral( 
"CurvePolygon" );
 
 
  134  std::unique_ptr< QgsCurve > currentCurve;
 
  135  for ( 
int i = 0; i < nRings; ++i )
 
  138    wkbPtr -= 1 + 
sizeof( int );
 
  156    currentCurve->fromWkb( wkbPtr );  
 
 
  181  QString secondWithoutParentheses = 
parts.second;
 
  182  secondWithoutParentheses = secondWithoutParentheses.remove( 
'(' ).remove( 
')' ).simplified().remove( 
' ' );
 
  183  if ( ( 
parts.second.compare( QLatin1String( 
"EMPTY" ), Qt::CaseInsensitive ) == 0 ) ||
 
  184       secondWithoutParentheses.isEmpty() )
 
  187  QString defaultChildWkbType = QStringLiteral( 
"LineString%1%2" ).arg( 
is3D() ? QStringLiteral( 
"Z" ) : QString(), 
isMeasure() ? QStringLiteral( 
"M" ) : QString() );
 
  190  for ( 
const QString &childWkt : blocks )
 
  232    hasZ = hasZ || curve->is3D();
 
  233    hasM = hasM || curve->isMeasure();
 
 
  256  int binarySize = 
sizeof( char ) + 
sizeof( quint32 ) + 
sizeof( quint32 );
 
  263    binarySize += curve->wkbSize( flags );
 
 
  274  wkbPtr << static_cast<quint32>( 
wkbType() );
 
  282    wkbPtr << curve->asWkb( flags );
 
 
  292    wkt += QLatin1String( 
" EMPTY" );
 
  295    wkt += QLatin1String( 
" (" );
 
  299      if ( qgsgeometry_cast<QgsLineString *>( 
mExteriorRing.get() ) )
 
  302        childWkt = childWkt.mid( childWkt.indexOf( 
'(' ) );
 
  304      wkt += childWkt + 
',';
 
  308      if ( !curve->isEmpty() )
 
  310        QString childWkt = curve->asWkt( 
precision );
 
  311        if ( qgsgeometry_cast<const QgsLineString *>( curve ) )
 
  314          childWkt = childWkt.mid( childWkt.indexOf( 
'(' ) );
 
  316        wkt += childWkt + 
',';
 
  319    if ( wkt.endsWith( 
',' ) )
 
 
  331  QDomElement elemPolygon = doc.createElementNS( ns, QStringLiteral( 
"Polygon" ) );
 
  336  QDomElement elemOuterBoundaryIs = doc.createElementNS( ns, QStringLiteral( 
"outerBoundaryIs" ) );
 
  337  std::unique_ptr< QgsLineString > exteriorLineString( 
exteriorRing()->curveToLine() );
 
  338  QDomElement outerRing = exteriorLineString->asGml2( doc, 
precision, ns, axisOrder );
 
  339  outerRing.toElement().setTagName( QStringLiteral( 
"LinearRing" ) );
 
  340  elemOuterBoundaryIs.appendChild( outerRing );
 
  341  elemPolygon.appendChild( elemOuterBoundaryIs );
 
  342  std::unique_ptr< QgsLineString > interiorLineString;
 
  345    QDomElement elemInnerBoundaryIs = doc.createElementNS( ns, QStringLiteral( 
"innerBoundaryIs" ) );
 
  346    interiorLineString.reset( 
interiorRing( i )->curveToLine() );
 
  347    QDomElement innerRing = interiorLineString->asGml2( doc, 
precision, ns, axisOrder );
 
  348    innerRing.toElement().setTagName( QStringLiteral( 
"LinearRing" ) );
 
  349    elemInnerBoundaryIs.appendChild( innerRing );
 
  350    elemPolygon.appendChild( elemInnerBoundaryIs );
 
 
  357  QDomElement elemCurvePolygon = doc.createElementNS( ns, QStringLiteral( 
"Polygon" ) );
 
  360    return elemCurvePolygon;
 
  362  const auto exportRing = [&doc, 
precision, &ns, axisOrder]( 
const QgsCurve * ring )
 
  364    QDomElement ringElem = ring->asGml3( doc, 
precision, ns, axisOrder );
 
  365    if ( ringElem.tagName() == QLatin1String( 
"LineString" ) )
 
  367      ringElem.setTagName( QStringLiteral( 
"LinearRing" ) );
 
  369    else if ( ringElem.tagName() == QLatin1String( 
"CompositeCurve" ) )
 
  371      ringElem.setTagName( QStringLiteral( 
"Ring" ) );
 
  373    else if ( ringElem.tagName() == QLatin1String( 
"Curve" ) )
 
  375      QDomElement ringElemNew = doc.createElementNS( ns, QStringLiteral( 
"Ring" ) );
 
  376      QDomElement curveMemberElem = doc.createElementNS( ns, QStringLiteral( 
"curveMember" ) );
 
  377      ringElemNew.appendChild( curveMemberElem );
 
  378      curveMemberElem.appendChild( ringElem );
 
  379      ringElem = std::move( ringElemNew );
 
  384  QDomElement elemExterior = doc.createElementNS( ns, QStringLiteral( 
"exterior" ) );
 
  385  elemExterior.appendChild( exportRing( 
exteriorRing() ) );
 
  386  elemCurvePolygon.appendChild( elemExterior );
 
  390    QDomElement elemInterior = doc.createElementNS( ns, QStringLiteral( 
"interior" ) );
 
  391    elemInterior.appendChild( exportRing( 
interiorRing( i ) ) );
 
  392    elemCurvePolygon.appendChild( elemInterior );
 
  394  return elemCurvePolygon;
 
 
  399  json coordinates( json::array( ) );
 
  402    std::unique_ptr< QgsLineString > exteriorLineString( lExteriorRing->curveToLine() );
 
  404    exteriorLineString->points( exteriorPts );
 
  407    std::unique_ptr< QgsLineString > interiorLineString;
 
  410      interiorLineString.reset( 
interiorRing( i )->curveToLine() );
 
  412      interiorLineString->points( interiorPts );
 
  418    {  
"type", 
"Polygon"  },
 
  419    { 
"coordinates", coordinates }
 
 
  426  kml.append( QLatin1String( 
"<Polygon>" ) );
 
  429    kml.append( QLatin1String( 
"<outerBoundaryIs>" ) );
 
  431    kml.append( QLatin1String( 
"</outerBoundaryIs>" ) );
 
  434  for ( 
const QgsCurve *ring : interiorRings )
 
  436    kml.append( QLatin1String( 
"<innerBoundaryIs>" ) );
 
  438    kml.append( QLatin1String( 
"</innerBoundaryIs>" ) );
 
  440  kml.append( QLatin1String( 
"</Polygon>" ) );
 
 
  458    return a->compareTo( b ) > 0;
 
 
  472  double totalArea = 0.0;
 
  478    totalArea += std::fabs( 
area );
 
  484    if ( ring->isRing() )
 
  486      ring->sumUpArea( 
area );
 
  487      totalArea -= std::fabs( 
area );
 
 
  513  return 4.0 * M_PI * 
area() / pow( p, 2.0 );
 
 
  518  auto polygon = std::make_unique<QgsPolygon>();
 
  520    return polygon.release();
 
  522  polygon->setExteriorRing( 
exteriorRing()->curveToLine() );
 
  523  QVector<QgsCurve *> interiors;
 
  525  interiors.reserve( n );
 
  526  for ( 
int i = 0; i < n; ++i )
 
  530  polygon->setInteriorRings( interiors );
 
  531  return polygon.release();
 
 
  547    multiCurve->
reserve( nInteriorRings + 1 );
 
  549    for ( 
int i = 0; i < nInteriorRings; ++i )
 
 
  566  auto exterior = std::unique_ptr<QgsCurve> { 
static_cast< QgsCurve *
>( 
mExteriorRing->snappedToGrid( hSpacing, vSpacing, dSpacing, mSpacing, removeRedundantPoints ) ) };
 
  571  polygon->mExteriorRing = std::move( exterior );
 
  579    QgsCurve *gridifiedInterior = 
static_cast< QgsCurve * 
>( interior->snappedToGrid( hSpacing, vSpacing, dSpacing, mSpacing, removeRedundantPoints ) );
 
  581    if ( !gridifiedInterior )
 
  584    polygon->mInteriorRings.append( gridifiedInterior );
 
  587  return polygon.release();
 
 
  597  std::unique_ptr< QgsAbstractGeometry > exterior( 
mExteriorRing->simplifyByDistance( tolerance ) );
 
  598  if ( !qgsgeometry_cast< QgsLineString * >( exterior.get() ) )
 
  601  auto polygon = std::make_unique< QgsPolygon >( qgis::down_cast< QgsLineString * >( exterior.release() ) );
 
  609    std::unique_ptr< QgsAbstractGeometry > simplifiedRing( interior->simplifyByDistance( tolerance ) );
 
  610    if ( !simplifiedRing )
 
  613    if ( !qgsgeometry_cast< QgsLineString * >( simplifiedRing.get() ) )
 
  616    polygon->mInteriorRings.append( qgis::down_cast< QgsLineString * >( simplifiedRing.release() ) );
 
  619  return polygon.release();
 
 
  625  auto cleanRing = [epsilon, useZValues ]( 
QgsCurve * ring )->
bool 
  627    if ( ring->numPoints() <= 4 )
 
  630    if ( ring->removeDuplicateNodes( epsilon, useZValues ) )
 
  634      ring->pointAt( 0, startPoint, type );
 
  648    if ( cleanRing( ring ) ) result = 
true;
 
 
  674    if ( ring->boundingBoxIntersects( box3d ) )
 
 
  688  auto poly = std::make_unique<QgsPolygon>();
 
  691    return poly.release();
 
  694  poly->setExteriorRing( 
mExteriorRing->curveToLine( tolerance, toleranceType ) );
 
  696  QVector<QgsCurve *> rings;
 
  700    rings.push_back( ring->curveToLine( tolerance, toleranceType ) );
 
  702  poly->setInteriorRings( rings );
 
  703  return poly.release();
 
 
  761  else if ( !ring->
is3D() )
 
 
  786  for ( 
int ringIndex = 
mInteriorRings.size() - 1; ringIndex >= 0; --ringIndex )
 
  788    if ( minimumAllowedArea < 0 )
 
  794      if ( std::fabs( 
area ) < minimumAllowedArea )
 
 
  804  QVector<QgsCurve *> validRings;
 
  808    if ( !curve->isRing() )
 
 
  831    std::unique_ptr< QgsCurve > flipped( 
mExteriorRing->reversed() );
 
  835  QVector<QgsCurve *> validRings;
 
  842      validRings << flipped;
 
 
  861  QVector<QgsCurve *> validRings;
 
  868      validRings << flipped;
 
 
  891    QPainterPath ringPath = ring->asQPainterPath();
 
  892    ringPath.closeSubpath();
 
  893    p.addPath( ringPath );
 
 
  915      ring->addToPainterPath( path );
 
 
  930    curve->transform( ct, d, transformZ );
 
 
  939    mExteriorRing->transform( t, zTranslate, zScale, mTranslate, mScale );
 
  944    curve->transform( t, zTranslate, zScale, mTranslate, mScale );
 
 
  963    ring->points( sequence.back().back() );
 
 
  980    count += ring->nCoordinates();
 
 
 1006    if ( 
id.ring == i + 1 )
 
 1009      if ( partNumber == -1 )
 
 1011      return number + partNumber;
 
 
 1035  QVector<QgsCurve *> segmentList;
 
 
 1087  if ( vertex.
vertex == 0 && n < 3 )
 
 1091  else if ( vertex.
vertex == 0 )
 
 1099  if ( vertex.
vertex == n - 1 && n < 3 )
 
 1103  else if ( vertex.
vertex == n - 1 )
 
 
 1122  if ( vertex.
ring == 0 )
 
 
 1150  else if ( vId.
vertex == n )
 
 
 1167  bool success = ring->
moveVertex( vId, newPos );
 
 1173    else if ( vId.
vertex == n - 1 )
 
 
 1182  const int interiorRingId = vId.
ring - 1;
 
 1194    if ( vId.
ring == 0 )
 
 1218    else if ( vId.
vertex == n - 1 )
 
 
 1234    if ( ring->hasCurvedSegments() )
 
 
 1244  return toPolygon( tolerance, toleranceType );
 
 
 1301    curve->addZValue( zValue );
 
 
 1318    curve->addMValue( mValue );
 
 
 1334    curve->dropZValue();
 
 
 1350    curve->dropMValue();
 
 
 1381  if ( !res || ( feedback && feedback->
isCanceled() ) )
 
 1389    res = curve->transform( transformer );
 
 
 1408    curve->filterVertices( filter );
 
 
 1440  const QgsCurvePolygon *otherPolygon = qgsgeometry_cast<const QgsCurvePolygon *>( other );
 
 1441  if ( !otherPolygon )
 
 1451    if ( shellComp != 0 )
 
 1459  if ( nHole1 < nHole2 )
 
 1463  if ( nHole1 > nHole2 )
 
 1468  for ( 
int i = 0; i < nHole1; i++ )
 
 1471    if ( holeComp != 0 )
 
 
@ CounterClockwise
Counter-clockwise direction.
 
@ Clockwise
Clockwise direction.
 
VertexType
Types of vertex.
 
WkbType
The WKB type describes the number of dimensions a geometry has.
 
@ CompoundCurve
CompoundCurve.
 
@ CircularString
CircularString.
 
@ CurvePolygon
CurvePolygon.
 
TransformDirection
Indicates the direction (forward or inverse) of a transform.
 
Abstract base class for all geometries.
 
virtual bool addZValue(double zValue=0)=0
Adds a z-dimension to the geometry, initialized to a preset value.
 
virtual bool moveVertex(QgsVertexId position, const QgsPoint &newPos)=0
Moves a vertex within the geometry.
 
SegmentationToleranceType
Segmentation tolerance as maximum angle or maximum difference between approximation and circle.
 
virtual double vertexAngle(QgsVertexId vertex) const =0
Returns approximate angle at a vertex.
 
virtual bool dropMValue()=0
Drops any measure values which exist in the geometry.
 
bool isMeasure() const
Returns true if the geometry contains m values.
 
QFlags< WkbFlag > WkbFlags
 
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
 
AxisOrder
Axis order for GML generation.
 
QString wktTypeStr() const
Returns the WKT type string of the geometry.
 
QgsAbstractGeometry & operator=(const QgsAbstractGeometry &geom)
 
virtual bool addMValue(double mValue=0)=0
Adds a measure to the geometry, initialized to a preset value.
 
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
 
virtual bool insertVertex(QgsVertexId position, const QgsPoint &vertex)=0
Inserts a vertex into the geometry.
 
void setZMTypeFromSubGeometry(const QgsAbstractGeometry *subggeom, Qgis::WkbType baseGeomType)
Updates the geometry type based on whether sub geometries contain z or m values.
 
virtual bool boundingBoxIntersects(const QgsRectangle &rectangle) const
Returns true if the bounding box of this geometry intersects with a rectangle.
 
virtual bool deleteVertex(QgsVertexId position)=0
Deletes a vertex within the geometry.
 
virtual bool dropZValue()=0
Drops any z-dimensions which exist in the geometry.
 
virtual double segmentLength(QgsVertexId startVertex) const =0
Returns the length of the segment of the geometry which begins at startVertex.
 
QgsGeometryConstPartIterator parts() const
Returns Java-style iterator for traversal of parts of the geometry.
 
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
 
static endian_t endian()
Returns whether this machine uses big or little endian.
 
A 3-dimensional box composed of x, y, z coordinates.
 
bool intersects(const QgsBox3D &other) const
Returns true if box intersects with another box.
 
bool isNull() const
Test if the box is null (holding no spatial information).
 
Circular string geometry type.
 
Compound curve geometry type.
 
Qgis::WkbType readHeader() const
readHeader
 
Curve polygon geometry type.
 
QByteArray asWkb(QgsAbstractGeometry::WkbFlags flags=QgsAbstractGeometry::WkbFlags()) const override
Returns a WKB representation of the geometry.
 
int numInteriorRings() const
Returns the number of interior rings contained with the curve polygon.
 
QgsCoordinateSequence coordinateSequence() const override
Retrieves the sequence of geometries, rings and nodes.
 
int wkbSize(QgsAbstractGeometry::WkbFlags flags=QgsAbstractGeometry::WkbFlags()) const override
Returns the length of the QByteArray returned by asWkb()
 
bool moveVertex(QgsVertexId position, const QgsPoint &newPos) override
Moves a vertex within the geometry.
 
QString asWkt(int precision=17) const override
Returns a WKT representation of the geometry.
 
bool addZValue(double zValue=0) override
Adds a z-dimension to the geometry, initialized to a preset value.
 
QDomElement asGml2(QDomDocument &doc, int precision=17, const QString &ns="gml", QgsAbstractGeometry::AxisOrder axisOrder=QgsAbstractGeometry::AxisOrder::XY) const override
Returns a GML2 representation of the geometry.
 
double vertexAngle(QgsVertexId vertex) const override
Returns approximate rotation angle for a vertex.
 
bool hasCurvedSegments() const override
Returns true if the geometry contains curved segments.
 
const QgsCurve * exteriorRing() const
Returns the curve polygon's exterior ring.
 
QgsAbstractGeometry * boundary() const override
Returns the closure of the combinatorial boundary of the geometry (ie the topological boundary of the...
 
QgsCurvePolygon * createEmptyWithSameType() const override
Creates a new geometry with the same class and same WKB type as the original and transfers ownership.
 
QPainterPath asQPainterPath() const override
Returns the geometry represented as a QPainterPath.
 
void swapXy() override
Swaps the x and y coordinates from the geometry.
 
bool isEmpty() const override
Returns true if the geometry is empty.
 
int vertexCount(int part=0, int ring=0) const override
Returns the number of vertices of which this geometry is built.
 
virtual QgsPolygon * toPolygon(double tolerance=M_PI_2/90, SegmentationToleranceType toleranceType=MaximumAngle) const
Returns a new polygon geometry corresponding to a segmentized approximation of the curve.
 
QVector< QgsCurve * > mInteriorRings
 
bool fromWkb(QgsConstWkbPtr &wkb) override
Sets the geometry from a WKB string.
 
void normalize() final
Reorganizes the geometry into a normalized form (or "canonical" form).
 
void removeInteriorRings(double minimumAllowedArea=-1)
Removes the interior rings from the polygon.
 
QgsCurvePolygon * clone() const override
Clones the geometry by performing a deep copy.
 
const QgsCurve * interiorRing(int i) const
Retrieves an interior ring from the curve polygon.
 
double area() const override
Returns the planar, 2-dimensional area of the geometry.
 
QgsCurvePolygon * toCurveType() const override
Returns the geometry converted to the more generic curve type.
 
void forceRHR()
Forces the geometry to respect the Right-Hand-Rule, in which the area that is bounded by the polygon ...
 
QgsCurvePolygon * simplifyByDistance(double tolerance) const override
Simplifies the geometry by applying the Douglas Peucker simplification by distance algorithm.
 
QString asKml(int precision=17) const override
Returns a KML representation of the geometry.
 
void clear() override
Clears the geometry, ie reset it to a null geometry.
 
QgsBox3D calculateBoundingBox3D() const override
Calculates the minimal 3D bounding box for the geometry.
 
virtual void setExteriorRing(QgsCurve *ring)
Sets the exterior ring of the polygon.
 
double closestSegment(const QgsPoint &pt, QgsPoint &segmentPt, QgsVertexId &vertexAfter, int *leftOf=nullptr, double epsilon=4 *std::numeric_limits< double >::epsilon()) const override
Searches for the closest segment of the geometry to a given point.
 
int partCount() const override
Returns count of parts contained in the geometry.
 
int nCoordinates() const override
Returns the number of nodes contained in the geometry.
 
void filterVertices(const std::function< bool(const QgsPoint &) > &filter) override
Filters the vertices from the geometry in place, removing any which do not return true for the filter...
 
void adjacentVertices(QgsVertexId vertex, QgsVertexId &previousVertex, QgsVertexId &nextVertex) const override
Returns the vertices adjacent to a specified vertex within a geometry.
 
void draw(QPainter &p) const override
Draws the geometry using the specified QPainter.
 
double perimeter() const override
Returns the planar, 2-dimensional perimeter of the geometry.
 
bool addMValue(double mValue=0) override
Adds a measure to the geometry, initialized to a preset value.
 
QgsCurvePolygon & operator=(const QgsCurvePolygon &p)
 
void forceCounterClockwise()
Forces the polygon to respect the exterior ring is counter-clockwise, interior rings are clockwise co...
 
bool dropZValue() override
Drops any z-dimensions which exist in the geometry.
 
void forceClockwise()
Forces the polygon to respect the exterior ring is clockwise, interior rings are counter-clockwise co...
 
double roundness() const
Returns the roundness of the curve polygon.
 
virtual void addInteriorRing(QgsCurve *ring)
Adds an interior ring to the geometry (takes ownership)
 
bool boundingBoxIntersects(const QgsBox3D &box3d) const override
Returns true if the bounding box of this geometry intersects with a box3d.
 
~QgsCurvePolygon() override
 
int dimension() const override
Returns the inherent dimension of the geometry.
 
bool nextVertex(QgsVertexId &id, QgsPoint &vertex) const override
Returns next vertex id and coordinates.
 
QgsPoint vertexAt(QgsVertexId id) const override
Returns the point corresponding to a specified vertex id.
 
virtual QgsPolygon * surfaceToPolygon() const
Gets a polygon representation of this surface.
 
int ringCount(int part=0) const override
Returns the number of rings of which this geometry is built.
 
bool insertVertex(QgsVertexId position, const QgsPoint &vertex) override
Inserts a vertex into the geometry.
 
bool fromWkt(const QString &wkt) override
Sets the geometry from a WKT string.
 
void removeInvalidRings()
Removes any interior rings which are not valid from the polygon.
 
QgsAbstractGeometry * segmentize(double tolerance=M_PI_2/90, SegmentationToleranceType toleranceType=MaximumAngle) const override
Returns a geometry without curves.
 
int vertexNumberFromVertexId(QgsVertexId id) const override
Returns the vertex number corresponding to a vertex id.
 
QString geometryType() const override
Returns a unique string representing the geometry type.
 
void transformVertices(const std::function< QgsPoint(const QgsPoint &) > &transform) override
Transforms the vertices from the geometry in place, applying the transform function to every vertex.
 
int childCount() const override
Returns number of child geometries (for geometries with child geometries) or child points (for geomet...
 
bool deleteVertex(QgsVertexId position) override
Deletes a vertex within the geometry.
 
QDomElement asGml3(QDomDocument &doc, int precision=17, const QString &ns="gml", QgsAbstractGeometry::AxisOrder axisOrder=QgsAbstractGeometry::AxisOrder::XY) const override
Returns a GML3 representation of the geometry.
 
bool removeDuplicateNodes(double epsilon=4 *std::numeric_limits< double >::epsilon(), bool useZValues=false) override
Removes duplicate nodes from the geometry, wherever removing the nodes does not result in a degenerat...
 
QgsCurvePolygon * snappedToGrid(double hSpacing, double vSpacing, double dSpacing=0, double mSpacing=0, bool removeRedundantPoints=false) const override
Makes a new geometry with all the points or vertices snapped to the closest point of the grid.
 
bool dropMValue() override
Drops any measure values which exist in the geometry.
 
QgsAbstractGeometry * childGeometry(int index) const override
Returns pointer to child geometry (for geometries with child geometries - i.e.
 
json asJsonObject(int precision=17) const override
Returns a json object representation of the geometry.
 
void setInteriorRings(const QVector< QgsCurve * > &rings)
Sets all interior rings (takes ownership)
 
bool removeInteriorRing(int ringIndex)
Removes an interior ring from the polygon.
 
std::unique_ptr< QgsCurve > mExteriorRing
 
int compareToSameClass(const QgsAbstractGeometry *other) const final
Compares to an other geometry of the same class, and returns a integer for sorting of the two geometr...
 
double segmentLength(QgsVertexId startVertex) const override
Returns the length of the segment of the geometry which begins at startVertex.
 
void transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection d=Qgis::TransformDirection::Forward, bool transformZ=false) override
Transforms the geometry using a coordinate transform.
 
Abstract base class for curved geometry type.
 
virtual int numPoints() const =0
Returns the number of points in the curve.
 
QPainterPath asQPainterPath() const override
Returns the geometry represented as a QPainterPath.
 
QgsPoint vertexAt(QgsVertexId id) const override
Returns the point corresponding to a specified vertex id.
 
bool nextVertex(QgsVertexId &id, QgsPoint &vertex) const override
Returns next vertex id and coordinates.
 
virtual QgsCurve * reversed() const =0
Returns a reversed copy of the curve, where the direction of the curve has been flipped.
 
Base class for feedback objects to be used for cancellation of something running in a worker thread.
 
bool isCanceled() const
Tells whether the operation has been canceled already.
 
void reserve(int size)
Attempts to allocate memory for at least size geometries.
 
static json pointsToJson(const QgsPointSequence &points, int precision)
Returns coordinates as json object.
 
static QStringList wktGetChildBlocks(const QString &wkt, const QString &defaultType=QString())
Parses a WKT string and returns of list of blocks contained in the WKT.
 
static QPair< Qgis::WkbType, QString > wktReadBlock(const QString &wkt)
Parses a WKT block of the format "TYPE( contents )" and returns a pair of geometry type to contents (...
 
static double closestSegmentFromComponents(T &container, ComponentType ctype, const QgsPoint &pt, QgsPoint &segmentPt, QgsVertexId &vertexAfter, int *leftOf, double epsilon)
 
Line string geometry type, with support for z-dimension and m-values.
 
Multi curve geometry collection.
 
bool addGeometry(QgsAbstractGeometry *g) override
Adds a geometry and takes ownership. Returns true in case of success.
 
Point geometry type, with support for z-dimension and m-values.
 
QgsPoint vertexAt(QgsVertexId) const override
Returns the point corresponding to a specified vertex id.
 
bool moveVertex(QgsVertexId position, const QgsPoint &newPos) override
Moves a vertex within the geometry.
 
void clearCache() const override
Clears any cached parameters associated with the geometry, e.g., bounding boxes.
 
QString mValidityFailureReason
 
static Qgis::WkbType dropM(Qgis::WkbType type)
Drops the m dimension (if present) for a WKB type and returns the new type.
 
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 Qgis::WkbType dropZ(Qgis::WkbType type)
Drops the z dimension (if present) for a WKB type and returns the new type.
 
static Qgis::WkbType addM(Qgis::WkbType type)
Adds the m dimension to a WKB type and returns the new type.
 
static Qgis::WkbType addZ(Qgis::WkbType type)
Adds the z dimension to a WKB type and returns the new type.
 
static Q_INVOKABLE bool hasZ(Qgis::WkbType type)
Tests whether a WKB type contains the z-dimension.
 
static Q_INVOKABLE bool hasM(Qgis::WkbType type)
Tests whether a WKB type contains m values.
 
static Qgis::WkbType flatType(Qgis::WkbType type)
Returns the flat type for a WKB type.
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
 
QVector< QgsRingSequence > QgsCoordinateSequence
 
QVector< QgsPointSequence > QgsRingSequence
 
QVector< QgsPoint > QgsPointSequence
 
void ringAdjacentVertices(const QgsCurve *curve, QgsVertexId vertex, QgsVertexId &previousVertex, QgsVertexId &nextVertex)
 
Utility class for identifying a unique vertex within a geometry.