20#include <nlohmann/json.hpp>
53 std::unique_ptr< QgsAbstractGeometry >
geometry;
63 if ( !d->
ref.deref() )
71 d->
ref = QAtomicInt( 1 );
78 d->
ref = QAtomicInt( 1 );
84 mLastError = other.mLastError;
92 if ( !d->
ref.deref() )
97 mLastError = other.mLastError;
104void QgsGeometry::detach()
109 std::unique_ptr< QgsAbstractGeometry > cGeom;
111 cGeom.reset( d->
geometry->clone() );
113 reset( std::move( cGeom ) );
116void QgsGeometry::reset( std::unique_ptr<QgsAbstractGeometry> newGeometry )
120 ( void )d->
ref.deref();
123 d->
geometry = std::move( newGeometry );
139 if ( d->
geometry.get() == geometry )
144 reset( std::unique_ptr< QgsAbstractGeometry >( geometry ) );
158 QMutexLocker lock( sWktMutex() );
159 if (
const QgsGeometry *cached = sWktCache()->
object( wkt ) )
162 sWktCache()->insert( wkt,
new QgsGeometry( result ), 1 );
188 return QgsGeometry( std::make_unique< QgsLineString >( polyline ) );
233 std::unique_ptr< QgsLineString > ext = std::make_unique< QgsLineString >(
234 QVector< double >() << rect.
xMinimum()
239 QVector< double >() << rect.
yMinimum()
244 std::unique_ptr< QgsPolygon > polygon = std::make_unique< QgsPolygon >();
245 polygon->setExteriorRing( ext.release() );
262 if ( g.isMultipart() )
264 for (
auto p = g.const_parts_begin(); p != g.const_parts_end(); ++p )
266 collected.
addPart( ( *p )->clone() );
280 if ( std::abs( angularWidth ) >= 360.0 )
282 std::unique_ptr< QgsCompoundCurve > outerCc = std::make_unique< QgsCompoundCurve >();
287 std::unique_ptr< QgsCurvePolygon > cp = std::make_unique< QgsCurvePolygon >();
288 cp->setExteriorRing( outerCc.release() );
292 std::unique_ptr< QgsCompoundCurve > innerCc = std::make_unique< QgsCompoundCurve >();
297 cp->setInteriorRings( { innerCc.release() } );
303 std::unique_ptr< QgsCompoundCurve > wedge = std::make_unique< QgsCompoundCurve >();
305 const double startAngle = azimuth - angularWidth * 0.5;
306 const double endAngle = azimuth + angularWidth * 0.5;
311 const bool useShortestArc = angularWidth <= 180.0;
329 std::unique_ptr< QgsCurvePolygon > cp = std::make_unique< QgsCurvePolygon >();
330 cp->setExteriorRing( wedge.release() );
364 return Qgis::GeometryType::Unknown;
408 d->
geometry->adjacentVertices(
id, prevVertex, nextVertex );
444 return d->
geometry->vertexAngle( v2 );
463 d->
geometry->adjacentVertices(
id, beforeVertexId, afterVertexId );
501 return d->
geometry->moveVertex(
id, p );
534 return d->
geometry->deleteVertex(
id );
554 if ( owningCollection !=
nullptr )
555 part = owningCollection->
geometryN(
id.part );
561 QgsCurvePolygon *owningPolygon = qgsgeometry_cast<QgsCurvePolygon *>( part );
562 if ( owningPolygon !=
nullptr )
568 QgsCurve *curve = qgsgeometry_cast<QgsCurve *>( ring );
569 if ( curve ==
nullptr )
572 bool success =
false;
574 if ( cpdCurve !=
nullptr )
583 std::unique_ptr<QgsCompoundCurve> cpdCurve = std::make_unique<QgsCompoundCurve>();
584 cpdCurve->addCurve( curve->
clone() );
585 success = cpdCurve->toggleCircularAtVertex(
QgsVertexId( -1, -1,
id.vertex ) );
590 if ( owningPolygon ==
nullptr && owningCollection ==
nullptr )
593 reset( std::make_unique<QgsCompoundCurve>( *cpdCurve ) );
595 else if ( owningPolygon !=
nullptr )
608 else if ( owningCollection !=
nullptr )
669 return d->
geometry->insertVertex(
id, point );
685 return d->
geometry->vertexAt( vId );
705 result.mLastError = mLastError;
714 return QgsGeometry( std::make_unique< QgsLineString >( *qgsgeometry_cast< const QgsPoint * >( d->
geometry.get() ), *qgsgeometry_cast< const QgsPoint * >( other.
constGet() ) ) );
720 result.mLastError = mLastError;
742 int &nextVertexIndex,
743 int *leftOrRightOfSegment,
744 double epsilon )
const
754 double sqrDist = d->
geometry->closestSegment(
QgsPoint( point ), segmentPt, vertexAfter, leftOrRightOfSegment, epsilon );
758 minDistPoint.
setX( segmentPt.
x() );
759 minDistPoint.
setY( segmentPt.
y() );
766 std::unique_ptr< QgsLineString > ringLine = std::make_unique< QgsLineString >( ring );
767 return addRing( ringLine.release() );
772 std::unique_ptr< QgsCurve > r( ring );
792 std::unique_ptr< QgsAbstractGeometry > partGeom;
793 if ( points.size() == 1 )
795 partGeom = std::make_unique< QgsPoint >( points[0] );
797 else if ( points.size() > 1 )
799 std::unique_ptr< QgsLineString > ringLine = std::make_unique< QgsLineString >();
800 ringLine->setPoints( points );
801 partGeom = std::move( ringLine );
803 return addPart( partGeom.release(), geomType );
808 std::unique_ptr< QgsAbstractGeometry > p( part );
813 case Qgis::GeometryType::Point:
814 reset( std::make_unique< QgsMultiPoint >() );
816 case Qgis::GeometryType::Line:
817 reset( std::make_unique< QgsMultiLineString >() );
819 case Qgis::GeometryType::Polygon:
820 reset( std::make_unique< QgsMultiPolygon >() );
852 if ( !d->
geometry ||
type() != Qgis::GeometryType::Polygon )
860 QVector<QgsGeometry> results;
861 results.reserve(
parts.count() );
868 if ( results.isEmpty() )
872 for (
const QgsGeometry &result : std::as_const( results ) )
881 newPoly->removeInteriorRings( minimumRingArea );
895 d->
geometry->transform( QTransform::fromTranslate( dx, dy ), dz, 1.0, dm );
908 QTransform t = QTransform::fromTranslate( center.
x(), center.
y() );
909 t.rotate( -rotation );
910 t.translate( -center.
x(), -center.
y() );
931 QVector<QgsGeometry > newGeoms;
941 *
this = newGeoms.takeAt( 0 );
942 newGeometries = newGeoms;
971 std::unique_ptr<QgsLineString> segmentizedLine( curve->
curveToLine() );
973 segmentizedLine->points( points );
978 if ( preserveCircular )
980 for (
int i = 0; i < newGeometries.count(); ++i )
999 std::unique_ptr< QgsAbstractGeometry > geom(
geos.reshapeGeometry( reshapeLineString, &errorCode, &mLastError ) );
1002 reset( std::move( geom ) );
1006 switch ( errorCode )
1038 std::unique_ptr< QgsAbstractGeometry > diffGeom(
geos.intersection( other.
constGet(), &mLastError ) );
1044 reset( std::move( diffGeom ) );
1058 std::unique_ptr< QgsAbstractGeometry > diffGeom(
geos.intersection( other.
constGet(), &mLastError ) );
1062 result.mLastError = mLastError;
1096 auto l_boundary = boundary.length();
1098 if ( ( points.length() == 0 ) || ( l_boundary == 3 ) )
1100 switch ( l_boundary )
1107 boundary.pop_back();
1112 boundary.pop_back();
1114 boundary.pop_back();
1131 circ_mec = __recMinimalEnclosingCircle( points, boundary );
1135 boundary.append( pxy );
1136 circ_mec = __recMinimalEnclosingCircle( points, boundary );
1160 QgsCircle circ = __recMinimalEnclosingCircle( P, R );
1181 return engine.
orthogonalize( tolerance, maxIterations, angleThreshold );
1187 return engine.
triangularWaves( wavelength, amplitude, strictWavelength );
1193 return engine.
triangularWavesRandomized( minimumWavelength, maximumWavelength, minimumAmplitude, maximumAmplitude, seed );
1199 return engine.
squareWaves( wavelength, amplitude, strictWavelength );
1205 return engine.
squareWavesRandomized( minimumWavelength, maximumWavelength, minimumAmplitude, maximumAmplitude, seed );
1211 return engine.
roundWaves( wavelength, amplitude, strictWavelength );
1217 return engine.
roundWavesRandomized( minimumWavelength, maximumWavelength, minimumAmplitude, maximumAmplitude, seed );
1223 return engine.
applyDashPattern( pattern, startRule, endRule, adjustment, patternOffset );
1232 return QgsGeometry( d->
geometry->snappedToGrid( hSpacing, vSpacing, dSpacing, mSpacing ) );
1241 return d->
geometry->removeDuplicateNodes( epsilon, useZValues );
1278 return geos.intersects( geometry.d->
geometry.get(), &mLastError );
1288 return d->
geometry->boundingBoxIntersects( rectangle );
1311 return geos.contains( &pt, &mLastError );
1323 return geos.contains( geometry.d->
geometry.get(), &mLastError );
1335 return geos.disjoint( geometry.d->
geometry.get(), &mLastError );
1346 if ( d == geometry.d )
1366 return geos.touches( geometry.d->
geometry.get(), &mLastError );
1378 return geos.overlaps( geometry.d->
geometry.get(), &mLastError );
1390 return geos.within( geometry.d->
geometry.get(), &mLastError );
1402 return geos.crosses( geometry.d->
geometry.get(), &mLastError );
1431 QVector< QgsGeometry > res;
1456 newGeom.
type() == Qgis::GeometryType::Polygon )
1463 newGeom.
type() == Qgis::GeometryType::Line )
1469 std::unique_ptr< QgsAbstractGeometry > exterior( ( *part )->clone() );
1470 if (
QgsCurve *curve = qgsgeometry_cast< QgsCurve * >( exterior.get() ) )
1474 std::unique_ptr< QgsCurvePolygon > cp = std::make_unique< QgsCurvePolygon >();
1475 cp->setExteriorRing( curve );
1477 gc->addGeometry( cp.release() );
1481 std::unique_ptr< QgsPolygon > p = std::make_unique< QgsPolygon >();
1482 p->setExteriorRing( qgsgeometry_cast< QgsLineString * >( curve ) );
1484 gc->addGeometry( p.release() );
1493 ( newGeom.
type() == Qgis::GeometryType::Line ||
1494 newGeom.
type() == Qgis::GeometryType::Polygon ) )
1497 std::unique_ptr< QgsMultiPoint > mp = std::make_unique< QgsMultiPoint >();
1499 QSet< QgsPoint > added;
1502 if ( added.contains( *vertex ) )
1504 mp->addGeometry( ( *vertex ).clone() );
1505 added.insert( *vertex );
1544 res.reserve(
parts->partCount() );
1545 for (
int i = 0; i <
parts->partCount( ); i++ )
1561 case Qgis::GeometryType::Point:
1562 return convertToPoint( destMultipart );
1564 case Qgis::GeometryType::Line:
1565 return convertToLine( destMultipart );
1567 case Qgis::GeometryType::Polygon:
1568 return convertToPolygon( destMultipart );
1635 if ( sourceMultiGeom )
1637 for (
int i = 0; i < sourceMultiGeom->
numGeometries(); ++i )
1649 reset( std::move( geom ) );
1666 if ( !multiGeom || multiGeom->
partCount() < 1 )
1669 std::unique_ptr< QgsAbstractGeometry > firstPart( multiGeom->
geometryN( 0 )->
clone() );
1670 reset( std::move( firstPart ) );
1681 std::unique_ptr<QgsGeometryCollection> resGeom;
1684 case Qgis::GeometryType::Point:
1685 resGeom = std::make_unique<QgsMultiPoint>();
1687 case Qgis::GeometryType::Line:
1688 resGeom = std::make_unique<QgsMultiLineString>();
1690 case Qgis::GeometryType::Polygon:
1691 resGeom = std::make_unique<QgsMultiPolygon>();
1704 resGeom->addGeometry( g->
clone() );
1707 set( resGeom.release() );
1718 if (
QgsPoint *pt = qgsgeometry_cast<QgsPoint *>( d->
geometry->simplifiedTypeRef() ) )
1738 std::unique_ptr< QgsLineString > segmentizedLine;
1740 if ( doSegmentation )
1748 line = segmentizedLine.get();
1752 line = qgsgeometry_cast<QgsLineString *>( d->
geometry.get() );
1760 polyLine.resize( nVertices );
1762 const double *xData = line->
xData();
1763 const double *yData = line->
yData();
1764 for (
int i = 0; i < nVertices; ++i )
1766 data->
setX( *xData++ );
1767 data->
setY( *yData++ );
1782 std::unique_ptr< QgsPolygon > segmentized;
1783 if ( doSegmentation )
1790 segmentized.reset( curvePoly->
toPolygon() );
1791 p = segmentized.get();
1795 p = qgsgeometry_cast<QgsPolygon *>( d->
geometry.get() );
1804 convertPolygon( *p, polygon );
1824 for (
int i = 0; i < nPoints; ++i )
1827 multiPoint[i].
setX( pt->
x() );
1828 multiPoint[i].setY( pt->
y() );
1841 if ( !geomCollection )
1853 mpl.reserve( nLines );
1854 for (
int i = 0; i < nLines; ++i )
1857 std::unique_ptr< QgsLineString > segmentized;
1860 const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( geomCollection->
geometryN( i ) );
1866 line = segmentized.get();
1871 polyLine.resize( nVertices );
1873 const double *xData = line->
xData();
1874 const double *yData = line->
yData();
1875 for (
int i = 0; i < nVertices; ++i )
1877 data->
setX( *xData++ );
1878 data->
setY( *yData++ );
1881 mpl.append( polyLine );
1894 if ( !geomCollection )
1900 if ( nPolygons < 1 )
1906 mp.reserve( nPolygons );
1907 for (
int i = 0; i < nPolygons; ++i )
1909 const QgsPolygon *polygon = qgsgeometry_cast<const QgsPolygon *>( geomCollection->
geometryN( i ) );
1924 convertPolygon( *polygon, poly );
1925 mp.push_back( poly );
1949 case Qgis::GeometryType::Point:
1952 case Qgis::GeometryType::Line:
1955 case Qgis::GeometryType::Polygon:
1958 case Qgis::GeometryType::Unknown:
1959 case Qgis::GeometryType::Null:
1975 return qgsgeometry_cast< const QgsPoint * >( d->
geometry.get() )->distance( *qgsgeometry_cast< const QgsPoint * >( geom.
constGet() ) );
2036 return d->
geometry->vertices_begin();
2043 return d->
geometry->vertices_end();
2073 return d->
geometry->const_parts_begin();
2080 return d->
geometry->const_parts_end();
2109 std::unique_ptr<QgsAbstractGeometry> geom( g.
buffer(
distance, segments, &mLastError ) );
2113 result.mLastError = mLastError;
2132 result.mLastError = mLastError;
2140 if ( !d->
geometry ||
type() != Qgis::GeometryType::Line )
2148 QVector<QgsGeometry> results;
2149 results.reserve(
parts.count() );
2156 if ( results.isEmpty() )
2160 for (
const QgsGeometry &result : std::as_const( results ) )
2174 std::unique_ptr< QgsAbstractGeometry > offsetGeom(
geos.offsetCurve(
distance, segments, joinStyle, miterLimit, &mLastError ) );
2178 result.mLastError = mLastError;
2182 if (
const QgsCurve *
offsetCurve = qgsgeometry_cast< const QgsCurve * >( offsetGeom.get() ) )
2185 if ( newOrientation != prevOrientation )
2188 std::unique_ptr< QgsAbstractGeometry > flipped(
offsetCurve->reversed() );
2189 offsetGeom = std::move( flipped );
2198 if ( !d->
geometry ||
type() != Qgis::GeometryType::Line )
2206 QVector<QgsGeometry> results;
2207 results.reserve(
parts.count() );
2214 if ( results.isEmpty() )
2218 for (
const QgsGeometry &result : std::as_const( results ) )
2228 std::unique_ptr< QgsAbstractGeometry > bufferGeom =
geos.singleSidedBuffer(
distance, segments, side,
2229 joinStyle, miterLimit, &mLastError );
2233 result.mLastError = mLastError;
2244 return engine.
taperedBuffer( startWidth, endWidth, segments );
2256 if ( !d->
geometry ||
type() != Qgis::GeometryType::Line )
2264 QVector<QgsGeometry> results;
2265 results.reserve(
parts.count() );
2272 if ( results.isEmpty() )
2276 for (
const QgsGeometry &result : std::as_const( results ) )
2288 std::unique_ptr< QgsLineString > newLine( line->
clone() );
2289 newLine->extend( startDistance, endDistance );
2303 std::unique_ptr< QgsAbstractGeometry > simplifiedGeom(
geos.simplify( tolerance, &mLastError ) );
2304 if ( !simplifiedGeom )
2307 result.mLastError = mLastError;
2310 return QgsGeometry( std::move( simplifiedGeom ) );
2345 c.get()->dropZValue();
2346 c.get()->dropMValue();
2354 result.mLastError = mLastError;
2369 result.mLastError = mLastError;
2391 result.mLastError = mLastError;
2406 result.mLastError = mLastError;
2414 return std::numeric_limits< double >::quiet_NaN();
2420 return geos.minimumClearance( &mLastError );
2434 result.mLastError = mLastError;
2446 std::unique_ptr< QgsAbstractGeometry > cHull(
geos.convexHull( &mLastError ) );
2450 geom.mLastError = mLastError;
2464 std::unique_ptr< QgsAbstractGeometry >
concaveHull(
geos.concaveHull( targetPercent, allowHoles, &mLastError ) );
2468 geom.mLastError = mLastError;
2484 result.mLastError = mLastError;
2497 QgsGeometry result =
geos.delaunayTriangulation( tolerance, edgesOnly );
2498 result.mLastError = mLastError;
2512 result.mLastError = mLastError;
2526 result.mLastError = mLastError;
2538 std::unique_ptr< QgsAbstractGeometry > segmentizedCopy;
2541 segmentizedCopy.reset( d->
geometry->segmentize() );
2542 geom = segmentizedCopy.get();
2547 std::unique_ptr< QgsAbstractGeometry > result(
geos.subdivide( maxNodes, &mLastError, parameters ) );
2551 geom.mLastError = mLastError;
2565 if (
type() == Qgis::GeometryType::Point )
2567 else if (
type() == Qgis::GeometryType::Polygon )
2577 for (
int part = 0; part < collection->
numGeometries(); ++part )
2579 const QgsCurve *candidate = qgsgeometry_cast< const QgsCurve * >( collection->
geometryN( part ) );
2582 const double candidateLength = candidate->
length();
2594 curve = qgsgeometry_cast< const QgsCurve * >( line.
constGet() );
2609 if (
type() != Qgis::GeometryType::Line )
2623 return geos.lineLocatePoint( *(
static_cast< QgsPoint *
>( point.d->
geometry.get() ) ), &mLastError );
2647 if ( previous == next )
2694 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.intersection( geometry.d->
geometry.get(), &mLastError, parameters ) );
2699 geom.mLastError = mLastError;
2715 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.combine( geometry.d->
geometry.get(), &mLastError, parameters ) );
2719 geom.mLastError = mLastError;
2741 result.mLastError = mLastError;
2755 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.difference( geometry.d->
geometry.get(), &mLastError, parameters ) );
2759 geom.mLastError = mLastError;
2775 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.symDifference( geometry.d->
geometry.get(), &mLastError, parameters ) );
2779 geom.mLastError = mLastError;
2789 return engine.
extrude( x, y );
2796 if (
type() != Qgis::GeometryType::Polygon )
2797 return QVector< QgsPointXY >();
2804 if (
type() != Qgis::GeometryType::Polygon )
2805 return QVector< QgsPointXY >();
2823 QVector<QgsGeometry> geometryList;
2826 return geometryList;
2833 geometryList.reserve( numGeom );
2834 for (
int i = 0; i < numGeom; ++i )
2841 geometryList.append( *
this );
2844 return geometryList;
2858 if (
const QgsGeometryCollection *collection = qgsgeometry_cast< const QgsGeometryCollection *>( part ) )
2860 if ( collection->numGeometries() > 0 )
2861 part = collection->geometryN( 0 );
2866 if (
const QgsCurve *curve = qgsgeometry_cast< const QgsCurve * >( part ) )
2867 return curve->asQPolygonF();
2868 else if (
const QgsCurvePolygon *polygon = qgsgeometry_cast< const QgsCurvePolygon * >( part ) )
2869 return polygon->exteriorRing() ? polygon->exteriorRing()->asQPolygonF() : QPolygonF();
2912 bool haveInvalidGeometry =
false;
2913 bool geomModified =
false;
2918 reset( std::move( diffGeom ) );
2919 geomModified =
true;
2922 if ( geomTypeBeforeModification !=
wkbType() )
2924 if ( haveInvalidGeometry )
2926 if ( !geomModified )
2940 std::unique_ptr< QgsAbstractGeometry > g(
geos.makeValid( method, keepCollapsed, &mLastError ) );
2943 result.mLastError = mLastError;
2965 if (
const QgsCurvePolygon *cp = qgsgeometry_cast< const QgsCurvePolygon * >( g ) )
2967 std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
2968 corrected->forceClockwise();
2969 newCollection->addGeometry( corrected.release() );
2973 newCollection->addGeometry( g->
clone() );
2982 std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
2983 corrected->forceClockwise();
3007 if (
const QgsCurvePolygon *cp = qgsgeometry_cast< const QgsCurvePolygon * >( g ) )
3009 std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
3010 corrected->forceCounterClockwise();
3011 newCollection->addGeometry( corrected.release() );
3015 newCollection->addGeometry( g->
clone() );
3024 std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
3025 corrected->forceCounterClockwise();
3051 case Qgis::GeometryValidationEngine::QgisInternal:
3055 case Qgis::GeometryValidationEngine::Geos:
3060 if ( !
geos.isValid( &error, flags & Qgis::GeometryValidityFlag::AllowSelfTouchingHoles, &errorLoc ) )
3095 return d->
geometry->isValid( mLastError, flags );
3105 return geos.isSimple( &mLastError );
3145 return geos.isEqual( g.d->
geometry.get(), &mLastError );
3153 std::unique_ptr< QgsAbstractGeometry > geom(
geos.combine( geometries, &error, parameters ) );
3155 result.mLastError = error;
3161 QVector<const QgsAbstractGeometry *> geomV2List;
3164 if ( !( g.isNull() ) )
3166 geomV2List.append( g.constGet() );
3172 result.mLastError = error;
3183 std::unique_ptr< QgsAbstractGeometry > straightGeom( d->
geometry->segmentize( tolerance, toleranceType ) );
3184 reset( std::move( straightGeom ) );
3194 return d->
geometry->hasCurvedSegments();
3205 d->
geometry->transform( ct, direction, transformZ );
3217 d->
geometry->transform( ct, zTranslate, zScale, mTranslate, mScale );
3239 std::unique_ptr< QgsAbstractGeometry > resultGeom =
geos.clip( rectangle, &mLastError );
3243 result.mLastError = mLastError;
3257static bool vertexIndexInfo(
const QgsAbstractGeometry *g,
int vertexIndex,
int &partIndex,
int &ringIndex,
int &vertex )
3259 if ( vertexIndex < 0 )
3262 if (
const QgsGeometryCollection *geomCollection = qgsgeometry_cast<const QgsGeometryCollection *>( g ) )
3265 for (
int i = 0; i < geomCollection->numGeometries(); ++i )
3271 for (
int k = 0; k < part->
ringCount(); ++k )
3274 if ( vertexIndex < numPoints )
3277 return vertexIndexInfo( part, vertexIndex, nothing, ringIndex, vertex );
3279 vertexIndex -= numPoints;
3283 else if (
const QgsCurvePolygon *curvePolygon = qgsgeometry_cast<const QgsCurvePolygon *>( g ) )
3285 const QgsCurve *ring = curvePolygon->exteriorRing();
3286 if ( vertexIndex < ring->numPoints() )
3290 vertex = vertexIndex;
3295 for (
int i = 0; i < curvePolygon->numInteriorRings(); ++i )
3297 const QgsCurve *ring = curvePolygon->interiorRing( i );
3298 if ( vertexIndex < ring->numPoints() )
3301 vertex = vertexIndex;
3308 else if (
const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( g ) )
3310 if ( vertexIndex < curve->numPoints() )
3314 vertex = vertexIndex;
3318 else if ( qgsgeometry_cast<const QgsPoint *>( g ) )
3320 if ( vertexIndex == 0 )
3339 id.type = Qgis::VertexType::Segment;
3341 bool res = vertexIndexInfo( d->
geometry.get(), nr,
id.part,
id.ring,
id.vertex );
3347 if (
const QgsGeometryCollection *geomCollection = qgsgeometry_cast<const QgsGeometryCollection *>( g ) )
3349 g = geomCollection->geometryN(
id.part );
3352 if (
const QgsCurvePolygon *curvePolygon = qgsgeometry_cast<const QgsCurvePolygon *>( g ) )
3354 g =
id.ring == 0 ? curvePolygon->exteriorRing() : curvePolygon->interiorRing(
id.ring - 1 );
3357 if (
const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( g ) )
3360 res = curve->pointAt(
id.vertex, p,
id.
type );
3374 return d->
geometry->vertexNumberFromVertexId(
id );
3389 d->
geometry->filterVertices( filter );
3429 std::unique_ptr< QgsLineString > segmentizedLine;
3431 if ( doSegmentation )
3434 line = segmentizedLine.get();
3438 line = qgsgeometry_cast<const QgsLineString *>( ring );
3446 res.resize( nVertices );
3448 const double *xData = line->
xData();
3449 const double *yData = line->
yData();
3450 for (
int i = 0; i < nVertices; ++i )
3452 data->
setX( *xData++ );
3453 data->
setY( *yData++ );
3461 output.push_back( convertRing( exterior ) );
3465 output.reserve( output.size() + interiorRingCount );
3466 for (
int n = 0; n < interiorRingCount; ++n )
3468 output.push_back( convertRing( input.
interiorRing( n ) ) );
3474 return QgsGeometry( std::make_unique< QgsPoint >( point.x(), point.y() ) );
3481 if ( polygon.isClosed() )
3483 std::unique_ptr< QgsPolygon > poly = std::make_unique< QgsPolygon >();
3484 poly->setExteriorRing( ring.release() );
3505 result.reserve( polygon.count() );
3506 for (
const QPointF &p : polygon )
3515 if ( p1.count() != p2.count() )
3518 for (
int i = 0; i < p1.count(); ++i )
3520 if ( !p1.at( i ).compare( p2.at( i ), epsilon ) )
3528 if ( p1.count() != p2.count() )
3531 for (
int i = 0; i < p1.count(); ++i )
3542 if ( p1.count() != p2.count() )
3545 for (
int i = 0; i < p1.count(); ++i )
3572 return QgsGeometry( smoothLine( *lineString, iterations, offset, minimumDistance, maxAngle ) );
3579 std::unique_ptr< QgsMultiLineString > resultMultiline = std::make_unique< QgsMultiLineString> ();
3583 resultMultiline->addGeometry( smoothLine( *( multiLine->
lineStringN( i ) ), iterations, offset, minimumDistance, maxAngle ).release() );
3585 return QgsGeometry( std::move( resultMultiline ) );
3591 return QgsGeometry( smoothPolygon( *poly, iterations, offset, minimumDistance, maxAngle ) );
3598 std::unique_ptr< QgsMultiPolygon > resultMultiPoly = std::make_unique< QgsMultiPolygon >();
3602 resultMultiPoly->addGeometry( smoothPolygon( *( multiPoly->
polygonN( i ) ), iterations, offset, minimumDistance, maxAngle ).release() );
3604 return QgsGeometry( std::move( resultMultiPoly ) );
3614 const double offset,
double squareDistThreshold,
double maxAngleRads,
3617 std::unique_ptr< QgsLineString > result = std::make_unique< QgsLineString >( line );
3619 for (
unsigned int iteration = 0; iteration < iterations; ++iteration )
3621 outputLine.resize( 0 );
3622 outputLine.reserve( 2 * ( result->numPoints() - 1 ) );
3623 bool skipFirst =
false;
3624 bool skipLast =
false;
3627 QgsPoint p1 = result->pointN( result->numPoints() - 2 );
3633 skipFirst =
angle > maxAngleRads;
3635 for (
int i = 0; i < result->numPoints() - 1; i++ )
3638 QgsPoint p2 = result->pointN( i + 1 );
3640 double angle = M_PI;
3641 if ( i == 0 && isRing )
3643 QgsPoint p3 = result->pointN( result->numPoints() - 2 );
3647 else if ( i < result->numPoints() - 2 )
3649 QgsPoint p3 = result->pointN( i + 2 );
3653 else if ( i == result->numPoints() - 2 && isRing )
3660 skipLast =
angle < M_PI - maxAngleRads ||
angle > M_PI + maxAngleRads;
3663 if ( i == 0 || i >= result->numPoints() - 2
3688 skipFirst = skipLast;
3691 if ( isRing && outputLine.at( 0 ) != outputLine.at( outputLine.count() - 1 ) )
3692 outputLine << outputLine.at( 0 );
3694 result->setPoints( outputLine );
3699std::unique_ptr<QgsLineString> QgsGeometry::smoothLine(
const QgsLineString &line,
const unsigned int iterations,
const double offset,
double minimumDistance,
double maxAngle )
const
3701 double maxAngleRads = maxAngle * M_PI / 180.0;
3702 double squareDistThreshold = minimumDistance > 0 ? minimumDistance * minimumDistance : -1;
3703 return smoothCurve( line, iterations, offset, squareDistThreshold, maxAngleRads,
false );
3706std::unique_ptr<QgsPolygon> QgsGeometry::smoothPolygon(
const QgsPolygon &polygon,
const unsigned int iterations,
const double offset,
double minimumDistance,
double maxAngle )
const
3708 double maxAngleRads = maxAngle * M_PI / 180.0;
3709 double squareDistThreshold = minimumDistance > 0 ? minimumDistance * minimumDistance : -1;
3710 std::unique_ptr< QgsPolygon > resultPoly = std::make_unique< QgsPolygon >();
3713 squareDistThreshold, maxAngleRads,
true ).release() );
3718 squareDistThreshold, maxAngleRads,
true ).release() );
3723QgsGeometry QgsGeometry::convertToPoint(
bool destMultipart )
const
3727 case Qgis::GeometryType::Point:
3731 if ( ( destMultipart && srcIsMultipart ) ||
3732 ( !destMultipart && !srcIsMultipart ) )
3737 if ( destMultipart )
3746 if ( multiPoint.count() == 1 )
3754 case Qgis::GeometryType::Line:
3757 if ( !destMultipart )
3774 if ( !line.isEmpty() )
3780 case Qgis::GeometryType::Polygon:
3783 if ( !destMultipart )
3814QgsGeometry QgsGeometry::convertToLine(
bool destMultipart )
const
3818 case Qgis::GeometryType::Point:
3824 if ( multiPoint.count() < 2 )
3827 if ( destMultipart )
3833 case Qgis::GeometryType::Line:
3837 if ( ( destMultipart && srcIsMultipart ) ||
3838 ( !destMultipart && ! srcIsMultipart ) )
3843 if ( destMultipart )
3847 if ( !line.isEmpty() )
3854 if ( multiLine.count() == 1 )
3860 case Qgis::GeometryType::Polygon:
3871 if ( destMultipart )
3876 else if ( multiLine.count() == 1 )
3887 if ( polygon.count() > 1 )
3891 if ( destMultipart )
3895 multiLine.reserve( polygon.count() );
3902 else if ( polygon.count() == 1 )
3904 if ( destMultipart )
3922QgsGeometry QgsGeometry::convertToPolygon(
bool destMultipart )
const
3926 case Qgis::GeometryType::Point:
3932 if ( multiPoint.count() < 3 )
3935 if ( multiPoint.last() != multiPoint.first() )
3936 multiPoint << multiPoint.first();
3939 if ( destMultipart )
3945 case Qgis::GeometryType::Line:
3952 for ( QgsMultiPolylineXY::iterator multiLineIt = multiLine.begin(); multiLineIt != multiLine.end(); ++multiLineIt )
3955 if ( ( *multiLineIt ).count() < 3 )
3957 if ( ( *multiLineIt ).count() == 3 && ( *multiLineIt ).first() == ( *multiLineIt ).last() )
3961 if ( ( *multiLineIt ).first() != ( *multiLineIt ).last() )
3962 *multiLineIt << ( *multiLineIt ).first();
3966 if ( !multiPolygon.isEmpty() )
3968 if ( destMultipart )
3972 else if ( multiPolygon.count() == 1 )
3985 if ( line.count() < 3 )
3987 if ( line.count() == 3 && line.first() == line.last() )
3991 if ( line.first() != line.last() )
3992 line << line.first();
3995 if ( destMultipart )
4007 case Qgis::GeometryType::Polygon:
4011 if ( ( destMultipart && srcIsMultipart ) ||
4012 ( !destMultipart && ! srcIsMultipart ) )
4017 if ( destMultipart )
4021 if ( !polygon.isEmpty() )
4027 if ( multiPolygon.count() == 1 )
4043 return new QgsGeos( geometry );
4048 out << geometry.
asWkb();
4054 QByteArray byteArray;
4056 if ( byteArray.isEmpty() )
4058 geometry.
set(
nullptr );
4062 geometry.
fromWkb( byteArray );
4079 return mHasLocation;
BufferSide
Side of line to buffer.
DashPatternSizeAdjustment
Dash pattern size adjustment options.
AngularDirection
Angular directions.
GeometryOperationResult
Success or failure of a geometry operation.
@ InvalidInputGeometryType
The input geometry (ring, part, split line, etc.) has not the correct geometry type.
@ Success
Operation succeeded.
@ AddPartNotMultiGeometry
The source geometry is not multi.
@ SplitCannotSplitPoint
Cannot split points.
@ GeometryEngineError
Geometry engine misses a method implemented or an error occurred in the geometry engine.
@ NothingHappened
Nothing happened, without any error.
@ InvalidBaseGeometry
The base geometry on which the operation is done is invalid or empty.
GeometryValidationEngine
Available engines for validating geometries.
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
JoinStyle
Join styles for buffers.
EndCapStyle
End cap styles for buffers.
DashPatternLineEndingRule
Dash pattern line ending rules.
MakeValidMethod
Algorithms to use when repairing invalid geometries.
WkbType
The WKB type describes the number of dimensions a geometry has.
@ CompoundCurve
CompoundCurve.
@ MultiPolygon
MultiPolygon.
@ MultiLineString
MultiLineString.
@ CircularString
CircularString.
@ GeometryCollection
GeometryCollection.
@ CurvePolygon
CurvePolygon.
@ MultiSurface
MultiSurface.
TransformDirection
Flags for raster layer temporal capabilities.
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.
virtual int ringCount(int part=0) const =0
Returns the number of rings of which this geometry is built.
virtual bool addZValue(double zValue=0)=0
Adds a z-dimension to the geometry, initialized to a preset value.
SegmentationToleranceType
Segmentation tolerance as maximum angle or maximum difference between approximation and circle.
virtual QgsAbstractGeometry * boundary() const =0
Returns the closure of the combinatorial boundary of the geometry (ie the topological boundary of the...
virtual bool dropMValue()=0
Drops any measure values which exist in the geometry.
bool is3D() const SIP_HOLDGIL
Returns true if the geometry is 3D and contains a z-value.
virtual int vertexCount(int part=0, int ring=0) const =0
Returns the number of vertices of which this geometry is built.
virtual QgsRectangle boundingBox() const =0
Returns the minimal bounding box for the geometry.
virtual QgsPoint vertexAt(QgsVertexId id) const =0
Returns the point corresponding to a specified vertex id.
virtual void adjacentVertices(QgsVertexId vertex, QgsVertexId &previousVertex, QgsVertexId &nextVertex) const =0
Returns the vertices adjacent to a specified vertex within a geometry.
virtual bool addMValue(double mValue=0)=0
Adds a measure to the geometry, initialized to a preset value.
virtual double length() const
Returns the planar, 2-dimensional length of the geometry.
Qgis::WkbType wkbType() const SIP_HOLDGIL
Returns the WKB type of the geometry.
virtual bool dropZValue()=0
Drops any z-dimensions which exist in the geometry.
bool isMeasure() const SIP_HOLDGIL
Returns true if the geometry contains m values.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
double radius() const SIP_HOLDGIL
Returns the radius of the circle.
static QgsCircle from2Points(const QgsPoint &pt1, const QgsPoint &pt2) SIP_HOLDGIL
Constructs a circle by 2 points on the circle.
bool contains(const QgsPoint &point, double epsilon=1E-8) const
Returns true if the circle contains the point.
static QgsCircle minimalCircleFrom3Points(const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3, double epsilon=1E-8) SIP_HOLDGIL
Constructs the smallest circle from 3 points.
QgsCircularString * toCircularString(bool oriented=false) const
Returns a circular string from the circle.
Circular string geometry type.
static QgsCircularString fromTwoPointsAndCenter(const QgsPoint &p1, const QgsPoint &p2, const QgsPoint ¢er, bool useShortestArc=true)
Creates a circular string with a single arc representing the curve from p1 to p2 with the specified c...
Compound curve geometry type.
bool toggleCircularAtVertex(QgsVertexId position)
Converts the vertex at the given position from/to circular.
Curve polygon geometry type.
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.
const QgsCurve * interiorRing(int i) const SIP_HOLDGIL
Retrieves an interior ring from the curve polygon.
const QgsCurve * exteriorRing() const SIP_HOLDGIL
Returns the curve polygon's exterior ring.
virtual void setExteriorRing(QgsCurve *ring)
Sets the exterior ring of the polygon.
virtual void addInteriorRing(QgsCurve *ring)
Adds an interior ring to the geometry (takes ownership)
int numInteriorRings() const SIP_HOLDGIL
Returns the number of interior rings contained with the curve polygon.
bool removeInteriorRing(int ringIndex)
Removes an interior ring from the polygon.
Abstract base class for curved geometry type.
virtual int numPoints() const =0
Returns the number of points in the curve.
QgsCurve * segmentize(double tolerance=M_PI_2/90, SegmentationToleranceType toleranceType=MaximumAngle) const override
Returns a geometry without curves.
virtual QgsPoint * interpolatePoint(double distance) const =0
Returns an interpolated point on the curve at the specified distance.
QgsCurve * clone() const override=0
Clones the geometry by performing a deep copy.
virtual QgsLineString * curveToLine(double tolerance=M_PI_2/90, SegmentationToleranceType toleranceType=MaximumAngle) const =0
Returns a new line string geometry corresponding to a segmentized approximation of the curve.
QgsPoint center() const SIP_HOLDGIL
Returns the center point.
virtual QgsPolygon * toPolygon(unsigned int segments=36) const
Returns a segmented polygon.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
virtual bool insertGeometry(QgsAbstractGeometry *g, int index)
Inserts a geometry before a specified index and takes ownership.
int numGeometries() const SIP_HOLDGIL
Returns the number of geometries within the collection.
virtual bool removeGeometry(int nr)
Removes a geometry from the collection.
QgsGeometryCollection * createEmptyWithSameType() const override
Creates a new geometry with the same class and same WKB type as the original and transfers ownership.
virtual bool addGeometry(QgsAbstractGeometry *g)
Adds a geometry and takes ownership. Returns true in case of success.
int partCount() const override
Returns count of parts contained in the geometry.
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
Java-style iterator for const traversal of parts of a geometry.
static Qgis::GeometryOperationResult addRing(QgsAbstractGeometry *geometry, std::unique_ptr< QgsCurve > ring)
Add an interior ring to a geometry.
static std::unique_ptr< QgsAbstractGeometry > avoidIntersections(const QgsAbstractGeometry &geom, const QList< QgsVectorLayer * > &avoidIntersectionsLayers, bool &haveInvalidGeometry, const QHash< QgsVectorLayer *, QSet< QgsFeatureId > > &ignoreFeatures=(QHash< QgsVectorLayer *, QSet< QgsFeatureId > >()))
Alters a geometry so that it avoids intersections with features from all open vector layers.
static bool deletePart(QgsAbstractGeometry *geom, int partNum)
Deletes a part from a geometry.
static bool deleteRing(QgsAbstractGeometry *geom, int ringNum, int partNum=0)
Deletes a ring from a geometry.
static Qgis::GeometryOperationResult addPart(QgsAbstractGeometry *geometry, std::unique_ptr< QgsAbstractGeometry > part)
Add a part to multi type geometry.
A geometry engine is a low-level representation of a QgsAbstractGeometry object, optimised for use wi...
EngineOperationResult
Success or failure of a geometry operation.
@ NothingHappened
Nothing happened, without any error.
@ InvalidBaseGeometry
The geometry on which the operation occurs is not valid.
@ InvalidInput
The input is not valid.
@ NodedGeometryError
Error occurred while creating a noded geometry.
@ EngineError
Error occurred in the geometry engine.
@ SplitCannotSplitPoint
Points cannot be split.
@ Success
Operation succeeded.
@ MethodNotImplemented
Method not implemented in geometry engine.
static std::unique_ptr< QgsMultiPolygon > fromMultiPolygonXY(const QgsMultiPolygonXY &multipoly)
Construct geometry from a multipolygon.
static std::unique_ptr< QgsAbstractGeometry > geomFromWkb(QgsConstWkbPtr &wkb)
Construct geometry from a WKB string.
static std::unique_ptr< QgsGeometryCollection > createCollectionOfType(Qgis::WkbType type)
Returns a new geometry collection matching a specified WKB type.
static std::unique_ptr< QgsAbstractGeometry > fromPolylineXY(const QgsPolylineXY &polyline)
Construct geometry from a polyline.
static std::unique_ptr< QgsMultiPoint > fromMultiPointXY(const QgsMultiPointXY &multipoint)
Construct geometry from a multipoint.
static std::unique_ptr< QgsAbstractGeometry > geomFromWkt(const QString &text)
Construct geometry from a WKT string.
static std::unique_ptr< QgsMultiLineString > fromMultiPolylineXY(const QgsMultiPolylineXY &multiline)
Construct geometry from a multipolyline.
static std::unique_ptr< QgsAbstractGeometry > fromPointXY(const QgsPointXY &point)
Construct geometry from a point.
static std::unique_ptr< QgsPolygon > fromPolygonXY(const QgsPolygonXY &polygon)
Construct geometry from a polygon.
static std::unique_ptr< QgsAbstractGeometry > geomFromWkbType(Qgis::WkbType t)
Returns empty geometry from wkb type.
Encapsulates parameters under which a geometry operation is performed.
Java-style iterator for traversal of parts of a geometry.
static double sqrDistance2D(const QgsPoint &pt1, const QgsPoint &pt2) SIP_HOLDGIL
Returns the squared 2D distance between two points.
static bool verticesAtDistance(const QgsAbstractGeometry &geometry, double distance, QgsVertexId &previousVertex, QgsVertexId &nextVertex)
Retrieves the vertices which are before and after the interpolated point at a specified distance alon...
static double distanceToVertex(const QgsAbstractGeometry &geom, QgsVertexId id)
Returns the distance along a geometry from its first vertex to the specified vertex.
static double averageAngle(double x1, double y1, double x2, double y2, double x3, double y3) SIP_HOLDGIL
Calculates the average angle (in radians) between the two linear segments from (x1,...
static double lineAngle(double x1, double y1, double x2, double y2) SIP_HOLDGIL
Calculates the direction of line joining two points in radians, clockwise from the north direction.
static double angleBetweenThreePoints(double x1, double y1, double x2, double y2, double x3, double y3) SIP_HOLDGIL
Calculates the angle between the lines AB and BC, where AB and BC described by points a,...
static QgsPoint closestVertex(const QgsAbstractGeometry &geom, const QgsPoint &pt, QgsVertexId &id)
Returns the closest vertex to a geometry for a specified point.
static QgsPointXY interpolatePointOnLine(double x1, double y1, double x2, double y2, double fraction) SIP_HOLDGIL
Interpolates the position of a point a fraction of the way along the line from (x1,...
static void validateGeometry(const QgsGeometry &geometry, QVector< QgsGeometry::Error > &errors, Qgis::GeometryValidationEngine method=Qgis::GeometryValidationEngine::QgisInternal)
Validate geometry and produce a list of geometry errors.
bool hasWhere() const
true if the location available from
QgsPointXY where() const
The coordinates at which the error is located and should be visualized.
QString what() const
A human readable error message containing details about the error.
A geometry is the spatial representation of a feature.
QgsGeometry() SIP_HOLDGIL
Constructor.
bool deleteRing(int ringNum, int partNum=0)
Deletes a ring in polygon or multipolygon.
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.
QgsGeometry densifyByCount(int extraNodesPerSegment) const
Returns a copy of the geometry which has been densified by adding the specified number of extra nodes...
QgsGeometry clipped(const QgsRectangle &rectangle)
Clips the geometry using the specified rectangle.
double lineLocatePoint(const QgsGeometry &point) const
Returns a distance representing the location along this linestring of the closest point on this lines...
QVector< QgsGeometry > coerceToType(Qgis::WkbType type, double defaultZ=0, double defaultM=0) const
Attempts to coerce this geometry into the specified destination type.
int makeDifferenceInPlace(const QgsGeometry &other)
Changes this geometry such that it does not intersect the other geometry.
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
void adjacentVertices(int atVertex, int &beforeVertex, int &afterVertex) const
Returns the indexes of the vertices before and after the given vertex index.
QgsMultiPolygonXY asMultiPolygon() const
Returns the contents of the geometry as a multi-polygon.
QgsGeometry difference(const QgsGeometry &geometry, const QgsGeometryParameters ¶meters=QgsGeometryParameters()) const
Returns a geometry representing the points making up this geometry that do not make up other.
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.
QgsGeometry offsetCurve(double distance, int segments, Qgis::JoinStyle joinStyle, double miterLimit) const
Returns an offset line at a given distance and side from an input line.
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,...
QgsGeometry densifyByDistance(double distance) const
Densifies the geometry by adding regularly placed extra nodes inside each segment so that the maximum...
QgsGeometry poleOfInaccessibility(double precision, double *distanceToBoundary=nullptr) const
Calculates the approximate pole of inaccessibility for a surface, which is the most distant internal ...
QgsGeometry largestEmptyCircle(double tolerance, const QgsGeometry &boundary=QgsGeometry()) const SIP_THROW(QgsNotSupportedException)
Constructs the Largest Empty Circle for a set of obstacle geometries, up to a specified tolerance.
QgsAbstractGeometry::const_part_iterator const_parts_begin() const
Returns STL-style const iterator pointing to the first part of the geometry.
QgsGeometry squareWaves(double wavelength, double amplitude, bool strictWavelength=false) const
Constructs square waves along the boundary of the geometry, with the specified wavelength and amplitu...
static QgsGeometry polygonize(const QVector< QgsGeometry > &geometries)
Creates a GeometryCollection geometry containing possible polygons formed from the constituent linewo...
QgsGeometry triangularWaves(double wavelength, double amplitude, bool strictWavelength=false) const
Constructs triangular waves along the boundary of the geometry, with the specified wavelength and amp...
bool boundingBoxIntersects(const QgsRectangle &rectangle) const
Returns true if the bounding box of this geometry intersects with a rectangle.
bool vertexIdFromVertexNr(int number, QgsVertexId &id) const
Calculates the vertex ID from a vertex number.
QgsGeometry concaveHull(double targetPercent, bool allowHoles=false) const SIP_THROW(QgsNotSupportedException)
Returns a possibly concave polygon that contains all the points in the geometry.
QgsGeometry pointOnSurface() const
Returns a point guaranteed to lie on the surface of a geometry.
bool touches(const QgsGeometry &geometry) const
Returns true if the geometry touches another geometry.
static QgsGeometry fromQPointF(QPointF point) SIP_HOLDGIL
Construct geometry from a QPointF.
void transformVertices(const std::function< QgsPoint(const QgsPoint &) > &transform)
Transforms the vertices from the geometry in place, applying the transform function to every vertex.
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
Applies a dash pattern to a geometry, returning a MultiLineString geometry which is the input geometr...
QgsGeometry roundWaves(double wavelength, double amplitude, bool strictWavelength=false) const
Constructs rounded (sine-like) waves along the boundary of the geometry, with the specified wavelengt...
QgsGeometry nearestPoint(const QgsGeometry &other) const
Returns the nearest (closest) point on this geometry to another geometry.
QgsGeometry makeDifference(const QgsGeometry &other) const
Returns the geometry formed by modifying this geometry such that it does not intersect the other geom...
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.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
QgsGeometry convertToType(Qgis::GeometryType destType, bool destMultipart=false) const
Try to convert the geometry to the requested type.
QgsGeometry combine(const QgsGeometry &geometry, const QgsGeometryParameters ¶meters=QgsGeometryParameters()) const
Returns a geometry representing all the points in this geometry and other (a union geometry operation...
bool isAxisParallelRectangle(double maximumDeviation, bool simpleRectanglesOnly=false) const
Returns true if the geometry is a polygon that is almost an axis-parallel rectangle.
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
QgsGeometry variableWidthBufferByM(int segments) const
Calculates a variable width buffer for a (multi)linestring geometry, where the width at each node is ...
static QgsGeometry fromPolylineXY(const QgsPolylineXY &polyline)
Creates a new LineString geometry from a list of QgsPointXY points.
QgsMultiPointXY asMultiPoint() const
Returns the contents of the geometry as a multi-point.
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 ...
void normalize()
Reorganizes the geometry into a normalized form (or "canonical" form).
int wkbSize(QgsAbstractGeometry::WkbFlags flags=QgsAbstractGeometry::WkbFlags()) const
Returns the length of the QByteArray returned by asWkb()
QgsGeometry minimumWidth() const SIP_THROW(QgsNotSupportedException)
Returns a linestring geometry which represents the minimum diameter of the geometry.
QgsPolygonXY asPolygon() const
Returns the contents of the geometry as a polygon.
bool disjoint(const QgsGeometry &geometry) const
Returns true if the geometry is disjoint of another geometry.
QVector< QgsGeometry > asGeometryCollection() const
Returns contents of the geometry as a list of geometries.
QgsGeometry roundWavesRandomized(double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed=0) const
Constructs randomized rounded (sine-like) waves along the boundary of the geometry,...
double distance(const QgsGeometry &geom) const
Returns the minimum distance between this geometry and another geometry.
QgsGeometry interpolate(double distance) const
Returns an interpolated point on the geometry at the specified distance.
QgsGeometry extrude(double x, double y)
Returns an extruded version of this geometry.
static Q_DECL_DEPRECATED QgsPolylineXY createPolylineFromQPolygonF(const QPolygonF &polygon)
Creates a QgsPolylineXY from a QPolygonF.
void mapToPixel(const QgsMapToPixel &mtp)
Transforms the geometry from map units to pixels in place.
Qgis::WkbType wkbType() const SIP_HOLDGIL
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
static QgsGeometry fromMultiPointXY(const QgsMultiPointXY &multipoint)
Creates a new geometry from a QgsMultiPointXY object.
QgsGeometry singleSidedBuffer(double distance, int segments, Qgis::BufferSide side, Qgis::JoinStyle joinStyle=Qgis::JoinStyle::Round, double miterLimit=2.0) const
Returns a single sided buffer for a (multi)line geometry.
QgsAbstractGeometry * get()
Returns a modifiable (non-const) reference to the underlying abstract geometry primitive.
static QgsGeometry fromRect(const QgsRectangle &rect) SIP_HOLDGIL
Creates a new geometry from a QgsRectangle.
double minimumClearance() const SIP_THROW(QgsNotSupportedException)
Computes the minimum clearance of a geometry.
double sqrDistToVertexAt(QgsPointXY &point SIP_IN, int atVertex) const
Returns the squared Cartesian distance between the given point to the given vertex index (vertex at t...
bool isMultipart() const SIP_HOLDGIL
Returns true if WKB of the geometry is of WKBMulti* type.
QgsGeometry subdivide(int maxNodes=256, const QgsGeometryParameters ¶meters=QgsGeometryParameters()) const
Subdivides the geometry.
bool contains(const QgsPointXY *p) const
Returns true if the geometry contains the point p.
QgsPolylineXY asPolyline() const
Returns the contents of the geometry as a polyline.
QgsAbstractGeometry::part_iterator parts_begin()
Returns STL-style iterator pointing to the first part of the geometry.
QgsGeometry forceRHR() const
Forces geometries to respect the Right-Hand-Rule, in which the area that is bounded by a polygon is t...
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
QgsGeometry snappedToGrid(double hSpacing, double vSpacing, double dSpacing=0, double mSpacing=0) const
Returns a new geometry with all points or vertices snapped to the closest point of the grid.
QgsGeometry minimumClearanceLine() const SIP_THROW(QgsNotSupportedException)
Returns a LineString whose endpoints define the minimum clearance of a geometry.
virtual json asJsonObject(int precision=17) const
Exports the geometry to a json object.
void filterVertices(const std::function< bool(const QgsPoint &) > &filter)
Filters the vertices from the geometry in place, removing any which do not return true for the filter...
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 Q_DECL_DEPRECATED QgsPolygonXY createPolygonFromQPolygonF(const QPolygonF &polygon)
Creates a QgsPolygonXYfrom a QPolygonF.
bool convertToSingleType()
Converts multi type geometry into single type geometry e.g.
Qgis::GeometryOperationResult addRing(const QVector< QgsPointXY > &ring)
Adds a new ring to this geometry.
QPointF asQPointF() const SIP_HOLDGIL
Returns contents of the geometry as a QPointF if wkbType is WKBPoint, otherwise returns a null QPoint...
static QgsGeometry fromPointXY(const QgsPointXY &point) SIP_HOLDGIL
Creates a new geometry from a QgsPointXY object.
bool requiresConversionToStraightSegments() const
Returns true if the geometry is a curved geometry type which requires conversion to display as straig...
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.
void validateGeometry(QVector< QgsGeometry::Error > &errors, Qgis::GeometryValidationEngine method=Qgis::GeometryValidationEngine::QgisInternal, Qgis::GeometryValidityFlags flags=Qgis::GeometryValidityFlags()) const
Validates geometry and produces a list of geometry errors.
QgsMultiPolylineXY asMultiPolyline() const
Returns the contents of the geometry as a multi-linestring.
QgsGeometry taperedBuffer(double startWidth, double endWidth, int segments) const
Calculates a variable width buffer ("tapered buffer") for a (multi)curve geometry.
bool within(const QgsGeometry &geometry) const
Returns true if the geometry is completely within another geometry.
double frechetDistanceDensify(const QgsGeometry &geom, double densifyFraction) const SIP_THROW(QgsNotSupportedException)
Returns the Fréchet distance between this geometry and geom, restricted to discrete points for both g...
void convertToStraightSegment(double tolerance=M_PI/180., QgsAbstractGeometry::SegmentationToleranceType toleranceType=QgsAbstractGeometry::MaximumAngle)
Converts the geometry to straight line segments, if it is a curved geometry type.
double area() const
Returns the planar, 2-dimensional area of the geometry.
QgsGeometry centroid() const
Returns the center of mass of a geometry.
bool crosses(const QgsGeometry &geometry) const
Returns true if the geometry crosses another geometry.
QgsGeometry & operator=(QgsGeometry const &rhs)
Creates a deep copy of the object.
QgsGeometry orthogonalize(double tolerance=1.0E-8, int maxIterations=1000, double angleThreshold=15.0) const
Attempts to orthogonalize a line or polygon geometry by shifting vertices to make the geometries angl...
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry)
Creates and returns a new geometry engine representing the specified geometry.
double hausdorffDistance(const QgsGeometry &geom) const
Returns the Hausdorff distance between this geometry and geom.
QString lastError() const SIP_HOLDGIL
Returns an error string referring to the last error encountered either when this geometry was created...
QgsGeometry makeValid(Qgis::MakeValidMethod method=Qgis::MakeValidMethod::Linework, bool keepCollapsed=false) const SIP_THROW(QgsNotSupportedException)
Attempts to make an invalid geometry valid without losing vertices.
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.
QPolygonF asQPolygonF() const SIP_HOLDGIL
Returns contents of the geometry as a QPolygonF.
QgsGeometry convertToCurves(double distanceTolerance=1e-8, double angleTolerance=1e-8) const
Attempts to convert a non-curved geometry into a curved geometry type (e.g.
QgsGeometry voronoiDiagram(const QgsGeometry &extent=QgsGeometry(), double tolerance=0.0, bool edgesOnly=false) const
Creates a Voronoi diagram for the nodes contained within the geometry.
void set(QgsAbstractGeometry *geometry)
Sets the underlying geometry store.
QgsGeometry convexHull() const
Returns the smallest convex polygon that contains all the points in the geometry.
QgsGeometry sharedPaths(const QgsGeometry &other) const
Find paths shared between the two given lineal geometries (this and other).
static QgsGeometry fromPolygonXY(const QgsPolygonXY &polygon)
Creates a new geometry from a QgsPolygonXY.
void fromWkb(unsigned char *wkb, int length)
Set the geometry, feeding in the buffer containing OGC Well-Known Binary and the buffer's length.
QgsGeometry intersection(const QgsGeometry &geometry, const QgsGeometryParameters ¶meters=QgsGeometryParameters()) const
Returns a geometry representing the points shared by this geometry and other.
QgsGeometry symDifference(const QgsGeometry &geometry, const QgsGeometryParameters ¶meters=QgsGeometryParameters()) const
Returns a geometry representing the points making up this geometry that do not make up other.
QgsGeometry minimalEnclosingCircle(QgsPointXY ¢er, double &radius, unsigned int segments=36) const
Returns the minimal enclosing circle for the geometry.
QgsGeometry mergeLines() const
Merges any connected lines in a LineString/MultiLineString geometry and converts them to single line ...
static QgsGeometry fromMultiPolygonXY(const QgsMultiPolygonXY &multipoly)
Creates a new geometry from a QgsMultiPolygonXY.
QgsGeometry buffer(double distance, int segments) const
Returns a buffer region around this geometry having the given width and with a specified number of se...
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
QgsGeometry node() const
Returns a (Multi)LineString representing the fully noded version of a collection of linestrings.
double distanceToVertex(int vertex) const
Returns the distance along this geometry from its first vertex to the specified vertex.
int vertexNrFromVertexId(QgsVertexId id) const
Returns the vertex number corresponding to a vertex id.
QgsAbstractGeometry::const_part_iterator const_parts_end() const
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry.
bool removeDuplicateNodes(double epsilon=4 *std::numeric_limits< double >::epsilon(), bool useZValues=false)
Removes duplicate nodes from the geometry, wherever removing the nodes does not result in a degenerat...
bool convertGeometryCollectionToSubclass(Qgis::GeometryType geomType)
Converts geometry collection to a the desired geometry type subclass (multi-point,...
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.
QgsGeometry forcePolygonClockwise() const
Forces geometries to respect the exterior ring is clockwise, interior rings are counter-clockwise con...
bool convertToMultiType()
Converts single type geometry into multitype geometry e.g.
QString asJson(int precision=17) const
Exports the geometry to a GeoJSON string.
static QgsGeometry createWedgeBuffer(const QgsPoint ¢er, double azimuth, double angularWidth, double outerRadius, double innerRadius=0)
Creates a wedge shaped buffer from a center point.
QByteArray asWkb(QgsAbstractGeometry::WkbFlags flags=QgsAbstractGeometry::WkbFlags()) const
Export the geometry to WKB.
QgsGeometry extendLine(double startDistance, double endDistance) const
Extends a (multi)line geometry by extrapolating out the start or end of the line by a specified dista...
static QgsGeometry unaryUnion(const QVector< QgsGeometry > &geometries, const QgsGeometryParameters ¶meters=QgsGeometryParameters())
Compute the unary union on a list of geometries.
bool convertToCurvedMultiType()
Converts a geometry into a multitype geometry of curve kind (when there is a corresponding curve type...
static void convertPointList(const QVector< QgsPointXY > &input, QgsPointSequence &output)
Upgrades a point list from QgsPointXY to QgsPoint.
QgsGeometry orientedMinimumBoundingBox() const
Returns the oriented minimum bounding box for the geometry, which is the smallest (by area) rotated r...
QgsGeometry triangularWavesRandomized(double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed=0) const
Constructs randomized triangular waves along the boundary of the geometry, with the specified wavelen...
QgsGeometry squareWavesRandomized(double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed=0) const
Constructs randomized square waves along the boundary of the geometry, with the specified wavelength ...
QgsGeometryConstPartIterator constParts() const
Returns Java-style iterator for traversal of parts of the geometry.
QgsGeometry simplify(double tolerance) const
Returns a simplified version of this geometry using a specified tolerance value.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
Qgis::GeometryOperationResult rotate(double rotation, const QgsPointXY ¢er)
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 interpolateAngle(double distance) const
Returns the angle parallel to the linestring or polygon boundary at the specified distance along the ...
double angleAtVertex(int vertex) const
Returns the bisector angle for this geometry at the specified vertex.
Qgis::GeometryOperationResult reshapeGeometry(const QgsLineString &reshapeLineString)
Replaces a part of this geometry with another line.
double closestVertexWithContext(const QgsPointXY &point, int &atVertex) const
Searches for the closest vertex in this geometry to the given point.
QgsGeometry delaunayTriangulation(double tolerance=0.0, bool edgesOnly=false) const
Returns the Delaunay triangulation for the vertices of the geometry.
void draw(QPainter &p) const
Draws the geometry onto a QPainter.
double frechetDistance(const QgsGeometry &geom) const SIP_THROW(QgsNotSupportedException)
Returns the Fréchet distance between this geometry and geom, restricted to discrete points for both g...
QgsGeometry smooth(unsigned int iterations=1, double offset=0.25, double minimumDistance=-1.0, double maxAngle=180.0) const
Smooths a geometry by rounding off corners using the Chaikin algorithm.
QgsGeometry forcePolygonCounterClockwise() const
Forces geometries to respect the exterior ring is counter-clockwise, interior rings are clockwise con...
QString asWkt(int precision=17) const
Exports the geometry to WKT.
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.
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.
double closestSegmentWithContext(const QgsPointXY &point, QgsPointXY &minDistPoint, int &nextVertexIndex, int *leftOrRightOfSegment=nullptr, double epsilon=DEFAULT_SEGMENT_EPSILON) const
Searches for the closest segment of geometry to the given point.
bool intersects(const QgsRectangle &rectangle) const
Returns true if this geometry exactly intersects with a rectangle.
QgsAbstractGeometry::vertex_iterator vertices_end() const
Returns STL-style iterator pointing to the imaginary vertex after the last vertex of the geometry.
bool deletePart(int partNum)
Deletes part identified by the part number.
QgsGeometry removeInteriorRings(double minimumAllowedArea=-1) const
Removes the interior rings from a (multi)polygon geometry.
bool overlaps(const QgsGeometry &geometry) const
Returns true if the geometry overlaps another geometry.
int avoidIntersections(const QList< QgsVectorLayer * > &avoidIntersectionsLayers, const QHash< QgsVectorLayer *, QSet< QgsFeatureId > > &ignoreFeatures=(QHash< QgsVectorLayer *, QSet< QgsFeatureId > >()))
Modifies geometry to avoid intersections with the layers specified in project properties.
QgsGeometry shortestLine(const QgsGeometry &other) const
Returns the shortest line joining this geometry to another geometry.
Does vector analysis using the geos library and handles import, export, exception handling*.
double hausdorffDistanceDensify(const QgsAbstractGeometry *geom, double densifyFraction, QString *errorMsg=nullptr) const
Returns the Hausdorff distance between this geometry and geom.
double hausdorffDistance(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const
Returns the Hausdorff distance between this geometry and geom.
QgsAbstractGeometry * buffer(double distance, int segments, QString *errorMsg=nullptr) const override
double distance(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const override
Calculates the distance between this and geom.
static QgsGeometry polygonize(const QVector< const QgsAbstractGeometry * > &geometries, QString *errorMsg=nullptr)
Creates a GeometryCollection geometry containing possible polygons formed from the constituent linewo...
double frechetDistance(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const
Returns the Fréchet distance between this geometry and geom, restricted to discrete points for both g...
double frechetDistanceDensify(const QgsAbstractGeometry *geom, double densifyFraction, QString *errorMsg=nullptr) const
Returns the Fréchet distance between this geometry and geom, restricted to discrete points for both g...
This class offers geometry processing methods.
QgsGeometry triangularWavesRandomized(double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed=0) const
Constructs randomized triangular waves along the boundary of the geometry, with the specified wavelen...
QgsGeometry triangularWaves(double wavelength, double amplitude, bool strictWavelength=false) const
Constructs triangular waves along the boundary of the geometry, with the specified wavelength and amp...
QgsGeometry roundWaves(double wavelength, double amplitude, bool strictWavelength=false) const
Constructs rounded (sine-like) waves along the boundary of the geometry, with the specified wavelengt...
QgsGeometry poleOfInaccessibility(double precision, double *distanceFromBoundary=nullptr) const
Calculates the approximate pole of inaccessibility for a surface, which is the most distant internal ...
QgsGeometry squareWaves(double wavelength, double amplitude, bool strictWavelength=false) const
Constructs square waves along the boundary of the geometry, with the specified wavelength and amplitu...
QgsGeometry variableWidthBufferByM(int segments) const
Calculates a variable width buffer using the m-values from a (multi)line geometry.
QgsGeometry extrude(double x, double y) const
Will extrude a line or (segmentized) curve by a given offset and return a polygon representation of i...
QgsGeometry roundWavesRandomized(double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed=0) const
Constructs randomized rounded (sine-like) waves along the boundary of the geometry,...
QgsGeometry orthogonalize(double tolerance=1.0E-8, int maxIterations=1000, double angleThreshold=15.0) const
Attempts to orthogonalize a line or polygon geometry by shifting vertices to make the geometries angl...
QString lastError() const
Returns an error string referring to the last error encountered.
QgsGeometry orientedMinimumBoundingBox(double &area, double &angle, double &width, double &height) const
Returns the oriented minimum bounding box for the geometry, which is the smallest (by area) rotated r...
QgsGeometry densifyByDistance(double distance) const
Densifies the geometry by adding regularly placed extra nodes inside each segment so that the maximum...
QgsGeometry taperedBuffer(double startWidth, double endWidth, int segments) const
Calculates a tapered width buffer for a (multi)curve geometry.
QgsGeometry densifyByCount(int extraNodesPerSegment) const
Densifies the geometry by adding the specified number of extra nodes within each segment of the geome...
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
Applies a dash pattern to a geometry, returning a MultiLineString geometry which is the input geometr...
static QVector< QgsPointXY > randomPointsInPolygon(const QgsGeometry &polygon, int count, const std::function< bool(const QgsPointXY &) > &acceptPoint, unsigned long seed=0, QgsFeedback *feedback=nullptr, int maxTriesPerPoint=0)
Returns a list of count random points generated inside a polygon geometry (if acceptPoint is specifie...
QgsGeometry squareWavesRandomized(double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed=0) const
Constructs randomized square waves along the boundary of the geometry, with the specified wavelength ...
QgsGeometry convertToCurves(double distanceTolerance, double angleTolerance) const
Attempts to convert a non-curved geometry into a curved geometry type (e.g.
bool isAxisParallelRectangle(double maximumDeviation, bool simpleRectanglesOnly=false) const
Returns true if the geometry is a polygon that is almost an axis-parallel rectangle.
Line string geometry type, with support for z-dimension and m-values.
const double * yData() const
Returns a const pointer to the y vertex data.
const double * xData() const
Returns a const pointer to the x vertex data.
int numPoints() const override SIP_HOLDGIL
Returns the number of points in the curve.
static QgsLineString * fromQPolygonF(const QPolygonF &polygon)
Returns a new linestring from a QPolygonF polygon input.
QgsLineString * clone() const override
Clones the geometry by performing a deep copy.
Perform transforms between map coordinates and device coordinates.
QgsPointXY transform(const QgsPointXY &p) const
Transforms a point p from map (world) coordinates to device coordinates.
Multi line string geometry collection.
QgsLineString * lineStringN(int index)
Returns the line string with the specified index.
Multi point geometry collection.
QgsPoint * pointN(int index)
Returns the point with the specified index.
Multi polygon geometry collection.
QgsPolygon * polygonN(int index)
Returns the polygon with the specified index.
A class to represent a 2D point.
void setX(double x) SIP_HOLDGIL
Sets the x value of the point.
void setY(double y) SIP_HOLDGIL
Sets the y value of the point.
QPointF toQPointF() const
Converts a point to a QPointF.
Point geometry type, with support for z-dimension and m-values.
void setX(double x) SIP_HOLDGIL
Sets the point's x-coordinate.
QgsPoint project(double distance, double azimuth, double inclination=90.0) const SIP_HOLDGIL
Returns a new point which corresponds to this point projected by a specified distance with specified ...
A rectangle specified with double values.
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
bool isNull() const
Test if the rectangle is null (all coordinates zero or after call to setMinimal()).
bool isEmpty() const
Returns true if the rectangle is empty.
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) SIP_HOLDGIL
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
static bool isMultiType(Qgis::WkbType type) SIP_HOLDGIL
Returns true if the WKB type is a multi type.
static bool hasZ(Qgis::WkbType type) SIP_HOLDGIL
Tests whether a WKB type contains the z-dimension.
static bool isCurvedType(Qgis::WkbType type) SIP_HOLDGIL
Returns true if the WKB type is a curved type or can contain curved geometries.
static Qgis::WkbType curveType(Qgis::WkbType type) SIP_HOLDGIL
Returns the curve type for a WKB type.
static Qgis::WkbType multiType(Qgis::WkbType type) SIP_HOLDGIL
Returns the multi type for a WKB type.
static bool hasM(Qgis::WkbType type) SIP_HOLDGIL
Tests whether a WKB type contains m values.
static Qgis::WkbType flatType(Qgis::WkbType type) SIP_HOLDGIL
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)
Contains geos related utilities and functions.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
#define Q_NOWARN_DEPRECATED_POP
#define Q_NOWARN_DEPRECATED_PUSH
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
QVector< QgsPoint > QgsPointSequence
Q_GLOBAL_STATIC(QReadWriteLock, sDefinitionCacheLock)
QDataStream & operator<<(QDataStream &out, const QgsGeometry &geometry)
Writes the geometry to stream out. QGIS version compatibility is not guaranteed.
std::unique_ptr< QgsLineString > smoothCurve(const QgsLineString &line, const unsigned int iterations, const double offset, double squareDistThreshold, double maxAngleRads, bool isRing)
Q_GLOBAL_STATIC_WITH_ARGS(WktCache, sWktCache,(2000)) QgsGeometry QgsGeometry
QDataStream & operator>>(QDataStream &in, QgsGeometry &geometry)
Reads a geometry from stream in into geometry. QGIS version compatibility is not guaranteed.
QCache< QString, QgsGeometry > WktCache
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.
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.
QVector< QgsPolygonXY > QgsMultiPolygonXY
A collection of QgsPolygons that share a common collection of attributes.
QgsPointSequence QgsPolyline
Polyline as represented as a vector of points.
std::unique_ptr< QgsAbstractGeometry > geometry
Utility class for identifying a unique vertex within a geometry.
bool isValid() const SIP_HOLDGIL
Returns true if the vertex id is valid.