23#include <nlohmann/json.hpp>
53#include "moc_qgsgeometry.cpp"
55using namespace Qt::StringLiterals;
62 std::unique_ptr< QgsAbstractGeometry >
geometry;
72 if ( !d->ref.deref() )
79 d->geometry.reset( geom );
90 mLastError = other.mLastError;
98 if ( !d->ref.deref() )
103 mLastError = other.mLastError;
110void QgsGeometry::detach()
115 std::unique_ptr< QgsAbstractGeometry > cGeom;
117 cGeom.reset( d->
geometry->clone() );
119 reset( std::move( cGeom ) );
122void QgsGeometry::reset( std::unique_ptr<QgsAbstractGeometry> newGeometry )
126 ( void )d->ref.deref();
127 d =
new QgsGeometryPrivate();
129 d->geometry = std::move( newGeometry );
134 return d->geometry.get();
140 return d->geometry.get();
145 if ( d->geometry.get() == geometry )
150 reset( std::unique_ptr< QgsAbstractGeometry >( geometry ) );
164 QMutexLocker lock( sWktMutex() );
165 if (
const QgsGeometry *cached = sWktCache()->
object( wkt ) )
168 sWktCache()->insert( wkt,
new QgsGeometry( result ), 1 );
199 return QgsGeometry( std::make_unique< QgsLineString >( polyline ) );
247 auto ext = std::make_unique< QgsLineString >(
248 QVector< double >() << rect.
xMinimum()
253 QVector< double >() << rect.
yMinimum()
258 auto polygon = std::make_unique< QgsPolygon >();
259 polygon->setExteriorRing( ext.release() );
270 auto polyhedralSurface = std::make_unique< QgsPolyhedralSurface >();
272 auto ext1 = std::make_unique< QgsLineString >(
273 QVector< double >() << box.
xMinimum()
278 QVector< double >() << box.
yMinimum()
283 QVector< double >() << box.
zMinimum()
288 auto polygon1 = std::make_unique< QgsPolygon >( ext1.release() );
289 polyhedralSurface->addPatch( polygon1.release() );
291 auto ext2 = std::make_unique< QgsLineString >(
292 QVector< double >() << box.
xMinimum()
297 QVector< double >() << box.
yMinimum()
302 QVector< double >() << box.
zMinimum()
307 auto polygon2 = std::make_unique< QgsPolygon >( ext2.release() );
308 polyhedralSurface->addPatch( polygon2.release() );
310 auto ext3 = std::make_unique< QgsLineString >(
311 QVector< double >() << box.
xMinimum()
316 QVector< double >() << box.
yMinimum()
321 QVector< double >() << box.
zMinimum()
326 auto polygon3 = std::make_unique< QgsPolygon >( ext3.release() );
327 polyhedralSurface->addPatch( polygon3.release() );
329 auto ext4 = std::make_unique< QgsLineString >(
330 QVector< double >() << box.
xMaximum()
335 QVector< double >() << box.
yMaximum()
340 QVector< double >() << box.
zMaximum()
345 auto polygon4 = std::make_unique< QgsPolygon >( ext4.release() );
346 polyhedralSurface->addPatch( polygon4.release() );
348 auto ext5 = std::make_unique< QgsLineString >(
349 QVector< double >() << box.
xMaximum()
354 QVector< double >() << box.
yMaximum()
359 QVector< double >() << box.
zMaximum()
364 auto polygon5 = std::make_unique< QgsPolygon >( ext5.release() );
365 polyhedralSurface->addPatch( polygon5.release() );
367 auto ext6 = std::make_unique< QgsLineString >(
368 QVector< double >() << box.
xMaximum()
373 QVector< double >() << box.
yMaximum()
378 QVector< double >() << box.
zMaximum()
383 auto polygon6 = std::make_unique< QgsPolygon >( ext6.release() );
384 polyhedralSurface->addPatch( polygon6.release() );
386 return QgsGeometry( std::move( polyhedralSurface ) );
402 if ( g.isMultipart() )
404 for (
auto p = g.const_parts_begin(); p != g.const_parts_end(); ++p )
420 auto resultTin = std::make_unique<QgsTriangulatedSurface>();
436 resultTin->addZValue( 0 );
437 if ( tin->isMeasure() )
438 resultTin->addMValue( 0 );
443 for (
int j = 0; j < tin->numPatches(); ++j )
445 if (
const QgsPolygon *patch = tin->patchN( j ) )
447 resultTin->addPatch( patch->clone() );
456 if ( triangle->is3D() )
457 resultTin->addZValue( 0 );
458 if ( triangle->isMeasure() )
459 resultTin->addMValue( 0 );
463 resultTin->addPatch( triangle->clone() );
467 if ( resultTin->numPatches() == 0 )
475 const double startAngle = azimuth - angularWidth * 0.5;
476 const double endAngle = azimuth + angularWidth * 0.5;
483 auto wedge = std::make_unique< QgsCompoundCurve >();
485 const double DEG_TO_RAD = M_PI / 180.0;
486 const double RAD_TO_DEG = 180.0 / M_PI;
488 const double angularWidth = endAngle - startAngle;
491 if ( std::abs( angularWidth ) >= 360.0 )
493 auto outerCc = std::make_unique< QgsCompoundCurve >();
498 auto cp = std::make_unique< QgsCurvePolygon >();
499 cp->setExteriorRing( outerCc.release() );
503 auto innerCc = std::make_unique< QgsCompoundCurve >();
508 cp->setInteriorRings( { innerCc.release() } );
533 auto cp = std::make_unique< QgsCurvePolygon >();
534 cp->setExteriorRing( wedge.release() );
559 return d->geometry->wkbType();
579 return d->geometry->isEmpty();
611 d->geometry->adjacentVertices(
id, prevVertex, nextVertex );
647 return d->geometry->vertexAngle( v2 );
666 d->geometry->adjacentVertices(
id, beforeVertexId, afterVertexId );
686 return d->geometry->moveVertex(
id,
QgsPoint( x, y ) );
704 return d->geometry->moveVertex(
id, p );
737 return d->geometry->deleteVertex(
id );
757 if ( owningCollection )
758 part = owningCollection->
geometryN(
id.part );
775 bool success =
false;
786 auto cpdCurve = std::make_unique<QgsCompoundCurve>();
793 if ( !owningPolygon && !owningCollection )
796 reset( std::make_unique<QgsCompoundCurve>( *cpdCurve ) );
798 else if ( owningPolygon )
811 else if ( owningCollection )
846 return d->geometry->insertVertex(
id,
QgsPoint( x, y ) );
872 return d->geometry->insertVertex(
id, point );
882 const double sqrSnappingTolerance = snappingTolerance * snappingTolerance;
883 int segmentAfterVertex;
885 const double sqrDistSegmentSnap =
closestSegmentWithContext( point, snappedPoint, segmentAfterVertex,
nullptr, segmentSearchEpsilon );
887 if ( sqrDistSegmentSnap > sqrSnappingTolerance )
890 int atVertex, beforeVertex, afterVertex;
891 double sqrDistVertexSnap;
892 closestVertex( point, atVertex, beforeVertex, afterVertex, sqrDistVertexSnap );
894 if ( sqrDistVertexSnap < sqrSnappingTolerance )
919 return d->geometry->vertexAt( vId );
939 result.mLastError = mLastError;
954 result.mLastError = mLastError;
976 int &nextVertexIndex,
977 int *leftOrRightOfSegment,
978 double epsilon )
const
988 double sqrDist = d->geometry->closestSegment(
QgsPoint( point ), segmentPt, vertexAfter, leftOrRightOfSegment, epsilon );
992 minDistPoint.
setX( segmentPt.
x() );
993 minDistPoint.
setY( segmentPt.
y() );
1000 auto ringLine = std::make_unique< QgsLineString >( ring );
1001 return addRing( ringLine.release() );
1006 std::unique_ptr< QgsCurve > r( ring );
1022 return addPart( l, geomType );
1035 std::unique_ptr< QgsAbstractGeometry > partGeom;
1036 if ( points.size() == 1 )
1038 partGeom = std::make_unique< QgsPoint >( points[0] );
1040 else if ( points.size() > 1 )
1042 auto ringLine = std::make_unique< QgsLineString >();
1043 ringLine->setPoints( points );
1044 partGeom = std::move( ringLine );
1047 return addPart( partGeom.release(), geomType );
1053 std::unique_ptr< QgsAbstractGeometry > partGeom;
1054 if ( points.size() == 1 )
1056 partGeom = std::make_unique< QgsPoint >( points[0] );
1058 else if ( points.size() > 1 )
1060 auto ringLine = std::make_unique< QgsLineString >();
1061 ringLine->setPoints( points );
1062 partGeom = std::move( ringLine );
1069 std::unique_ptr< QgsAbstractGeometry > p( part );
1075 reset( std::make_unique< QgsMultiPoint >() );
1078 reset( std::make_unique< QgsMultiLineString >() );
1081 reset( std::make_unique< QgsMultiPolygon >() );
1099 std::unique_ptr< QgsAbstractGeometry > p( part );
1106 reset( std::make_unique< QgsMultiPoint >() );
1109 reset( std::make_unique< QgsMultiLineString >() );
1113 reset( std::make_unique< QgsMultiPolygon >() );
1116 reset( std::make_unique< QgsMultiSurface >() );
1120 reset( std::make_unique< QgsMultiCurve >() );
1123 reset( std::make_unique< QgsPolyhedralSurface >() );
1126 reset( std::make_unique< QgsTriangulatedSurface >() );
1172 QVector<QgsGeometry> results;
1173 results.reserve(
parts.count() );
1176 QgsGeometry result = part.removeInteriorRings( minimumRingArea );
1180 if ( results.isEmpty() )
1184 for (
const QgsGeometry &result : std::as_const( results ) )
1192 std::unique_ptr< QgsCurvePolygon > newPoly(
static_cast< QgsCurvePolygon *
>( d->geometry->clone() ) );
1193 newPoly->removeInteriorRings( minimumRingArea );
1207 d->geometry->transform( QTransform::fromTranslate( dx, dy ), dz, 1.0, dm );
1220 QTransform t = QTransform::fromTranslate( center.
x(), center.
y() );
1221 t.rotate( -rotation );
1222 t.translate( -center.
x(), -center.
y() );
1223 d->geometry->transform( t );
1246 for (
const QgsPoint &v : splitLine )
1251 QVector<QgsGeometry > newGeoms;
1261 *
this = newGeoms.takeAt( 0 );
1262 newGeometries = newGeoms;
1291 std::unique_ptr<QgsLineString> segmentizedLine( curve->
curveToLine() );
1293 segmentizedLine->points( points );
1298 if ( preserveCircular )
1300 for (
int i = 0; i < newGeometries.count(); ++i )
1319 reshapeLineString.
points( reshapePoints );
1321 for (
const QgsPoint &v : std::as_const( reshapePoints ) )
1329 std::unique_ptr< QgsAbstractGeometry > geom(
geos.reshapeGeometry( reshapeLineString, &errorCode, &mLastError ) );
1332 reset( std::move( geom ) );
1336 switch ( errorCode )
1360 if ( !d->geometry || !other.d->
geometry )
1368 std::unique_ptr< QgsAbstractGeometry > diffGeom(
geos.intersection( other.
constGet(), &mLastError ) );
1374 reset( std::move( diffGeom ) );
1380 if ( !d->geometry || other.
isNull() )
1388 std::unique_ptr< QgsAbstractGeometry > diffGeom(
geos.intersection( other.
constGet(), &mLastError ) );
1392 result.mLastError = mLastError;
1403 return d->geometry->boundingBox();
1412 return d->geometry->boundingBox3D();
1443 double area, angle, width, height;
1449 auto l_boundary = boundary.length();
1451 if ( ( points.length() == 0 ) || ( l_boundary == 3 ) )
1453 switch ( l_boundary )
1460 boundary.pop_back();
1465 boundary.pop_back();
1467 boundary.pop_back();
1484 circ_mec = __recMinimalEnclosingCircle( points, boundary );
1488 boundary.append( pxy );
1489 circ_mec = __recMinimalEnclosingCircle( points, boundary );
1513 QgsCircle circ = __recMinimalEnclosingCircle( P, R );
1534 return engine.
orthogonalize( tolerance, maxIterations, angleThreshold );
1540 return engine.
triangularWaves( wavelength, amplitude, strictWavelength );
1546 return engine.
triangularWavesRandomized( minimumWavelength, maximumWavelength, minimumAmplitude, maximumAmplitude, seed );
1552 return engine.
squareWaves( wavelength, amplitude, strictWavelength );
1558 return engine.
squareWavesRandomized( minimumWavelength, maximumWavelength, minimumAmplitude, maximumAmplitude, seed );
1564 return engine.
roundWaves( wavelength, amplitude, strictWavelength );
1570 return engine.
roundWavesRandomized( minimumWavelength, maximumWavelength, minimumAmplitude, maximumAmplitude, seed );
1576 return engine.
applyDashPattern( pattern, startRule, endRule, adjustment, patternOffset );
1585 return QgsGeometry( d->geometry->snappedToGrid( hSpacing, vSpacing, dSpacing, mSpacing ) );
1594 return d->geometry->removeDuplicateNodes( epsilon, useZValues );
1624 if ( !d->geometry || geometry.
isNull() )
1631 return geos.intersects( geometry.d->
geometry.get(), &mLastError );
1641 return d->geometry->boundingBoxIntersects( rectangle );
1646 if ( !d->geometry || geometry.
isNull() )
1656 if ( !d->geometry || !p )
1663 return geos.contains( p->
x(), p->
y(), &mLastError );
1675 return geos.contains( x, y, &mLastError );
1680 if ( !d->geometry || geometry.
isNull() )
1687 return geos.contains( geometry.d->
geometry.get(), &mLastError );
1692 if ( !d->geometry || geometry.
isNull() )
1699 return geos.disjoint( geometry.d->
geometry.get(), &mLastError );
1704 if ( !d->geometry || geometry.
isNull() )
1710 if ( d == geometry.d )
1718 return *d->geometry == *geometry.d->
geometry;
1723 if ( !d->geometry || geometry.
isNull() )
1730 return geos.touches( geometry.d->
geometry.get(), &mLastError );
1735 if ( !d->geometry || geometry.
isNull() )
1742 return geos.overlaps( geometry.d->
geometry.get(), &mLastError );
1747 if ( !d->geometry || geometry.
isNull() )
1754 return geos.within( geometry.d->
geometry.get(), &mLastError );
1759 if ( !d->geometry || geometry.
isNull() )
1766 return geos.crosses( geometry.d->
geometry.get(), &mLastError );
1775 return d->geometry->asWkt( precision );
1780 return QString::fromStdString(
asJsonObject( precision ).dump() );
1789 return d->geometry->asJsonObject( precision );
1796 QVector< QgsGeometry > res;
1816 newGeom =
QgsGeometry( d->geometry.get()->segmentize() );
1824 bool hasNurbs =
false;
1831 for (
int i = 0; i < collection->numGeometries(); ++i )
1844 for (
int i = 0; !hasNurbs && i < cp->numInteriorRings(); ++i )
1852 for (
int i = 0; i < cc->nCurves(); ++i )
1884 std::unique_ptr< QgsAbstractGeometry > exterior( ( *part )->clone() );
1889 auto cp = std::make_unique< QgsCurvePolygon >();
1890 cp->setExteriorRing( curve );
1891 ( void )exterior.release();
1892 gc->addGeometry( cp.release() );
1896 auto p = std::make_unique< QgsPolygon >();
1898 ( void )exterior.release();
1899 gc->addGeometry( p.release() );
1912 auto mp = std::make_unique< QgsMultiPoint >();
1914 QSet< QgsPoint > added;
1917 if ( avoidDuplicates && added.contains( *vertex ) )
1919 mp->addGeometry( ( *vertex ).clone() );
1920 added.insert( *vertex );
1929 auto polySurface = std::make_unique< QgsPolyhedralSurface >();
1935 polySurface->addPatch( polygon->clone() );
1938 newGeom =
QgsGeometry( std::move( polySurface ) );
1946 auto tin = std::make_unique< QgsTriangulatedSurface >();
1952 tin->addPatch( triangle->clone() );
1957 if ( polygon->exteriorRing() )
1959 const int numPoints = polygon->exteriorRing()->numPoints();
1960 if ( numPoints != 4 )
1962 mLastError = QObject::tr(
"Cannot convert polygon with %1 vertices to a triangle. A triangle requires exactly 3 vertices." ).arg( numPoints > 0 ? numPoints - 1 : 0 );
1965 auto triangle = std::make_unique< QgsTriangle >();
1966 triangle->setExteriorRing( polygon->exteriorRing()->clone() );
1967 tin->addPatch( triangle.release() );
1979 auto multiPolygon = std::make_unique< QgsMultiPolygon >();
1982 for (
int i = 0; i < polySurface->numPatches(); ++i )
1984 const QgsPolygon *patch = polySurface->patchN( i );
1985 auto polygon = std::make_unique< QgsPolygon >();
1991 multiPolygon->addGeometry( polygon.release() );
1994 newGeom =
QgsGeometry( std::move( multiPolygon ) );
2004 if ( polygon->exteriorRing() )
2006 const int numPoints = polygon->exteriorRing()->numPoints();
2007 if ( numPoints != 4 )
2009 mLastError = QObject::tr(
"Cannot convert polygon with %1 vertices to a triangle. A triangle requires exactly 3 vertices." ).arg( numPoints > 0 ? numPoints - 1 : 0 );
2012 auto triangle = std::make_unique< QgsTriangle >();
2013 triangle->setExteriorRing( polygon->exteriorRing()->clone() );
2054 res.reserve(
parts->partCount() );
2055 for (
int i = 0; i <
parts->partCount( ); i++ )
2069 bool allExpectedType =
true;
2074 allExpectedType =
false;
2078 if ( allExpectedType )
2080 std::unique_ptr< QgsGeometryCollection > newGeomCol;
2083 newGeomCol = std::make_unique< QgsMultiPoint >();
2087 newGeomCol = std::make_unique< QgsMultiLineString >();
2091 newGeomCol = std::make_unique< QgsMultiPolygon >();
2117 return convertToPoint( destMultipart );
2120 return convertToLine( destMultipart );
2123 return convertToPolygon( destMultipart );
2158 d->geometry = std::move( geom );
2190 if ( sourceMultiGeom )
2192 for (
int i = 0; i < sourceMultiGeom->
numGeometries(); ++i )
2200 if ( !multiGeom->
addGeometry( d->geometry->clone() ) )
2204 reset( std::move( geom ) );
2221 if ( !multiGeom || multiGeom->
partCount() < 1 )
2224 std::unique_ptr< QgsAbstractGeometry > firstPart( multiGeom->
geometryN( 0 )->
clone() );
2225 reset( std::move( firstPart ) );
2236 std::unique_ptr<QgsGeometryCollection> resGeom;
2240 resGeom = std::make_unique<QgsMultiPoint>();
2243 resGeom = std::make_unique<QgsMultiLineString>();
2246 resGeom = std::make_unique<QgsMultiPolygon>();
2259 resGeom->addGeometry( g->
clone() );
2262 set( resGeom.release() );
2293 std::unique_ptr< QgsLineString > segmentizedLine;
2295 if ( doSegmentation )
2303 line = segmentizedLine.get();
2315 polyLine.resize( nVertices );
2317 const double *xData = line->
xData();
2318 const double *yData = line->
yData();
2319 for (
int i = 0; i < nVertices; ++i )
2321 data->
setX( *xData++ );
2322 data->
setY( *yData++ );
2337 std::unique_ptr< QgsPolygon > segmentized;
2338 if ( doSegmentation )
2345 segmentized.reset( curvePoly->
toPolygon() );
2346 p = segmentized.get();
2359 convertPolygon( *p, polygon );
2379 for (
int i = 0; i < nPoints; ++i )
2382 multiPoint[i].setX( pt->
x() );
2383 multiPoint[i].setY( pt->
y() );
2396 if ( !geomCollection )
2408 mpl.reserve( nLines );
2409 for (
int i = 0; i < nLines; ++i )
2412 std::unique_ptr< QgsLineString > segmentized;
2421 line = segmentized.get();
2426 polyLine.resize( nVertices );
2428 const double *xData = line->
xData();
2429 const double *yData = line->
yData();
2430 for (
int i = 0; i < nVertices; ++i )
2432 data->
setX( *xData++ );
2433 data->
setY( *yData++ );
2436 mpl.append( polyLine );
2449 if ( !geomCollection )
2455 if ( nPolygons < 1 )
2461 mp.reserve( nPolygons );
2462 for (
int i = 0; i < nPolygons; ++i )
2479 convertPolygon( *polygon, poly );
2480 mp.push_back( poly );
2492 return d->geometry->area();
2502 return d->geometry->area3D();
2518 return d->geometry->length();
2521 return d->geometry->perimeter();
2525 return d->geometry->length();
2532 if ( !d->geometry || !geom.d->
geometry )
2543 QgsGeos g( d->geometry.get() );
2550 if ( !d->geometry || !geom.d->
geometry )
2555 QgsGeos g( d->geometry.get() );
2562 if ( !d->geometry || !geom.d->
geometry )
2567 QgsGeos g( d->geometry.get() );
2575 if ( !d->geometry || !geom.d->
geometry )
2580 QgsGeos g( d->geometry.get() );
2587 if ( !d->geometry || !geom.d->
geometry )
2592 QgsGeos g( d->geometry.get() );
2599 if ( !d->geometry || d->geometry.get()->isEmpty() )
2601 return d->geometry->vertices_begin();
2606 if ( !d->geometry || d->geometry.get()->isEmpty() )
2608 return d->geometry->vertices_end();
2613 if ( !d->geometry || d->geometry.get()->isEmpty() )
2624 return d->geometry->parts_begin();
2631 return d->geometry->parts_end();
2638 return d->geometry->const_parts_begin();
2645 return d->geometry->const_parts_end();
2672 QgsGeos g( d->geometry.get() );
2674 std::unique_ptr<QgsAbstractGeometry> geom( g.
buffer(
distance, segments, &mLastError ) );
2678 result.mLastError = mLastError;
2691 QgsGeos g( d->geometry.get() );
2697 result.mLastError = mLastError;
2713 QVector<QgsGeometry> results;
2714 results.reserve(
parts.count() );
2721 if ( results.isEmpty() )
2725 for (
const QgsGeometry &result : std::as_const( results ) )
2739 std::unique_ptr< QgsAbstractGeometry > offsetGeom(
geos.offsetCurve(
distance, segments, joinStyle, miterLimit, &mLastError ) );
2743 result.mLastError = mLastError;
2750 if ( newOrientation != prevOrientation )
2753 std::unique_ptr< QgsAbstractGeometry > flipped(
offsetCurve->reversed() );
2754 offsetGeom = std::move( flipped );
2771 QVector<QgsGeometry> results;
2772 results.reserve(
parts.count() );
2775 QgsGeometry result = part.singleSidedBuffer(
distance, segments, side, joinStyle, miterLimit );
2779 if ( results.isEmpty() )
2783 for (
const QgsGeometry &result : std::as_const( results ) )
2793 std::unique_ptr< QgsAbstractGeometry > bufferGeom =
geos.singleSidedBuffer(
distance, segments, side,
2794 joinStyle, miterLimit, &mLastError );
2798 result.mLastError = mLastError;
2809 return engine.
taperedBuffer( startWidth, endWidth, segments );
2829 QVector<QgsGeometry> results;
2830 results.reserve(
parts.count() );
2833 QgsGeometry result = part.extendLine( startDistance, endDistance );
2837 if ( results.isEmpty() )
2841 for (
const QgsGeometry &result : std::as_const( results ) )
2853 std::unique_ptr< QgsLineString > newLine( line->
clone() );
2854 newLine->extend( startDistance, endDistance );
2868 std::unique_ptr< QgsAbstractGeometry > simplifiedGeom(
geos.simplify( tolerance, &mLastError ) );
2869 if ( !simplifiedGeom )
2872 result.mLastError = mLastError;
2875 return QgsGeometry( std::move( simplifiedGeom ) );
2910 c.get()->dropZValue();
2911 c.get()->dropMValue();
2919 result.mLastError = mLastError;
2934 result.mLastError = mLastError;
2956 result.mLastError = mLastError;
2971 result.mLastError = mLastError;
2979 return std::numeric_limits< double >::quiet_NaN();
2985 return geos.minimumClearance( &mLastError );
2999 result.mLastError = mLastError;
3011 std::unique_ptr< QgsAbstractGeometry > cHull(
geos.convexHull( &mLastError ) );
3015 geom.mLastError = mLastError;
3029 std::unique_ptr< QgsAbstractGeometry >
concaveHull(
geos.concaveHull( targetPercent, allowHoles, &mLastError ) );
3033 geom.mLastError = mLastError;
3049 result.mLastError = mLastError;
3063 result.mLastError = mLastError;
3077 result.mLastError = mLastError;
3096 result.mLastError = mLastError;
3109 std::unique_ptr< QgsAbstractGeometry > invalidEdgesGeom;
3113 if ( invalidEdges && invalidEdgesGeom )
3114 *invalidEdges =
QgsGeometry( std::move( invalidEdgesGeom ) );
3128 QgsGeometry result(
geos.simplifyCoverageVW( tolerance, preserveBoundary, &mLastError ) );
3129 result.mLastError = mLastError;
3143 result.mLastError = mLastError;
3157 result.mLastError = mLastError;
3169 std::unique_ptr< QgsAbstractGeometry > segmentizedCopy;
3172 segmentizedCopy.reset( d->geometry->segmentize() );
3173 geom = segmentizedCopy.get();
3178 std::unique_ptr< QgsAbstractGeometry > result(
geos.subdivide( maxNodes, &mLastError, parameters ) );
3182 geom.mLastError = mLastError;
3207 for (
int part = 0; part < collection->numGeometries(); ++part )
3212 const double candidateLength = candidate->
length();
3253 return geos.lineLocatePoint( *(
static_cast< QgsPoint *
>( point.d->
geometry.get() ) ), &mLastError );
3258 if ( !d->geometry || d->geometry->isEmpty() )
3277 if ( previous == next )
3316 if ( !d->geometry || geometry.
isNull() )
3324 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.intersection( geometry.d->
geometry.get(), &mLastError, parameters ) );
3329 geom.mLastError = mLastError;
3338 if ( !d->geometry || geometry.
isNull() )
3345 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.combine( geometry.d->
geometry.get(), &mLastError, parameters ) );
3349 geom.mLastError = mLastError;
3371 result.mLastError = mLastError;
3377 if ( !d->geometry || geometry.
isNull() )
3385 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.difference( geometry.d->
geometry.get(), &mLastError, parameters ) );
3389 geom.mLastError = mLastError;
3397 if ( !d->geometry || geometry.
isNull() )
3405 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.symDifference( geometry.d->
geometry.get(), &mLastError, parameters ) );
3409 geom.mLastError = mLastError;
3419 return engine.
extrude( x, y );
3427 return QVector< QgsPointXY >();
3430 const QVector<QgsPointXY> res = engine.randomPointsInPolygon( count, acceptPoint, seed, feedback, maxTriesPerPoint );
3431 mLastError = engine.lastError();
3438 return QVector< QgsPointXY >();
3441 const QVector<QgsPointXY> res = engine.randomPointsInPolygon( count, [](
const QgsPointXY & ) {
return true; }, seed, feedback, 0 );
3442 mLastError = engine.lastError();
3449 return d->geometry ? d->geometry->wkbSize( flags ) : 0;
3454 return d->geometry ? d->geometry->asWkb( flags ) : QByteArray();
3459 QVector<QgsGeometry> geometryList;
3462 return geometryList;
3469 geometryList.reserve( numGeom );
3470 for (
int i = 0; i < numGeom; ++i )
3477 geometryList.append( *
this );
3480 return geometryList;
3496 if ( collection->numGeometries() > 0 )
3497 part = collection->geometryN( 0 );
3503 return curve->asQPolygonF();
3505 return polygon->exteriorRing() ? polygon->exteriorRing()->asQPolygonF() : QPolygonF();
3548 bool haveInvalidGeometry =
false;
3549 bool geomModified =
false;
3554 reset( std::move( diffGeom ) );
3555 geomModified =
true;
3558 if ( geomTypeBeforeModification !=
wkbType() )
3560 if ( haveInvalidGeometry )
3562 if ( !geomModified )
3607 std::unique_ptr< QgsAbstractGeometry > g(
geos.makeValid( method, keepCollapsed, &mLastError ) );
3610 result.mLastError = mLastError;
3662 std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
3663 corrected->forceClockwise();
3664 newCollection->addGeometry( corrected.release() );
3668 newCollection->addGeometry( g->
clone() );
3677 std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
3678 corrected->forceClockwise();
3704 std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
3705 corrected->forceCounterClockwise();
3706 newCollection->addGeometry( corrected.release() );
3710 newCollection->addGeometry( g->
clone() );
3719 std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
3720 corrected->forceCounterClockwise();
3780 d->geometry->normalize();
3790 return d->geometry->isValid( mLastError, flags );
3800 return geos.isSimple( &mLastError );
3814 if ( !d->geometry || !g.d->
geometry )
3835 if ( d->geometry->boundingBox() != g.d->
geometry->boundingBox() )
3840 return geos.isEqual( g.d->
geometry.get(), &mLastError );
3848 std::unique_ptr< QgsAbstractGeometry > geom(
geos.combine( geometries, &error, parameters ) );
3850 result.mLastError = error;
3856 QVector<const QgsAbstractGeometry *> geomV2List;
3859 if ( !( g.isNull() ) )
3861 geomV2List.append( g.constGet() );
3867 result.mLastError = error;
3878 std::unique_ptr< QgsAbstractGeometry > straightGeom( d->geometry->segmentize( tolerance, toleranceType ) );
3879 reset( std::move( straightGeom ) );
3889 return d->geometry->hasCurvedSegments();
3900 d->geometry->transform( ct, direction, transformZ );
3912 d->geometry->transform( ct, zTranslate, zScale, mTranslate, mScale );
3921 d->geometry->transform( mtp.
transform() );
3927 if ( !d->geometry || rectangle.
isNull() || rectangle.
isEmpty() )
3934 std::unique_ptr< QgsAbstractGeometry > resultGeom =
geos.clip( rectangle, &mLastError );
3938 result.mLastError = mLastError;
3948 d->geometry->draw( p );
3952static bool vertexIndexInfo(
const QgsAbstractGeometry *g,
int vertexIndex,
int &partIndex,
int &ringIndex,
int &vertex )
3954 if ( vertexIndex < 0 )
3960 for (
int i = 0; i < geomCollection->numGeometries(); ++i )
3966 for (
int k = 0; k < part->
ringCount(); ++k )
3969 if ( vertexIndex < numPoints )
3972 return vertexIndexInfo( part, vertexIndex, nothing, ringIndex, vertex );
3974 vertexIndex -= numPoints;
3982 for (
int i = 0; i < polySurface->numPatches(); ++i )
3984 const QgsPolygon *patch = polySurface->patchN( i );
3987 for (
int k = 0; k < patch->
ringCount(); ++k )
3990 if ( vertexIndex < numPoints )
3993 return vertexIndexInfo( patch, vertexIndex, nothing, ringIndex, vertex );
3995 vertexIndex -= numPoints;
4001 const QgsCurve *ring = curvePolygon->exteriorRing();
4002 if ( vertexIndex < ring->numPoints() )
4006 vertex = vertexIndex;
4011 for (
int i = 0; i < curvePolygon->numInteriorRings(); ++i )
4013 const QgsCurve *ring = curvePolygon->interiorRing( i );
4014 if ( vertexIndex < ring->numPoints() )
4017 vertex = vertexIndex;
4026 if ( vertexIndex < curve->numPoints() )
4030 vertex = vertexIndex;
4036 if ( vertexIndex == 0 )
4057 bool res = vertexIndexInfo( d->geometry.get(), nr,
id.part,
id.ring,
id.vertex );
4065 g = geomCollection->geometryN(
id.part );
4069 g = polySurface->patchN(
id.part );
4074 g =
id.ring == 0 ? curvePolygon->exteriorRing() : curvePolygon->interiorRing(
id.ring - 1 );
4080 res = curve->pointAt(
id.vertex, p,
id.
type );
4109 d->geometry->filterVertices( filter );
4119 d->geometry->transformVertices(
transform );
4149 std::unique_ptr< QgsLineString > segmentizedLine;
4151 if ( doSegmentation )
4154 line = segmentizedLine.get();
4166 res.resize( nVertices );
4167 QgsPointXY *data = res.data();
4168 const double *xData = line->
xData();
4169 const double *yData = line->
yData();
4170 for (
int i = 0; i < nVertices; ++i )
4172 data->
setX( *xData++ );
4173 data->
setY( *yData++ );
4181 output.push_back( convertRing( exterior ) );
4185 output.reserve( output.size() + interiorRingCount );
4186 for (
int n = 0; n < interiorRingCount; ++n )
4188 output.push_back( convertRing( input.
interiorRing( n ) ) );
4194 return QgsGeometry( std::make_unique< QgsPoint >( point.x(), point.y() ) );
4201 if ( polygon.isClosed() )
4203 auto poly = std::make_unique< QgsPolygon >();
4204 poly->setExteriorRing( ring.release() );
4225 result.reserve( polygon.count() );
4226 for (
const QPointF &p : polygon )
4235 if ( p1.count() != p2.count() )
4238 for (
int i = 0; i < p1.count(); ++i )
4240 if ( !p1.at( i ).compare( p2.at( i ), epsilon ) )
4248 if ( p1.count() != p2.count() )
4251 for (
int i = 0; i < p1.count(); ++i )
4262 if ( p1.count() != p2.count() )
4265 for (
int i = 0; i < p1.count(); ++i )
4275 if ( !d->geometry || d->geometry->isEmpty() )
4292 return QgsGeometry( smoothLine( *lineString, iterations, offset, minimumDistance, maxAngle ) );
4299 auto resultMultiline = std::make_unique< QgsMultiLineString> ();
4300 resultMultiline->reserve( inputMultiLine->
numGeometries() );
4303 resultMultiline->addGeometry( smoothLine( *( inputMultiLine->
lineStringN( i ) ), iterations, offset, minimumDistance, maxAngle ).release() );
4305 return QgsGeometry( std::move( resultMultiline ) );
4311 return QgsGeometry( smoothPolygon( *poly, iterations, offset, minimumDistance, maxAngle ) );
4318 auto resultMultiPoly = std::make_unique< QgsMultiPolygon >();
4319 resultMultiPoly->reserve( inputMultiPoly->
numGeometries() );
4322 resultMultiPoly->addGeometry( smoothPolygon( *( inputMultiPoly->
polygonN( i ) ), iterations, offset, minimumDistance, maxAngle ).release() );
4324 return QgsGeometry( std::move( resultMultiPoly ) );
4334 const double offset,
double squareDistThreshold,
double maxAngleRads,
4337 auto result = std::make_unique< QgsLineString >( line );
4339 for (
unsigned int iteration = 0; iteration < iterations; ++iteration )
4341 outputLine.resize( 0 );
4342 outputLine.reserve( 2 * ( result->numPoints() - 1 ) );
4343 bool skipFirst =
false;
4344 bool skipLast =
false;
4347 QgsPoint p1 = result->pointN( result->numPoints() - 2 );
4352 angle = std::fabs( M_PI - angle );
4353 skipFirst = angle > maxAngleRads;
4355 for (
int i = 0; i < result->numPoints() - 1; i++ )
4358 QgsPoint p2 = result->pointN( i + 1 );
4360 double angle = M_PI;
4361 if ( i == 0 && isRing )
4363 QgsPoint p3 = result->pointN( result->numPoints() - 2 );
4367 else if ( i < result->numPoints() - 2 )
4369 QgsPoint p3 = result->pointN( i + 2 );
4373 else if ( i == result->numPoints() - 2 && isRing )
4380 skipLast = angle < M_PI - maxAngleRads || angle > M_PI + maxAngleRads;
4383 if ( i == 0 || i >= result->numPoints() - 2
4408 skipFirst = skipLast;
4411 if ( isRing && outputLine.at( 0 ) != outputLine.at( outputLine.count() - 1 ) )
4412 outputLine << outputLine.at( 0 );
4414 result->setPoints( outputLine );
4419std::unique_ptr<QgsLineString> QgsGeometry::smoothLine(
const QgsLineString &line,
const unsigned int iterations,
const double offset,
double minimumDistance,
double maxAngle )
const
4421 double maxAngleRads = maxAngle * M_PI / 180.0;
4422 double squareDistThreshold = minimumDistance > 0 ? minimumDistance * minimumDistance : -1;
4423 return smoothCurve( line, iterations, offset, squareDistThreshold, maxAngleRads,
false );
4426std::unique_ptr<QgsPolygon> QgsGeometry::smoothPolygon(
const QgsPolygon &polygon,
const unsigned int iterations,
const double offset,
double minimumDistance,
double maxAngle )
const
4428 double maxAngleRads = maxAngle * M_PI / 180.0;
4429 double squareDistThreshold = minimumDistance > 0 ? minimumDistance * minimumDistance : -1;
4430 auto resultPoly = std::make_unique< QgsPolygon >();
4432 resultPoly->setExteriorRing(
smoothCurve( *(
static_cast< const QgsLineString *
>( polygon.
exteriorRing() ) ), iterations, offset,
4433 squareDistThreshold, maxAngleRads,
true ).release() );
4437 resultPoly->addInteriorRing(
smoothCurve( *(
static_cast< const QgsLineString *
>( polygon.
interiorRing( i ) ) ), iterations, offset,
4438 squareDistThreshold, maxAngleRads,
true ).release() );
4443QgsGeometry QgsGeometry::convertToPoint(
bool destMultipart )
const
4451 if ( ( destMultipart && srcIsMultipart ) ||
4452 ( !destMultipart && !srcIsMultipart ) )
4457 if ( destMultipart )
4466 if ( multiPoint.count() == 1 )
4477 if ( !destMultipart )
4486 for (
const QgsPointXY &p : l )
4494 if ( !line.isEmpty() )
4503 if ( !destMultipart )
4513 for (
const QgsPointXY &pt : line )
4523 for (
const QgsPointXY &pt : line )
4534QgsGeometry QgsGeometry::convertToLine(
bool destMultipart )
const
4544 if ( multiPoint.count() < 2 )
4547 if ( destMultipart )
4557 if ( ( destMultipart && srcIsMultipart ) ||
4558 ( !destMultipart && ! srcIsMultipart ) )
4563 if ( destMultipart )
4567 if ( !line.isEmpty() )
4574 if ( inputMultiLine.count() == 1 )
4589 inputMultiLine << line;
4591 if ( destMultipart )
4596 else if ( inputMultiLine.count() == 1 )
4607 if ( polygon.count() > 1 )
4611 if ( destMultipart )
4615 inputMultiLine.reserve( polygon.count() );
4617 inputMultiLine << line;
4622 else if ( polygon.count() == 1 )
4624 if ( destMultipart )
4642QgsGeometry QgsGeometry::convertToPolygon(
bool destMultipart )
const
4652 if ( multiPoint.count() < 3 )
4655 if ( multiPoint.last() != multiPoint.first() )
4656 multiPoint << multiPoint.first();
4659 if ( destMultipart )
4672 for ( QgsMultiPolylineXY::iterator multiLineIt = inputMultiLine.begin(); multiLineIt != inputMultiLine.end(); ++multiLineIt )
4675 if ( ( *multiLineIt ).count() < 3 )
4677 if ( ( *multiLineIt ).count() == 3 && ( *multiLineIt ).first() == ( *multiLineIt ).last() )
4681 if ( ( *multiLineIt ).first() != ( *multiLineIt ).last() )
4682 *multiLineIt << ( *multiLineIt ).first();
4686 if ( !multiPolygon.isEmpty() )
4688 if ( destMultipart )
4692 else if ( multiPolygon.count() == 1 )
4705 if ( line.count() < 3 )
4707 if ( line.count() == 3 && line.first() == line.last() )
4711 if ( line.first() != line.last() )
4712 line << line.first();
4715 if ( destMultipart )
4731 if ( ( destMultipart && srcIsMultipart ) ||
4732 ( !destMultipart && ! srcIsMultipart ) )
4737 if ( destMultipart )
4741 if ( !polygon.isEmpty() )
4747 if ( multiPolygon.count() == 1 )
4763 return new QgsGeos( geometry, precision, flags );
4768 out << geometry.
asWkb();
4774 QByteArray byteArray;
4776 if ( byteArray.isEmpty() )
4778 geometry.
set(
nullptr );
4782 geometry.
fromWkb( byteArray );
4799 return mHasLocation;
4807 mLastError = u
"Operation '%1' needs non-null geometry."_s.arg(
qgsEnumValueToKey( op ) );
4813 int modifiedPart = -1;
4814 int modifiedRing = -1;
4818 mLastError = u
"Invalid vertex index"_s;
4821 int resolvedVertexIndex = vertexId.
vertex;
4822 QgsMultiLineString *inputMultiLine =
nullptr;
4823 QgsMultiPolygon *inputMultiPoly =
nullptr;
4830 modifiedPart = vertexId.
part;
4833 curve =
dynamic_cast<QgsCurve *
>( inputMultiLine->
lineStringN( modifiedPart ) );
4837 curve =
dynamic_cast<QgsCurve *
>( d->geometry.get() );
4842 QgsPolygon *poly =
nullptr;
4845 modifiedPart = vertexId.
part;
4848 poly = inputMultiPoly->
polygonN( modifiedPart );
4856 mLastError = u
"Could not get polygon geometry."_s;
4861 modifiedRing = vertexId.
ring;
4862 if ( modifiedRing == 0 )
4872 mLastError = u
"Operation '%1' needs curve geometry."_s.arg(
qgsEnumValueToKey( op ) );
4876 std::unique_ptr<QgsAbstractGeometry> result;
4884 catch ( QgsInvalidArgumentException &e )
4886 mLastError = u
"%1 Requested vertex: %2 was resolved as: [part: %3, ring: %4, vertex: %5]"_s
4889 .arg( modifiedPart )
4890 .arg( modifiedRing )
4891 .arg( resolvedVertexIndex );
4897 mLastError = u
"Operation '%1' generates a null geometry."_s.arg(
qgsEnumValueToKey( op ) );
4901 if ( result->isEmpty() )
4905 auto updatePolygon = [](
const QgsPolygon * inputPoly, QgsAbstractGeometry * result,
int modifiedRing ) -> std::unique_ptr<QgsPolygon>
4907 auto newPoly = std::make_unique<QgsPolygon>();
4908 for (
int ringIndex = 0; ringIndex < inputPoly->
numInteriorRings() + 1; ++ringIndex )
4910 if ( ringIndex == modifiedRing )
4912 for ( QgsAbstractGeometry::part_iterator resPartIte = result->parts_begin(); resPartIte != result->parts_end(); ++resPartIte )
4914 if ( ringIndex == 0 && resPartIte == result->parts_begin() )
4922 if ( ringIndex == 0 )
4931 std::unique_ptr<QgsAbstractGeometry> finalGeom;
4934 if ( modifiedPart >= 0 )
4936 auto newMultiLine = std::make_unique<QgsMultiLineString>();
4938 for ( QgsMultiLineString::part_iterator partIte = inputMultiLine->
parts_begin(); partIte != inputMultiLine->
parts_end(); ++partIte )
4940 if ( partIndex == modifiedPart )
4942 for ( QgsAbstractGeometry::part_iterator resPartIte = result->parts_begin(); resPartIte != result->parts_end(); ++resPartIte )
4944 newMultiLine->addGeometry( ( *resPartIte )->clone() );
4949 newMultiLine->addGeometry( ( *partIte )->clone() );
4953 finalGeom = std::move( newMultiLine );
4958 finalGeom = std::move( result );
4964 if ( modifiedPart >= 0 )
4966 auto newMultiPoly = std::make_unique<QgsMultiPolygon>();
4968 for ( QgsAbstractGeometry::part_iterator partIte = inputMultiPoly->
parts_begin(); partIte != inputMultiPoly->
parts_end(); ++partIte )
4970 if ( partIndex == modifiedPart )
4973 newMultiPoly->addGeometry( newPoly.release() );
4977 newMultiPoly->addGeometry( ( *partIte )->clone() );
4981 finalGeom.reset(
dynamic_cast<QgsAbstractGeometry *
>( newMultiPoly.release() ) );
4986 finalGeom = std::move( newPoly );
4990 QgsGeometry finalResult( std::move( finalGeom ) );
4992 QgsDebugMsgLevel( u
"Final result Wkt: %1"_s.arg( finalResult.asWkt( 2 ) ), 3 );
5011 segment1Start, segment1End, segment2Start, segment2End, distance1, distance2
5025 segment1Start, segment1End, segment2Start, segment2End, radius, segments
@ AllowSelfTouchingHoles
Indicates that self-touching holes are permitted. OGC validity states that self-touching holes are NO...
BufferSide
Side of line to buffer.
DashPatternSizeAdjustment
Dash pattern size adjustment options.
AngularDirection
Angular directions.
@ NoOrientation
Unknown orientation or sentinel value.
GeometryOperationResult
Success or failure of a geometry operation.
@ AddPartSelectedGeometryNotFound
The selected geometry cannot be found.
@ InvalidInputGeometryType
The input geometry (ring, part, split line, etc.) has not the correct geometry type.
@ Success
Operation succeeded.
@ SelectionIsEmpty
No features were selected.
@ GeometryTypeHasChanged
Operation has changed geometry type.
@ AddRingNotInExistingFeature
The input ring doesn't have any existing ring to fit into.
@ AddRingCrossesExistingRings
The input ring crosses existing rings (it is not disjoint).
@ AddPartNotMultiGeometry
The source geometry is not multi.
@ AddRingNotClosed
The input ring is not closed.
@ SelectionIsGreaterThanOne
More than one features were selected.
@ 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.
@ LayerNotEditable
Cannot edit layer.
@ AddRingNotValid
The input ring is not valid.
QFlags< GeometryValidityFlag > GeometryValidityFlags
Geometry validity flags.
@ Segment
The actual start or end point of a segment.
GeometryValidationEngine
Available engines for validating geometries.
@ QgisInternal
Use internal QgsGeometryValidator method.
@ Geos
Use GEOS validation methods.
QFlags< GeosCreationFlag > GeosCreationFlags
Geos geometry creation behavior flags.
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.
CoverageValidityResult
Coverage validity results.
@ Error
An exception occurred while determining validity.
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.
@ PolyhedralSurface
PolyhedralSurface.
@ MultiSurface
MultiSurface.
TransformDirection
Indicates the direction (forward or inverse) of a transform.
The part_iterator class provides an STL-style iterator for const references to geometry parts.
The part_iterator class provides an STL-style iterator for geometry parts.
The vertex_iterator class provides an STL-style iterator for vertices.
Abstract base class for all geometries.
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 int vertexNumberFromVertexId(QgsVertexId id) const =0
Returns the vertex number corresponding to a vertex id.
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.
virtual const QgsAbstractGeometry * simplifiedTypeRef() const
Returns a reference to the simplest lossless representation of this geometry, e.g.
virtual QgsAbstractGeometry * segmentize(double tolerance=M_PI/180., SegmentationToleranceType toleranceType=MaximumAngle) const
Returns a version of the geometry without curves.
virtual int vertexCount(int part=0, int ring=0) const =0
Returns the number of vertices of which this geometry is built.
bool isMeasure() const
Returns true if the geometry contains m values.
QFlags< WkbFlag > WkbFlags
virtual QgsRectangle boundingBox() const
Returns the minimal bounding box for the geometry.
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
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.
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
part_iterator parts_end()
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry.
virtual double length() const
Returns the planar, 2-dimensional length of the geometry.
virtual bool dropZValue()=0
Drops any z-dimensions which exist in the geometry.
part_iterator parts_begin()
Returns STL-style iterator pointing to the first part of the geometry.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
A 3-dimensional box composed of x, y, z coordinates.
double yMaximum() const
Returns the maximum y value.
double xMinimum() const
Returns the minimum x value.
double zMaximum() const
Returns the maximum z value.
double xMaximum() const
Returns the maximum x value.
QgsRectangle toRectangle() const
Converts the box to a 2D rectangle.
bool is2d() const
Returns true if the box can be considered a 2-dimensional box, i.e.
double zMinimum() const
Returns the minimum z value.
double yMinimum() const
Returns the minimum y value.
static QgsCircle from2Points(const QgsPoint &pt1, const QgsPoint &pt2)
Constructs a circle by 2 points on the circle.
double radius() const
Returns the radius of the circle.
bool contains(const QgsPoint &point, double epsilon=1E-8) const
Returns true if the circle contains the point.
QgsCircularString * toCircularString(bool oriented=false) const
Returns a circular string from the circle.
static QgsCircle minimalCircleFrom3Points(const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3, double epsilon=1E-8)
Constructs the smallest circle from 3 points.
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.
void addCurve(QgsCurve *c, bool extendPrevious=false)
Adds a curve to the geometry (takes ownership).
Curve polygon geometry type.
int numInteriorRings() const
Returns the number of interior rings contained with the curve polygon.
const QgsCurve * exteriorRing() const
Returns the curve polygon's exterior ring.
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.
const QgsCurve * interiorRing(int i) const
Retrieves an interior ring from the curve polygon.
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 ringCount(int part=0) const override
Returns the number of rings of which this geometry is built.
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.
virtual QgsPolygon * toPolygon(unsigned int segments=36) const
Returns a segmented polygon.
QgsPoint center() const
Returns the center point.
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.
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.
int numGeometries() const
Returns the number of geometries within the collection.
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 angleBetweenThreePoints(double x1, double y1, double x2, double y2, double x3, double y3)
Calculates the angle between the lines AB and BC, where AB and BC described by points a,...
static double lineAngle(double x1, double y1, double x2, double y2)
Calculates the direction of line joining two points in radians, clockwise from the north direction.
static double averageAngle(double x1, double y1, double x2, double y2, double x3, double y3)
Calculates the average angle (in radians) between the two linear segments from (x1,...
static double normalizedAngle(double angle)
Ensures that an angle is in the range 0 <= angle < 2 pi.
static std::unique_ptr< QgsLineString > createChamferGeometry(const QgsPoint &segment1Start, const QgsPoint &segment1End, const QgsPoint &segment2Start, const QgsPoint &segment2End, double distance1, double distance2)
Creates a complete chamfer geometry connecting two segments.
static QgsPointXY interpolatePointOnLine(double x1, double y1, double x2, double y2, double fraction)
Interpolates the position of a point a fraction of the way along the line from (x1,...
static std::unique_ptr< QgsAbstractGeometry > createFilletGeometry(const QgsPoint &segment1Start, const QgsPoint &segment1End, const QgsPoint &segment2Start, const QgsPoint &segment2End, double radius, int segments)
Creates a complete fillet geometry connecting two segments.
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 QgsPoint closestVertex(const QgsAbstractGeometry &geom, const QgsPoint &pt, QgsVertexId &id)
Returns the closest vertex to a geometry for a specified point.
static Q_DECL_DEPRECATED double sqrDistance2D(double x1, double y1, double x2, double y2)
Returns the squared 2D distance between (x1, y1) and (x2, y2).
static std::unique_ptr< QgsAbstractGeometry > chamferVertex(const QgsCurve *curve, int vertexIndex, double distance1, double distance2)
Applies chamfer to a vertex in a curve geometry.
static std::unique_ptr< QgsAbstractGeometry > filletVertex(const QgsCurve *curve, int vertexIndex, double radius, int segments)
Applies fillet to a vertex in a curve geometry.
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.
QPolygonF asQPolygonF() const
Returns contents of the geometry as a QPolygonF.
double closestSegmentWithContext(const QgsPointXY &point, QgsPointXY &minDistPoint, int &nextVertexIndex, int *leftOrRightOfSegment=nullptr, double epsilon=Qgis::DEFAULT_SEGMENT_EPSILON) const
Searches for the closest segment of geometry to the given point.
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...
double area3D() const
Returns the 3-dimensional surface area of the geometry.
QgsGeometry clipped(const QgsRectangle &rectangle)
Clips the geometry using the specified rectangle.
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
double lineLocatePoint(const QgsGeometry &point) const
Returns a distance representing the location along this linestring of the closest point on this lines...
int makeDifferenceInPlace(const QgsGeometry &other)
Changes this geometry such that it does not intersect the other geometry.
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.
QgsGeometry chamfer(int vertexIndex, double distance1, double distance2=-1.0) const
Creates a chamfer (angled corner) at the specified vertex.
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...
ChamferFilletOperationType
Privatly used in chamfer/fillet functions.
QgsGeometry poleOfInaccessibility(double precision, double *distanceToBoundary=nullptr) const
Calculates the approximate pole of inaccessibility for a surface, which is the most distant internal ...
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 fromQPointF(QPointF point)
Construct geometry from a QPointF.
static QgsGeometry collectTinPatches(const QVector< QgsGeometry > &geometries)
Collects all patches from a list of TIN or Triangle geometries into a single TIN geometry.
static QgsGeometry polygonize(const QVector< QgsGeometry > &geometries)
Creates a GeometryCollection geometry containing possible polygons formed from the constituent linewo...
bool addTopologicalPoint(const QgsPoint &point, double snappingTolerance=1e-8, double segmentSearchEpsilon=1e-12)
Adds a vertex to the segment which intersect point but don't already have a vertex there.
QgsGeometry 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 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.
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 minimumWidth() const
Returns a linestring geometry which represents the minimum diameter of the geometry.
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...
Qgis::CoverageValidityResult validateCoverage(double gapWidth, QgsGeometry *invalidEdges=nullptr) const
Analyze a coverage (represented as a collection of polygonal geometry with exactly matching edge geom...
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...
QgsGeometry simplifyCoverageVW(double tolerance, bool preserveBoundary) const
Operates on a coverage (represented as a list of polygonal geometry with exactly matching edge geomet...
static QgsGeometry collectGeometry(const QVector< QgsGeometry > &geometries)
Creates a new multipart geometry from a list of QgsGeometry objects.
QgsGeometry fillet(int vertexIndex, double radius, int segments=8) const
Creates a fillet (rounded corner) at the specified vertex.
QgsGeometry mergeLines(const QgsGeometryParameters ¶meters=QgsGeometryParameters()) const
Merges any connected lines in a LineString/MultiLineString geometry and converts them to single line ...
static QgsGeometry fromMultiPolylineXY(const QgsMultiPolylineXY &multiline)
Creates a new geometry from a QgsMultiPolylineXY object.
QgsGeometry makeValid(Qgis::MakeValidMethod method=Qgis::MakeValidMethod::Linework, bool keepCollapsed=false) const
Attempts to make an invalid geometry valid without losing vertices.
double frechetDistance(const QgsGeometry &geom) const
Returns the Fréchet distance between this geometry and geom, restricted to discrete points for both g...
QString lastError() const
Returns an error string referring to the last error encountered either when this geometry was created...
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 ...
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
static QgsGeometry fromPolylineXY(const QgsPolylineXY &polyline)
Creates a new LineString geometry from a list of QgsPointXY points.
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().
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.
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.
QgsBox3D boundingBox3D() const
Returns the 3D bounding box of the geometry.
friend class QgsInternalGeometryEngine
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsGeometry subdivide(int maxNodes=256, const QgsGeometryParameters ¶meters=QgsGeometryParameters()) const
Subdivides the geometry.
static Q_INVOKABLE QgsGeometry fromWkt(const QString &wkt)
Creates a new geometry from a WKT string.
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.
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 QgsGeometry fromPointXY(const QgsPointXY &point)
Creates a new geometry from a QgsPointXY object.
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.
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.
Qgis::GeometryOperationResult avoidIntersectionsV2(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.
bool within(const QgsGeometry &geometry) const
Returns true if the geometry is completely within another geometry.
QPointF asQPointF() const
Returns contents of the geometry as a QPointF if wkbType is WKBPoint, otherwise returns a null QPoint...
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.
bool isMultipart() const
Returns true if WKB of the geometry is of WKBMulti* type.
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 shallow copy 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...
Qgis::AngularDirection polygonOrientation() const
Returns the orientation of the polygon.
double hausdorffDistance(const QgsGeometry &geom) const
Returns the Hausdorff distance between this geometry and geom.
QgsGeometry largestEmptyCircle(double tolerance, const QgsGeometry &boundary=QgsGeometry()) const
Constructs the Largest Empty Circle for a set of obstacle geometries, up to a specified tolerance.
Q_DECL_DEPRECATED Qgis::GeometryOperationResult addPart(const QVector< QgsPointXY > &points, Qgis::GeometryType geomType=Qgis::GeometryType::Unknown)
Adds a new part to a the geometry.
QgsGeometryPartIterator parts()
Returns Java-style iterator for traversal of parts of the geometry.
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 concaveHull(double targetPercent, bool allowHoles=false) const
Returns a possibly concave polygon that contains all the points in the geometry.
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 minimumClearanceLine() const
Returns a LineString whose endpoints define the minimum clearance of a 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.
double sqrDistToVertexAt(QgsPointXY &point, int atVertex) const
Returns the squared Cartesian distance between the given point to the given vertex index (vertex at t...
void fromWkb(unsigned char *wkb, int length)
Set the geometry, feeding in the buffer containing OGC Well-Known Binary and the buffer's length.
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.
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...
QVector< QgsGeometry > coerceToType(Qgis::WkbType type, double defaultZ=0, double defaultM=0, bool avoidDuplicates=true) const
Attempts to coerce this geometry into the specified destination type.
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.
double frechetDistanceDensify(const QgsGeometry &geom, double densifyFraction) const
Returns the Fréchet distance between this geometry and geom, restricted to discrete points for both g...
QByteArray asWkb(QgsAbstractGeometry::WkbFlags flags=QgsAbstractGeometry::WkbFlags()) const
Export the geometry to WKB.
QgsGeometry unionCoverage() const
Optimized union algorithm for polygonal inputs that are correctly noded and do not overlap.
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 addPartV2(const QVector< QgsPointXY > &points, Qgis::WkbType wkbType=Qgis::WkbType::Unknown)
Adds a new part to a the geometry.
double minimumClearance() const
Computes the minimum clearance of a 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.
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...
Q_INVOKABLE 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.
Qgis::WkbType wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.).
bool moveVertex(double x, double y, int atVertex)
Moves the vertex at the given position number and item (first number is index 0) to the given coordin...
QgsGeometry constrainedDelaunayTriangulation() const
Returns a constrained Delaunay triangulation for the vertices of the geometry.
bool isGeosEqual(const QgsGeometry &) const
Compares the geometry with another geometry using GEOS.
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry, double precision=0.0, Qgis::GeosCreationFlags flags=Qgis::GeosCreationFlag::SkipEmptyInteriorRings)
Creates and returns a new geometry engine representing the specified geometry using precision on a gr...
bool intersects(const QgsRectangle &rectangle) const
Returns true if this geometry exactly intersects with a rectangle.
static QgsGeometry fromBox3D(const QgsBox3D &box)
Creates a new geometry from a QgsBox3D object Returns a 2D polygon geometry if the box is purely 2d,...
QgsAbstractGeometry::vertex_iterator vertices_end() const
Returns STL-style iterator pointing to the imaginary vertex after the last vertex of the geometry.
static QgsGeometry createWedgeBufferFromAngles(const QgsPoint ¢er, double startAngle, double endAngle, double outerRadius, double innerRadius=0)
Creates a wedge shaped buffer from a center point.
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.
static QgsGeometry fromPoint(const QgsPoint &point)
Creates a new geometry from a QgsPoint object.
bool overlaps(const QgsGeometry &geometry) const
Returns true if the geometry overlaps another geometry.
Q_DECL_DEPRECATED 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, and exception handling.
double frechetDistanceDensify(const QgsAbstractGeometry *geometry, double densifyFraction, QString *errorMsg=nullptr) const
Returns the Fréchet distance between this geometry and another geometry, restricted to discrete point...
double hausdorffDistanceDensify(const QgsAbstractGeometry *geometry, double densifyFraction, QString *errorMsg=nullptr) const
Returns the Hausdorff distance between this geometry and another geometry.
QgsAbstractGeometry * buffer(double distance, int segments, QString *errorMsg=nullptr) const override
double hausdorffDistance(const QgsAbstractGeometry *geometry, QString *errorMsg=nullptr) const
Returns the Hausdorff distance between this geometry and another geometry.
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 *geometry, QString *errorMsg=nullptr) const
Returns the Fréchet distance between this geometry and another geometry, restricted to discrete point...
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...
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.
Custom exception class when argument are invalid.
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.
void points(QgsPointSequence &pt) const override
Returns a list of points within the curve.
static std::unique_ptr< QgsLineString > fromQPolygonF(const QPolygonF &polygon)
Returns a new linestring from a QPolygonF polygon input.
int numPoints() const override
Returns the number of points in the curve.
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.
void setY(double y)
Sets the y value of the point.
void setX(double x)
Sets the x value of the point.
QPointF toQPointF() const
Converts a point to a QPointF.
Point geometry type, with support for z-dimension and m-values.
QgsPoint * clone() const override
Clones the geometry by performing a deep copy.
QgsPoint project(double distance, double azimuth, double inclination=90.0) const
Returns a new point which corresponds to this point projected by a specified distance with specified ...
Polyhedral surface geometry type.
A rectangle specified with double values.
Triangulated surface geometry type.
Represents a vector layer which manages a vector based dataset.
Java-style iterator for traversal of vertices of a geometry.
static Qgis::GeometryType geometryType(Qgis::WkbType type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
static Q_INVOKABLE bool hasZ(Qgis::WkbType type)
Tests whether a WKB type contains the z-dimension.
static Qgis::WkbType singleType(Qgis::WkbType type)
Returns the single type for a WKB type.
static Q_INVOKABLE bool hasM(Qgis::WkbType type)
Tests whether a WKB type contains m values.
static Q_INVOKABLE bool isNurbsType(Qgis::WkbType type)
Returns true if the WKB type is a NURBS curve type.
static Q_INVOKABLE bool isCurvedType(Qgis::WkbType type)
Returns true if the WKB type is a curved type or can contain curved geometries.
static Qgis::WkbType multiType(Qgis::WkbType type)
Returns the multi type for a WKB type.
static Qgis::WkbType flatType(Qgis::WkbType type)
Returns the flat type for a WKB type.
static Q_INVOKABLE bool isMultiType(Qgis::WkbType type)
Returns true if the WKB type is a multi type.
static Qgis::WkbType curveType(Qgis::WkbType type)
Returns the curve type for a WKB type.
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
QString qgsEnumValueToKey(const T &value, bool *returnOk=nullptr)
Returns the value for the given key of an enum.
#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).
T qgsgeometry_cast(QgsAbstractGeometry *geom)
QVector< QgsPoint > QgsPointSequence
Q_GLOBAL_STATIC_WITH_ARGS(PalPropertyList, palHiddenProperties,({ static_cast< int >(QgsPalLayerSettings::Property::PositionX), static_cast< int >(QgsPalLayerSettings::Property::PositionY), static_cast< int >(QgsPalLayerSettings::Property::Show), static_cast< int >(QgsPalLayerSettings::Property::LabelRotation), static_cast< int >(QgsPalLayerSettings::Property::Family), static_cast< int >(QgsPalLayerSettings::Property::FontStyle), static_cast< int >(QgsPalLayerSettings::Property::Size), static_cast< int >(QgsPalLayerSettings::Property::Bold), static_cast< int >(QgsPalLayerSettings::Property::Italic), static_cast< int >(QgsPalLayerSettings::Property::Underline), static_cast< int >(QgsPalLayerSettings::Property::Color), static_cast< int >(QgsPalLayerSettings::Property::Strikeout), static_cast< int >(QgsPalLayerSettings::Property::MultiLineAlignment), static_cast< int >(QgsPalLayerSettings::Property::BufferSize), static_cast< int >(QgsPalLayerSettings::Property::BufferDraw), static_cast< int >(QgsPalLayerSettings::Property::BufferColor), static_cast< int >(QgsPalLayerSettings::Property::LabelDistance), static_cast< int >(QgsPalLayerSettings::Property::Hali), static_cast< int >(QgsPalLayerSettings::Property::Vali), static_cast< int >(QgsPalLayerSettings::Property::ScaleVisibility), static_cast< int >(QgsPalLayerSettings::Property::MinScale), static_cast< int >(QgsPalLayerSettings::Property::MaxScale), static_cast< int >(QgsPalLayerSettings::Property::AlwaysShow), static_cast< int >(QgsPalLayerSettings::Property::CalloutDraw), static_cast< int >(QgsPalLayerSettings::Property::LabelAllParts) })) Q_GLOBAL_STATIC_WITH_ARGS(SymbolPropertyList
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)
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.
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)
std::unique_ptr< QgsAbstractGeometry > geometry
QgsGeometryPrivate(std::unique_ptr< QgsAbstractGeometry > geometry)
Utility class for identifying a unique vertex within a geometry.
bool isValid() const
Returns true if the vertex id is valid.