20 #include <nlohmann/json.hpp>
55 std::unique_ptr< QgsAbstractGeometry >
geometry;
65 if ( !d->
ref.deref() )
73 d->
ref = QAtomicInt( 1 );
80 d->
ref = QAtomicInt( 1 );
86 mLastError = other.mLastError;
94 if ( !d->
ref.deref() )
99 mLastError = other.mLastError;
106 void QgsGeometry::detach()
111 std::unique_ptr< QgsAbstractGeometry > cGeom;
113 cGeom.reset( d->
geometry->clone() );
115 reset( std::move( cGeom ) );
118 void QgsGeometry::reset( std::unique_ptr<QgsAbstractGeometry> newGeometry )
122 ( void )d->
ref.deref();
125 d->
geometry = std::move( newGeometry );
141 if ( d->
geometry.get() == geometry )
146 reset( std::unique_ptr< QgsAbstractGeometry >( geometry ) );
186 return QgsGeometry( qgis::make_unique< QgsLineString >( polyline ) );
231 std::unique_ptr< QgsLineString > ext = qgis::make_unique< QgsLineString >(
232 QVector< double >() << rect.
xMinimum()
237 QVector< double >() << rect.
yMinimum()
242 std::unique_ptr< QgsPolygon > polygon = qgis::make_unique< QgsPolygon >();
243 polygon->setExteriorRing( ext.release() );
260 if ( g.isMultipart() )
262 for (
auto p = g.const_parts_begin(); p != g.const_parts_end(); ++p )
264 collected.
addPart( ( *p )->clone() );
278 if ( std::abs( angularWidth ) >= 360.0 )
280 std::unique_ptr< QgsCompoundCurve > outerCc = qgis::make_unique< QgsCompoundCurve >();
285 std::unique_ptr< QgsCurvePolygon > cp = qgis::make_unique< QgsCurvePolygon >();
286 cp->setExteriorRing( outerCc.release() );
290 std::unique_ptr< QgsCompoundCurve > innerCc = qgis::make_unique< QgsCompoundCurve >();
295 cp->setInteriorRings( { innerCc.release() } );
301 std::unique_ptr< QgsCompoundCurve > wedge = qgis::make_unique< QgsCompoundCurve >();
303 const double startAngle = azimuth - angularWidth * 0.5;
304 const double endAngle = azimuth + angularWidth * 0.5;
309 const bool useShortestArc = angularWidth <= 180.0;
327 std::unique_ptr< QgsCurvePolygon > cp = qgis::make_unique< QgsCurvePolygon >();
328 cp->setExteriorRing( wedge.release() );
406 d->
geometry->adjacentVertices(
id, prevVertex, nextVertex );
442 return d->
geometry->vertexAngle( v2 );
461 d->
geometry->adjacentVertices(
id, beforeVertexId, afterVertexId );
499 return d->
geometry->moveVertex(
id, p );
532 return d->
geometry->deleteVertex(
id );
584 return d->
geometry->insertVertex(
id, point );
600 return d->
geometry->vertexAt( vId );
620 result.mLastError = mLastError;
629 return QgsGeometry( qgis::make_unique< QgsLineString >( *qgsgeometry_cast< const QgsPoint * >( d->
geometry.get() ), *qgsgeometry_cast< const QgsPoint * >( other.
constGet() ) ) );
635 result.mLastError = mLastError;
657 int &nextVertexIndex,
658 int *leftOrRightOfSegment,
659 double epsilon )
const
669 double sqrDist = d->
geometry->closestSegment(
QgsPoint( point ), segmentPt, vertexAfter, leftOrRightOfSegment, epsilon );
673 minDistPoint.
setX( segmentPt.
x() );
674 minDistPoint.
setY( segmentPt.
y() );
681 std::unique_ptr< QgsLineString > ringLine = qgis::make_unique< QgsLineString >( ring );
682 return addRing( ringLine.release() );
687 std::unique_ptr< QgsCurve > r( ring );
707 std::unique_ptr< QgsAbstractGeometry > partGeom;
708 if ( points.size() == 1 )
710 partGeom = qgis::make_unique< QgsPoint >( points[0] );
712 else if ( points.size() > 1 )
714 std::unique_ptr< QgsLineString > ringLine = qgis::make_unique< QgsLineString >();
715 ringLine->setPoints( points );
716 partGeom = std::move( ringLine );
718 return addPart( partGeom.release(), geomType );
723 std::unique_ptr< QgsAbstractGeometry > p( part );
729 reset( qgis::make_unique< QgsMultiPoint >() );
732 reset( qgis::make_unique< QgsMultiLineString >() );
735 reset( qgis::make_unique< QgsMultiPolygon >() );
739 return QgsGeometry::OperationResult::AddPartNotMultiGeometry;
775 QVector<QgsGeometry> results;
776 results.reserve(
parts.count() );
783 if ( results.isEmpty() )
787 for (
const QgsGeometry &result : qgis::as_const( results ) )
796 newPoly->removeInteriorRings( minimumRingArea );
810 d->
geometry->transform( QTransform::fromTranslate( dx, dy ), dz, 1.0, dm );
823 QTransform t = QTransform::fromTranslate( center.
x(), center.
y() );
824 t.rotate( -rotation );
825 t.translate( -center.
x(), -center.
y() );
843 return QgsGeometry::OperationResult::InvalidBaseGeometry;
846 QVector<QgsGeometry > newGeoms;
867 *
this = newGeoms.takeAt( 0 );
868 newGeometries = newGeoms;
874 return QgsGeometry::OperationResult::Success;
878 return QgsGeometry::OperationResult::GeometryEngineError;
880 return QgsGeometry::OperationResult::InvalidBaseGeometry;
882 return QgsGeometry::OperationResult::InvalidInputGeometryType;
884 return QgsGeometry::OperationResult::SplitCannotSplitPoint;
886 return QgsGeometry::OperationResult::NothingHappened;
897 std::unique_ptr<QgsLineString> segmentizedLine( curve->
curveToLine() );
899 segmentizedLine->points( points );
904 if ( preserveCircular )
906 for (
int i = 0; i < newGeometries.count(); ++i )
925 std::unique_ptr< QgsAbstractGeometry > geom(
geos.reshapeGeometry( reshapeLineString, &errorCode, &mLastError ) );
928 reset( std::move( geom ) );
964 std::unique_ptr< QgsAbstractGeometry > diffGeom(
geos.intersection( other.
constGet(), &mLastError ) );
970 reset( std::move( diffGeom ) );
984 std::unique_ptr< QgsAbstractGeometry > diffGeom(
geos.intersection( other.
constGet(), &mLastError ) );
988 result.mLastError = mLastError;
1022 auto l_boundary = boundary.length();
1024 if ( ( points.length() == 0 ) || ( l_boundary == 3 ) )
1026 switch ( l_boundary )
1033 boundary.pop_back();
1038 boundary.pop_back();
1040 boundary.pop_back();
1057 circ_mec = __recMinimalEnclosingCircle( points, boundary );
1061 boundary.append( pxy );
1062 circ_mec = __recMinimalEnclosingCircle( points, boundary );
1086 QgsCircle circ = __recMinimalEnclosingCircle( P, R );
1107 return engine.
orthogonalize( tolerance, maxIterations, angleThreshold );
1116 return QgsGeometry( d->
geometry->snappedToGrid( hSpacing, vSpacing, dSpacing, mSpacing ) );
1125 return d->
geometry->removeDuplicateNodes( epsilon, useZValues );
1153 return geos.intersects( geometry.d->
geometry.get(), &mLastError );
1166 const QgsPoint *point = qgsgeometry_cast< const QgsPoint * >( d->
geometry.get() );
1170 return d->
geometry->boundingBox().intersects( rectangle );
1193 return geos.contains( &pt, &mLastError );
1205 return geos.contains( geometry.d->
geometry.get(), &mLastError );
1217 return geos.disjoint( geometry.d->
geometry.get(), &mLastError );
1228 if ( d == geometry.d )
1248 return geos.touches( geometry.d->
geometry.get(), &mLastError );
1260 return geos.overlaps( geometry.d->
geometry.get(), &mLastError );
1272 return geos.within( geometry.d->
geometry.get(), &mLastError );
1284 return geos.crosses( geometry.d->
geometry.get(), &mLastError );
1313 QVector< QgsGeometry > res;
1351 std::unique_ptr< QgsAbstractGeometry > exterior( ( *part )->clone() );
1352 if (
QgsCurve *curve = qgsgeometry_cast< QgsCurve * >( exterior.get() ) )
1356 std::unique_ptr< QgsCurvePolygon > cp = qgis::make_unique< QgsCurvePolygon >();
1357 cp->setExteriorRing( curve );
1359 gc->addGeometry( cp.release() );
1363 std::unique_ptr< QgsPolygon > p = qgis::make_unique< QgsPolygon >();
1364 p->setExteriorRing( qgsgeometry_cast< QgsLineString * >( curve ) );
1366 gc->addGeometry( p.release() );
1379 std::unique_ptr< QgsMultiPoint > mp = qgis::make_unique< QgsMultiPoint >();
1381 QSet< QgsPoint > added;
1384 if ( added.contains( *vertex ) )
1386 mp->addGeometry( ( *vertex ).clone() );
1387 added.insert( *vertex );
1421 res.reserve(
parts->partCount() );
1422 for (
int i = 0; i <
parts->partCount( ); i++ )
1439 return convertToPoint( destMultipart );
1442 return convertToLine( destMultipart );
1445 return convertToPolygon( destMultipart );
1497 if ( !multiGeom || multiGeom->
partCount() < 1 )
1500 std::unique_ptr< QgsAbstractGeometry > firstPart( multiGeom->
geometryN( 0 )->
clone() );
1501 reset( std::move( firstPart ) );
1512 std::unique_ptr<QgsGeometryCollection> resGeom;
1516 resGeom = qgis::make_unique<QgsMultiPoint>();
1519 resGeom = qgis::make_unique<QgsMultiLineString>();
1522 resGeom = qgis::make_unique<QgsMultiPolygon>();
1535 resGeom->addGeometry( g->
clone() );
1538 set( resGeom.release() );
1568 std::unique_ptr< QgsLineString > segmentizedLine;
1570 if ( doSegmentation )
1578 line = segmentizedLine.get();
1582 line = qgsgeometry_cast<QgsLineString *>( d->
geometry.get() );
1590 polyLine.resize( nVertices );
1592 const double *xData = line->
xData();
1593 const double *yData = line->
yData();
1594 for (
int i = 0; i < nVertices; ++i )
1596 data->
setX( *xData++ );
1597 data->
setY( *yData++ );
1612 std::unique_ptr< QgsPolygon > segmentized;
1613 if ( doSegmentation )
1620 segmentized.reset( curvePoly->
toPolygon() );
1621 p = segmentized.get();
1625 p = qgsgeometry_cast<QgsPolygon *>( d->
geometry.get() );
1634 convertPolygon( *p, polygon );
1654 for (
int i = 0; i < nPoints; ++i )
1657 multiPoint[i].
setX( pt->
x() );
1658 multiPoint[i].setY( pt->
y() );
1671 if ( !geomCollection )
1683 mpl.reserve( nLines );
1684 for (
int i = 0; i < nLines; ++i )
1687 std::unique_ptr< QgsLineString > segmentized;
1690 const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( geomCollection->
geometryN( i ) );
1696 line = segmentized.get();
1701 polyLine.resize( nVertices );
1703 const double *xData = line->
xData();
1704 const double *yData = line->
yData();
1705 for (
int i = 0; i < nVertices; ++i )
1707 data->
setX( *xData++ );
1708 data->
setY( *yData++ );
1711 mpl.append( polyLine );
1724 if ( !geomCollection )
1730 if ( nPolygons < 1 )
1736 for (
int i = 0; i < nPolygons; ++i )
1738 const QgsPolygon *polygon = qgsgeometry_cast<const QgsPolygon *>( geomCollection->
geometryN( i ) );
1753 convertPolygon( *polygon, poly );
1769 double geosArea = g.
area();
1770 double qgisArea = 0;
1774 qgisArea = surface->
area();
1779 return g.
area( &mLastError );
1790 return g.
length( &mLastError );
1803 return qgsgeometry_cast< const QgsPoint * >( d->
geometry.get() )->distance( *qgsgeometry_cast< const QgsPoint * >( geom.
constGet() ) );
1839 return d->
geometry->vertices_begin();
1846 return d->
geometry->vertices_end();
1876 return d->
geometry->const_parts_begin();
1883 return d->
geometry->const_parts_end();
1912 std::unique_ptr<QgsAbstractGeometry> geom( g.
buffer(
distance, segments, &mLastError ) );
1916 result.mLastError = mLastError;
1935 result.mLastError = mLastError;
1951 QVector<QgsGeometry> results;
1952 results.reserve(
parts.count() );
1959 if ( results.isEmpty() )
1963 for (
const QgsGeometry &result : qgis::as_const( results ) )
1977 std::unique_ptr< QgsAbstractGeometry > offsetGeom(
geos.offsetCurve(
distance, segments, joinStyle, miterLimit, &mLastError ) );
1981 result.mLastError = mLastError;
1985 if (
const QgsCurve *
offsetCurve = qgsgeometry_cast< const QgsCurve * >( offsetGeom.get() ) )
1988 if ( newOrientation != prevOrientation )
1991 std::unique_ptr< QgsAbstractGeometry > flipped(
offsetCurve->reversed() );
1992 offsetGeom = std::move( flipped );
2009 QVector<QgsGeometry> results;
2010 results.reserve(
parts.count() );
2017 if ( results.isEmpty() )
2021 for (
const QgsGeometry &result : qgis::as_const( results ) )
2031 std::unique_ptr< QgsAbstractGeometry > bufferGeom =
geos.singleSidedBuffer(
distance, segments, side,
2032 joinStyle, miterLimit, &mLastError );
2036 result.mLastError = mLastError;
2047 return engine.
taperedBuffer( startWidth, endWidth, segments );
2067 QVector<QgsGeometry> results;
2068 results.reserve(
parts.count() );
2075 if ( results.isEmpty() )
2079 for (
const QgsGeometry &result : qgis::as_const( results ) )
2091 std::unique_ptr< QgsLineString > newLine( line->
clone() );
2092 newLine->extend( startDistance, endDistance );
2106 std::unique_ptr< QgsAbstractGeometry > simplifiedGeom(
geos.simplify( tolerance, &mLastError ) );
2107 if ( !simplifiedGeom )
2110 result.mLastError = mLastError;
2113 return QgsGeometry( std::move( simplifiedGeom ) );
2148 c.get()->dropZValue();
2149 c.get()->dropMValue();
2157 result.mLastError = mLastError;
2172 result.mLastError = mLastError;
2191 std::unique_ptr< QgsAbstractGeometry > cHull(
geos.convexHull( &mLastError ) );
2195 geom.mLastError = mLastError;
2211 result.mLastError = mLastError;
2224 QgsGeometry result =
geos.delaunayTriangulation( tolerance, edgesOnly );
2225 result.mLastError = mLastError;
2237 std::unique_ptr< QgsAbstractGeometry > segmentizedCopy;
2240 segmentizedCopy.reset( d->
geometry->segmentize() );
2241 geom = segmentizedCopy.get();
2246 std::unique_ptr< QgsAbstractGeometry > result(
geos.subdivide( maxNodes, &mLastError ) );
2250 geom.mLastError = mLastError;
2276 for (
int part = 0; part < collection->
numGeometries(); ++part )
2278 const QgsCurve *candidate = qgsgeometry_cast< const QgsCurve * >( collection->
geometryN( part ) );
2281 const double candidateLength = candidate->
length();
2293 curve = qgsgeometry_cast< const QgsCurve * >( line.
constGet() );
2322 return geos.lineLocatePoint( *(
static_cast< QgsPoint *
>( point.d->
geometry.get() ) ), &mLastError );
2342 if ( previous == next )
2389 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.intersection( geometry.d->
geometry.get(), &mLastError ) );
2394 geom.mLastError = mLastError;
2410 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.combine( geometry.d->
geometry.get(), &mLastError ) );
2414 geom.mLastError = mLastError;
2436 result.mLastError = mLastError;
2450 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.difference( geometry.d->
geometry.get(), &mLastError ) );
2454 geom.mLastError = mLastError;
2470 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.symDifference( geometry.d->
geometry.get(), &mLastError ) );
2474 geom.mLastError = mLastError;
2484 return engine.
extrude( x, y );
2492 return QVector< QgsPointXY >();
2500 return QVector< QgsPointXY >();
2518 QVector<QgsGeometry> geometryList;
2521 return geometryList;
2528 geometryList.reserve( numGeom );
2529 for (
int i = 0; i < numGeom; ++i )
2536 geometryList.append( *
this );
2539 return geometryList;
2553 if (
const QgsGeometryCollection *collection = qgsgeometry_cast< const QgsGeometryCollection *>( part ) )
2555 if ( collection->numGeometries() > 0 )
2556 part = collection->geometryN( 0 );
2561 if (
const QgsCurve *curve = qgsgeometry_cast< const QgsCurve * >( part ) )
2562 return curve->asQPolygonF();
2563 else if (
const QgsCurvePolygon *polygon = qgsgeometry_cast< const QgsCurvePolygon * >( part ) )
2564 return polygon->exteriorRing() ? polygon->exteriorRing()->asQPolygonF() : QPolygonF();
2607 bool haveInvalidGeometry =
false;
2611 reset( std::move( diffGeom ) );
2614 if ( geomTypeBeforeModification !=
wkbType() )
2616 if ( haveInvalidGeometry )
2632 result.mLastError = mLastError;
2649 if (
const QgsCurvePolygon *cp = qgsgeometry_cast< const QgsCurvePolygon * >( g ) )
2651 std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
2652 corrected->forceRHR();
2653 newCollection->addGeometry( corrected.release() );
2657 newCollection->addGeometry( g->
clone() );
2666 std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
2667 corrected->forceRHR();
2726 return d->
geometry->isValid( mLastError,
static_cast< int >( flags ) );
2736 return geos.isSimple( &mLastError );
2767 return geos.isEqual( g.d->
geometry.get(), &mLastError );
2775 std::unique_ptr< QgsAbstractGeometry > geom(
geos.combine( geometries, &error ) );
2777 result.mLastError = error;
2785 QVector<const QgsAbstractGeometry *> geomV2List;
2788 if ( !( g.isNull() ) )
2790 geomV2List.append( g.constGet() );
2796 result.mLastError = error;
2807 std::unique_ptr< QgsAbstractGeometry > straightGeom( d->
geometry->segmentize( tolerance, toleranceType ) );
2808 reset( std::move( straightGeom ) );
2818 return d->
geometry->hasCurvedSegments();
2829 d->
geometry->transform( ct, direction, transformZ );
2841 d->
geometry->transform( ct, zTranslate, zScale, mTranslate, mScale );
2863 std::unique_ptr< QgsAbstractGeometry > resultGeom =
geos.clip( rectangle, &mLastError );
2867 result.mLastError = mLastError;
2881 static bool vertexIndexInfo(
const QgsAbstractGeometry *g,
int vertexIndex,
int &partIndex,
int &ringIndex,
int &vertex )
2883 if ( vertexIndex < 0 )
2886 if (
const QgsGeometryCollection *geomCollection = qgsgeometry_cast<const QgsGeometryCollection *>( g ) )
2890 for (
int i = 0; i < geomCollection->numGeometries(); ++i )
2896 for (
int k = 0; k < part->
ringCount(); ++k )
2899 if ( vertexIndex < numPoints )
2902 return vertexIndexInfo( part, vertexIndex, nothing, ringIndex, vertex );
2904 vertexIndex -= numPoints;
2905 offset += numPoints;
2909 else if (
const QgsCurvePolygon *curvePolygon = qgsgeometry_cast<const QgsCurvePolygon *>( g ) )
2911 const QgsCurve *ring = curvePolygon->exteriorRing();
2912 if ( vertexIndex < ring->numPoints() )
2916 vertex = vertexIndex;
2921 for (
int i = 0; i < curvePolygon->numInteriorRings(); ++i )
2923 const QgsCurve *ring = curvePolygon->interiorRing( i );
2924 if ( vertexIndex < ring->numPoints() )
2927 vertex = vertexIndex;
2934 else if (
const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( g ) )
2936 if ( vertexIndex < curve->numPoints() )
2940 vertex = vertexIndex;
2944 else if ( qgsgeometry_cast<const QgsPoint *>( g ) )
2946 if ( vertexIndex == 0 )
2967 bool res = vertexIndexInfo( d->
geometry.get(), nr,
id.part,
id.ring,
id.vertex );
2973 if (
const QgsGeometryCollection *geomCollection = qgsgeometry_cast<const QgsGeometryCollection *>( g ) )
2975 g = geomCollection->geometryN(
id.part );
2978 if (
const QgsCurvePolygon *curvePolygon = qgsgeometry_cast<const QgsCurvePolygon *>( g ) )
2980 g =
id.ring == 0 ? curvePolygon->exteriorRing() : curvePolygon->interiorRing(
id.ring - 1 );
2983 if (
const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( g ) )
2986 res = curve->pointAt(
id.vertex, p,
id.
type );
3000 return d->
geometry->vertexNumberFromVertexId(
id );
3015 d->
geometry->filterVertices( filter );
3049 output.resize( input.size() );
3051 for (
int i = 0; i < input.size(); ++i )
3053 const QgsPoint &pt = input.at( i );
3054 output[i].
setX( pt.
x() );
3055 output[i].setY( pt.
y() );
3063 if ( coords.empty() )
3068 output.resize( rings.size() );
3069 for (
int i = 0; i < rings.size(); ++i )
3071 convertToPolyline( rings[i], output[i] );
3077 return QgsGeometry( qgis::make_unique< QgsPoint >( point.x(), point.y() ) );
3084 if ( polygon.isClosed() )
3086 std::unique_ptr< QgsPolygon > poly = qgis::make_unique< QgsPolygon >();
3087 poly->setExteriorRing( ring.release() );
3108 result.reserve( polygon.count() );
3109 for (
const QPointF &p : polygon )
3118 if ( p1.count() != p2.count() )
3121 for (
int i = 0; i < p1.count(); ++i )
3123 if ( !p1.at( i ).compare( p2.at( i ), epsilon ) )
3131 if ( p1.count() != p2.count() )
3134 for (
int i = 0; i < p1.count(); ++i )
3145 if ( p1.count() != p2.count() )
3148 for (
int i = 0; i < p1.count(); ++i )
3175 return QgsGeometry( smoothLine( *lineString, iterations, offset, minimumDistance, maxAngle ) );
3182 std::unique_ptr< QgsMultiLineString > resultMultiline = qgis::make_unique< QgsMultiLineString> ();
3186 resultMultiline->addGeometry( smoothLine( *( multiLine->
lineStringN( i ) ), iterations, offset, minimumDistance, maxAngle ).release() );
3188 return QgsGeometry( std::move( resultMultiline ) );
3194 return QgsGeometry( smoothPolygon( *poly, iterations, offset, minimumDistance, maxAngle ) );
3201 std::unique_ptr< QgsMultiPolygon > resultMultiPoly = qgis::make_unique< QgsMultiPolygon >();
3205 resultMultiPoly->addGeometry( smoothPolygon( *( multiPoly->
polygonN( i ) ), iterations, offset, minimumDistance, maxAngle ).release() );
3207 return QgsGeometry( std::move( resultMultiPoly ) );
3217 const double offset,
double squareDistThreshold,
double maxAngleRads,
3220 std::unique_ptr< QgsLineString > result = qgis::make_unique< QgsLineString >( line );
3222 for (
unsigned int iteration = 0; iteration < iterations; ++iteration )
3224 outputLine.resize( 0 );
3225 outputLine.reserve( 2 * ( result->numPoints() - 1 ) );
3226 bool skipFirst =
false;
3227 bool skipLast =
false;
3230 QgsPoint p1 = result->pointN( result->numPoints() - 2 );
3236 skipFirst =
angle > maxAngleRads;
3238 for (
int i = 0; i < result->numPoints() - 1; i++ )
3241 QgsPoint p2 = result->pointN( i + 1 );
3243 double angle = M_PI;
3244 if ( i == 0 && isRing )
3246 QgsPoint p3 = result->pointN( result->numPoints() - 2 );
3250 else if ( i < result->numPoints() - 2 )
3252 QgsPoint p3 = result->pointN( i + 2 );
3256 else if ( i == result->numPoints() - 2 && isRing )
3263 skipLast =
angle < M_PI - maxAngleRads ||
angle > M_PI + maxAngleRads;
3266 if ( i == 0 || i >= result->numPoints() - 2
3291 skipFirst = skipLast;
3294 if ( isRing && outputLine.at( 0 ) != outputLine.at( outputLine.count() - 1 ) )
3295 outputLine << outputLine.at( 0 );
3297 result->setPoints( outputLine );
3302 std::unique_ptr<QgsLineString> QgsGeometry::smoothLine(
const QgsLineString &line,
const unsigned int iterations,
const double offset,
double minimumDistance,
double maxAngle )
const
3304 double maxAngleRads = maxAngle * M_PI / 180.0;
3305 double squareDistThreshold = minimumDistance > 0 ? minimumDistance * minimumDistance : -1;
3306 return smoothCurve( line, iterations, offset, squareDistThreshold, maxAngleRads,
false );
3309 std::unique_ptr<QgsPolygon> QgsGeometry::smoothPolygon(
const QgsPolygon &polygon,
const unsigned int iterations,
const double offset,
double minimumDistance,
double maxAngle )
const
3311 double maxAngleRads = maxAngle * M_PI / 180.0;
3312 double squareDistThreshold = minimumDistance > 0 ? minimumDistance * minimumDistance : -1;
3313 std::unique_ptr< QgsPolygon > resultPoly = qgis::make_unique< QgsPolygon >();
3316 squareDistThreshold, maxAngleRads,
true ).release() );
3321 squareDistThreshold, maxAngleRads,
true ).release() );
3326 QgsGeometry QgsGeometry::convertToPoint(
bool destMultipart )
const
3334 if ( ( destMultipart && srcIsMultipart ) ||
3335 ( !destMultipart && !srcIsMultipart ) )
3340 if ( destMultipart )
3349 if ( multiPoint.count() == 1 )
3360 if ( !destMultipart )
3377 if ( !line.isEmpty() )
3386 if ( !destMultipart )
3417 QgsGeometry QgsGeometry::convertToLine(
bool destMultipart )
const
3427 if ( multiPoint.count() < 2 )
3430 if ( destMultipart )
3440 if ( ( destMultipart && srcIsMultipart ) ||
3441 ( !destMultipart && ! srcIsMultipart ) )
3446 if ( destMultipart )
3450 if ( !line.isEmpty() )
3457 if ( multiLine.count() == 1 )
3474 if ( destMultipart )
3479 else if ( multiLine.count() == 1 )
3490 if ( polygon.count() > 1 )
3494 if ( destMultipart )
3498 multiLine.reserve( polygon.count() );
3505 else if ( polygon.count() == 1 )
3507 if ( destMultipart )
3525 QgsGeometry QgsGeometry::convertToPolygon(
bool destMultipart )
const
3535 if ( multiPoint.count() < 3 )
3538 if ( multiPoint.last() != multiPoint.first() )
3539 multiPoint << multiPoint.first();
3542 if ( destMultipart )
3555 for ( QgsMultiPolylineXY::iterator multiLineIt = multiLine.begin(); multiLineIt != multiLine.end(); ++multiLineIt )
3558 if ( ( *multiLineIt ).count() < 3 )
3560 if ( ( *multiLineIt ).count() == 3 && ( *multiLineIt ).first() == ( *multiLineIt ).last() )
3564 if ( ( *multiLineIt ).first() != ( *multiLineIt ).last() )
3565 *multiLineIt << ( *multiLineIt ).first();
3569 if ( !multiPolygon.isEmpty() )
3571 if ( destMultipart )
3575 else if ( multiPolygon.count() == 1 )
3588 if ( line.count() < 3 )
3590 if ( line.count() == 3 && line.first() == line.last() )
3594 if ( line.first() != line.last() )
3595 line << line.first();
3598 if ( destMultipart )
3614 if ( ( destMultipart && srcIsMultipart ) ||
3615 ( !destMultipart && ! srcIsMultipart ) )
3620 if ( destMultipart )
3624 if ( !polygon.isEmpty() )
3630 if ( multiPolygon.count() == 1 )
3646 return new QgsGeos( geometry );
3651 out << geometry.
asWkb();
3657 QByteArray byteArray;
3659 if ( byteArray.isEmpty() )
3661 geometry.
set(
nullptr );
3665 geometry.
fromWkb( byteArray );
3682 return mHasLocation;
The part_iterator class provides STL-style iterator for const references to geometry parts.
The part_iterator class provides STL-style iterator for geometry parts.
The vertex_iterator class provides STL-style iterator for vertices.
Abstract base class for all geometries.
virtual int ringCount(int part=0) const =0
Returns the number of rings of which this geometry is built.
virtual bool addZValue(double zValue=0)=0
Adds a z-dimension to the geometry, initialized to a preset value.
virtual QgsAbstractGeometry * boundary() const =0
Returns the closure of the combinatorial boundary of the geometry (ie the topological boundary of the...
SegmentationToleranceType
Segmentation tolerance as maximum angle or maximum difference between approximation and circle.
virtual bool dropMValue()=0
Drops any measure values which exist in the geometry.
bool is3D() const SIP_HOLDGIL
Returns true if the geometry is 3D and contains a z-value.
virtual int vertexCount(int part=0, int ring=0) const =0
Returns the number of vertices of which this geometry is built.
virtual QgsRectangle boundingBox() const =0
Returns the minimal bounding box for the geometry.
virtual QgsPoint vertexAt(QgsVertexId id) const =0
Returns the point corresponding to a specified vertex id.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
virtual void adjacentVertices(QgsVertexId vertex, QgsVertexId &previousVertex, QgsVertexId &nextVertex) const =0
Returns the vertices adjacent to a specified vertex within a geometry.
virtual bool addMValue(double mValue=0)=0
Adds a measure to the geometry, initialized to a preset value.
virtual double length() const
Returns the planar, 2-dimensional length of the geometry.
QgsWkbTypes::Type wkbType() const SIP_HOLDGIL
Returns the WKB type of the geometry.
virtual bool dropZValue()=0
Drops any z-dimensions which exist in the geometry.
virtual double area() const
Returns the planar, 2-dimensional area of the geometry.
bool isMeasure() const SIP_HOLDGIL
Returns true if the geometry contains m values.
double radius() const SIP_HOLDGIL
Returns the radius of the circle.
static QgsCircle from2Points(const QgsPoint &pt1, const QgsPoint &pt2) SIP_HOLDGIL
Constructs a circle by 2 points on the circle.
bool contains(const QgsPoint &point, double epsilon=1E-8) const
Returns true if the circle contains the point.
static QgsCircle minimalCircleFrom3Points(const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3, double epsilon=1E-8) SIP_HOLDGIL
Constructs the smallest circle from 3 points.
QgsCircularString * toCircularString(bool oriented=false) const
Returns a circular string from the circle.
Circular string geometry type.
static QgsCircularString fromTwoPointsAndCenter(const QgsPoint &p1, const QgsPoint &p2, const QgsPoint ¢er, bool useShortestArc=true)
Creates a circular string with a single arc representing the curve from p1 to p2 with the specified c...
Curve polygon geometry type.
QgsCoordinateSequence coordinateSequence() const override
Retrieves the sequence of geometries, rings and nodes.
virtual QgsPolygon * toPolygon(double tolerance=M_PI_2/90, SegmentationToleranceType toleranceType=MaximumAngle) const
Returns a new polygon geometry corresponding to a segmentized approximation of the curve.
const QgsCurve * interiorRing(int i) const SIP_HOLDGIL
Retrieves an interior ring from the curve polygon.
const QgsCurve * exteriorRing() const SIP_HOLDGIL
Returns the curve polygon's exterior ring.
int numInteriorRings() const SIP_HOLDGIL
Returns the number of interior rings contained with the curve 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.
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.
Orientation
Curve orientation.
QgsPoint center() const SIP_HOLDGIL
Returns the center point.
virtual QgsPolygon * toPolygon(unsigned int segments=36) const
Returns a segmented polygon.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
int numGeometries() const SIP_HOLDGIL
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.
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.
Java-style iterator for const traversal of parts of 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 QgsGeometry::OperationResult addRing(QgsAbstractGeometry *geometry, std::unique_ptr< QgsCurve > ring)
Add an interior ring to a geometry.
static QgsGeometry::OperationResult addPart(QgsAbstractGeometry *geometry, std::unique_ptr< QgsAbstractGeometry > part)
Add a part to multi type geometry.
static bool deleteRing(QgsAbstractGeometry *geom, int ringNum, int partNum=0)
Deletes a ring from a geometry.
Contains geometry relation and modification algorithms.
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< 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< QgsAbstractGeometry > geomFromWkbType(QgsWkbTypes::Type t)
Returns empty geometry from wkb type.
static std::unique_ptr< QgsMultiLineString > fromMultiPolylineXY(const QgsMultiPolylineXY &multiline)
Construct geometry from a multipolyline.
static std::unique_ptr< QgsGeometryCollection > createCollectionOfType(QgsWkbTypes::Type type)
Returns a new geometry collection matching a specified WKB type.
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.
Java-style iterator for traversal of parts of a geometry.
static double sqrDistance2D(const QgsPoint &pt1, const QgsPoint &pt2) SIP_HOLDGIL
Returns the squared 2D distance between two points.
static bool verticesAtDistance(const QgsAbstractGeometry &geometry, double distance, QgsVertexId &previousVertex, QgsVertexId &nextVertex)
Retrieves the vertices which are before and after the interpolated point at a specified distance alon...
static double distanceToVertex(const QgsAbstractGeometry &geom, QgsVertexId id)
Returns the distance along a geometry from its first vertex to the specified vertex.
static double averageAngle(double x1, double y1, double x2, double y2, double x3, double y3) SIP_HOLDGIL
Calculates the average angle (in radians) between the two linear segments from (x1,...
static double lineAngle(double x1, double y1, double x2, double y2) SIP_HOLDGIL
Calculates the direction of line joining two points in radians, clockwise from the north direction.
static double angleBetweenThreePoints(double x1, double y1, double x2, double y2, double x3, double y3) SIP_HOLDGIL
Calculates the angle between the lines AB and BC, where AB and BC described by points a,...
static QgsPoint closestVertex(const QgsAbstractGeometry &geom, const QgsPoint &pt, QgsVertexId &id)
Returns the closest vertex to a geometry for a specified point.
static QgsPointXY interpolatePointOnLine(double x1, double y1, double x2, double y2, double fraction) SIP_HOLDGIL
Interpolates the position of a point a fraction of the way along the line from (x1,...
static void validateGeometry(const QgsGeometry &geometry, QVector< QgsGeometry::Error > &errors, QgsGeometry::ValidationMethod method=QgsGeometry::ValidatorQgisInternal)
Validate geometry and produce a list of geometry errors.
bool hasWhere() const
true if the location available from
QgsPointXY where() const
The coordinates at which the error is located and should be visualized.
QString what() const
A human readable error message containing details about the error.
A geometry is the spatial representation of a feature.
QgsGeometry() SIP_HOLDGIL
Constructor.
OperationResult addPart(const QVector< QgsPointXY > &points, QgsWkbTypes::GeometryType geomType=QgsWkbTypes::UnknownGeometry)
Adds a new part to a the geometry.
bool deleteRing(int ringNum, int partNum=0)
Deletes a ring in polygon or multipolygon.
QVector< QgsPointXY > randomPointsInPolygon(int count, const std::function< bool(const QgsPointXY &) > &acceptPoint, unsigned long seed=0, QgsFeedback *feedback=nullptr, int maxTriesPerPoint=0) const
Returns a list of count random points generated inside a (multi)polygon geometry (if acceptPoint is s...
double hausdorffDistanceDensify(const QgsGeometry &geom, double densifyFraction) const
Returns the Hausdorff distance between this geometry and geom.
QgsGeometry densifyByCount(int extraNodesPerSegment) const
Returns a copy of the geometry which has been densified by adding the specified number of extra nodes...
QgsGeometry clipped(const QgsRectangle &rectangle)
Clips the geometry using the specified rectangle.
JoinStyle
Join styles for buffers.
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.
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
void adjacentVertices(int atVertex, int &beforeVertex, int &afterVertex) const
Returns the indexes of the vertices before and after the given vertex index.
QgsMultiPolygonXY asMultiPolygon() const
Returns the contents of the geometry as a multi-polygon.
bool deleteVertex(int atVertex)
Deletes the vertex at the given position number and item (first number is index 0)
double length() const
Returns the planar, 2-dimensional length of geometry.
static bool compare(const QgsPolylineXY &p1, const QgsPolylineXY &p2, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compares two polylines for equality within a specified tolerance.
QgsVertexIterator vertices() const
Returns a read-only, Java-style iterator for traversal of vertices of all the geometry,...
QgsGeometry densifyByDistance(double distance) const
Densifies the geometry by adding regularly placed extra nodes inside each segment so that the maximum...
QgsGeometry poleOfInaccessibility(double precision, double *distanceToBoundary=nullptr) const
Calculates the approximate pole of inaccessibility for a surface, which is the most distant internal ...
QgsWkbTypes::Type wkbType() const SIP_HOLDGIL
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
QgsAbstractGeometry::const_part_iterator const_parts_begin() const
Returns STL-style const iterator pointing to the first part of the geometry.
QgsGeometry difference(const QgsGeometry &geometry) const
Returns a geometry representing the points making up this geometry that do not make up other.
static QgsGeometry polygonize(const QVector< QgsGeometry > &geometries)
Creates a GeometryCollection geometry containing possible polygons formed from the constituent linewo...
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.
OperationResult rotate(double rotation, const QgsPointXY ¢er)
Rotate this geometry around the Z axis.
bool touches(const QgsGeometry &geometry) const
Returns true if the geometry touches another geometry.
static QgsGeometry fromQPointF(QPointF point) SIP_HOLDGIL
Construct geometry from a QPointF.
void transformVertices(const std::function< QgsPoint(const QgsPoint &) > &transform)
Transforms the vertices from the geometry in place, applying the transform function to every vertex.
QgsGeometry nearestPoint(const QgsGeometry &other) const
Returns the nearest (closest) point on this geometry to another geometry.
QgsGeometry makeDifference(const QgsGeometry &other) const
Returns the geometry formed by modifying this geometry such that it does not intersect the other geom...
static QgsGeometry collectGeometry(const QVector< QgsGeometry > &geometries)
Creates a new multipart geometry from a list of QgsGeometry objects.
QVector< QgsGeometry > coerceToType(QgsWkbTypes::Type type) const
Attempts to coerce this geometry into the specified destination type.
static QgsGeometry fromMultiPolylineXY(const QgsMultiPolylineXY &multiline)
Creates a new geometry from a QgsMultiPolylineXY object.
OperationResult translate(double dx, double dy, double dz=0.0, double dm=0.0)
Translates this geometry by dx, dy, dz and dm.
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
static QgsGeometry unaryUnion(const QVector< QgsGeometry > &geometries)
Compute the unary union on a list of geometries.
QgsGeometry variableWidthBufferByM(int segments) const
Calculates a variable width buffer for a (multi)linestring geometry, where the width at each node is ...
static QgsGeometry fromPolylineXY(const QgsPolylineXY &polyline)
Creates a new LineString geometry from a list of QgsPointXY points.
QgsMultiPointXY asMultiPoint() const
Returns the contents of the geometry as a multi-point.
QgsPoint vertexAt(int atVertex) const
Returns coordinates of a vertex.
QgsPointXY closestVertex(const QgsPointXY &point, int &closestVertexIndex, int &previousVertexIndex, int &nextVertexIndex, double &sqrDist) const
Returns the vertex closest to the given point, the corresponding vertex index, squared distance snap ...
BufferSide
Side of line to buffer.
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.
OperationResult reshapeGeometry(const QgsLineString &reshapeLineString)
Replaces a part of this geometry with another line.
bool disjoint(const QgsGeometry &geometry) const
Returns true if the geometry is disjoint of another geometry.
QgsGeometry combine(const QgsGeometry &geometry) const
Returns a geometry representing all the points in this geometry and other (a union geometry operation...
QVector< QgsGeometry > asGeometryCollection() const
Returns contents of the geometry as a list of geometries.
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.
OperationResult addRing(const QVector< QgsPointXY > &ring)
Adds a new ring to this geometry.
QgsAbstractGeometry * get()
Returns a modifiable (non-const) reference to the underlying abstract geometry primitive.
Q_DECL_DEPRECATED OperationResult splitGeometry(const QVector< QgsPointXY > &splitLine, QVector< QgsGeometry > &newGeometries, bool topological, QVector< QgsPointXY > &topologyTestPoints, bool splitFeature=true)
Splits this geometry according to a given line.
static QgsGeometry fromRect(const QgsRectangle &rect) SIP_HOLDGIL
Creates a new geometry from a QgsRectangle.
double sqrDistToVertexAt(QgsPointXY &point SIP_IN, int atVertex) const
Returns the squared Cartesian distance between the given point to the given vertex index (vertex at t...
bool isMultipart() const SIP_HOLDGIL
Returns true if WKB of the geometry is of WKBMulti* type.
QgsGeometry intersection(const QgsGeometry &geometry) const
Returns a geometry representing the points shared by this geometry and other.
static 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.
QgsGeometry convertToType(QgsWkbTypes::GeometryType destType, bool destMultipart=false) const
Try to convert the geometry to the requested type.
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.
bool isGeosValid(QgsGeometry::ValidityFlags flags=QgsGeometry::ValidityFlags()) const
Checks validity of the geometry using GEOS.
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 insertVertex(double x, double y, int beforeVertex)
Insert a new vertex before the given vertex index, ring and item (first number is index 0) If the req...
static Q_DECL_DEPRECATED QgsPolygonXY createPolygonFromQPolygonF(const QPolygonF &polygon)
Creates a QgsPolygonXYfrom a QPolygonF.
bool convertToSingleType()
Converts multi type geometry into single type geometry e.g.
QPointF asQPointF() const SIP_HOLDGIL
Returns contents of the geometry as a QPointF if wkbType is WKBPoint, otherwise returns a null QPoint...
EndCapStyle
End cap styles for buffers.
static QgsGeometry fromPointXY(const QgsPointXY &point) SIP_HOLDGIL
Creates a new geometry from a QgsPointXY object.
QgsWkbTypes::GeometryType type
bool requiresConversionToStraightSegments() const
Returns true if the geometry is a curved geometry type which requires conversion to display as straig...
OperationResult
Success or failure of a geometry operation.
@ InvalidBaseGeometry
The base geometry on which the operation is done is invalid or empty.
@ GeometryEngineError
Geometry engine misses a method implemented or an error occurred in the geometry engine.
@ AddPartNotMultiGeometry
The source geometry is not multi.
@ InvalidInputGeometryType
The input geometry (ring, part, split line, etc.) has not the correct geometry type.
@ Success
Operation succeeded.
@ NothingHappened
Nothing happened, without any error.
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.
@ FlagAllowSelfTouchingHoles
Indicates that self-touching holes are permitted. OGC validity states that self-touching holes are NO...
QgsMultiPolylineXY asMultiPolyline() const
Returns the contents of the geometry as a multi-linestring.
QgsGeometry taperedBuffer(double startWidth, double endWidth, int segments) const
Calculates a variable width buffer ("tapered buffer") for a (multi)curve geometry.
bool within(const QgsGeometry &geometry) const
Returns true if the geometry is completely within another geometry.
void convertToStraightSegment(double tolerance=M_PI/180., QgsAbstractGeometry::SegmentationToleranceType toleranceType=QgsAbstractGeometry::MaximumAngle)
Converts the geometry to straight line segments, if it is a curved geometry type.
double area() const
Returns the planar, 2-dimensional area of the geometry.
QgsGeometry centroid() const
Returns the center of mass of a geometry.
bool crosses(const QgsGeometry &geometry) const
Returns true if the geometry crosses another geometry.
QgsGeometry & operator=(QgsGeometry const &rhs)
Creates a deep copy of the object.
QgsGeometry orthogonalize(double tolerance=1.0E-8, int maxIterations=1000, double angleThreshold=15.0) const
Attempts to orthogonalize a line or polygon geometry by shifting vertices to make the geometries angl...
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry)
Creates and returns a new geometry engine.
QgsGeometry makeValid() const
Attempts to make an invalid geometry valid without losing vertices.
double hausdorffDistance(const QgsGeometry &geom) const
Returns the Hausdorff distance between this geometry and geom.
QString lastError() const SIP_HOLDGIL
Returns an error string referring to the last error encountered either when this geometry was created...
QgsGeometryPartIterator parts()
Returns Java-style iterator for traversal of parts of the geometry.
QPolygonF asQPolygonF() const SIP_HOLDGIL
Returns contents of the geometry as a QPolygonF.
QgsGeometry convertToCurves(double distanceTolerance=1e-8, double angleTolerance=1e-8) const
Attempts to convert a non-curved geometry into a curved geometry type (e.g.
QgsGeometry voronoiDiagram(const QgsGeometry &extent=QgsGeometry(), double tolerance=0.0, bool edgesOnly=false) const
Creates a Voronoi diagram for the nodes contained within the geometry.
void set(QgsAbstractGeometry *geometry)
Sets the underlying geometry store.
QgsGeometry convexHull() const
Returns the smallest convex polygon that contains all the points in the geometry.
static QgsGeometry fromPolygonXY(const QgsPolygonXY &polygon)
Creates a new geometry from a QgsPolygon.
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 minimalEnclosingCircle(QgsPointXY ¢er, double &radius, unsigned int segments=36) const
Returns the minimal enclosing circle for the geometry.
QgsGeometry mergeLines() const
Merges any connected lines in a LineString/MultiLineString geometry and converts them to single line ...
static QgsGeometry fromMultiPolygonXY(const QgsMultiPolygonXY &multipoly)
Creates a new geometry from a QgsMultiPolygon.
QgsGeometry buffer(double distance, int segments) const
Returns a buffer region around this geometry having the given width and with a specified number of se...
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
QgsGeometry symDifference(const QgsGeometry &geometry) const
Returns a geometry representing the points making up this geometry that do not make up other.
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...
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 singleSidedBuffer(double distance, int segments, BufferSide side, JoinStyle joinStyle=JoinStyleRound, double miterLimit=2.0) const
Returns a single sided buffer for a (multi)line geometry.
OperationResult transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection direction=QgsCoordinateTransform::ForwardTransform, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
void validateGeometry(QVector< QgsGeometry::Error > &errors, ValidationMethod method=ValidatorQgisInternal, QgsGeometry::ValidityFlags flags=QgsGeometry::ValidityFlags()) const
Validates geometry and produces a list of geometry errors.
bool convertToMultiType()
Converts single type geometry into multitype geometry e.g.
QString asJson(int precision=17) const
Exports the geometry to a GeoJSON string.
static QgsGeometry createWedgeBuffer(const QgsPoint ¢er, double azimuth, double angularWidth, double outerRadius, double innerRadius=0)
Creates a wedge shaped buffer from a center point.
QByteArray asWkb(QgsAbstractGeometry::WkbFlags flags=QgsAbstractGeometry::WkbFlags()) const
Export the geometry to WKB.
QgsGeometry extendLine(double startDistance, double endDistance) const
Extends a (multi)line geometry by extrapolating out the start or end of the line by a specified dista...
static void convertPointList(const QVector< QgsPointXY > &input, QgsPointSequence &output)
Upgrades a point list from QgsPointXY to QgsPoint.
QgsGeometry offsetCurve(double distance, int segments, JoinStyle joinStyle, double miterLimit) const
Returns an offset line at a given distance and side from an input line.
QgsGeometry orientedMinimumBoundingBox() const
Returns the oriented minimum bounding box for the geometry, which is the smallest (by area) rotated r...
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.
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.
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.
bool convertGeometryCollectionToSubclass(QgsWkbTypes::GeometryType geomType)
Converts geometry collection to a the desired geometry type subclass (multi-point,...
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.
QString asWkt(int precision=17) const
Exports the geometry to WKT.
bool moveVertex(double x, double y, int atVertex)
Moves the vertex at the given position number and item (first number is index 0) to the given coordin...
bool isGeosEqual(const QgsGeometry &) const
Compares the geometry with another geometry using GEOS.
double closestSegmentWithContext(const QgsPointXY &point, QgsPointXY &minDistPoint, int &nextVertexIndex, int *leftOrRightOfSegment=nullptr, double epsilon=DEFAULT_SEGMENT_EPSILON) const
Searches for the closest segment of geometry to the given point.
QgsGeometry subdivide(int maxNodes=256) const
Subdivides the geometry.
bool intersects(const QgsRectangle &rectangle) const
Returns true if this geometry exactly intersects with a rectangle.
QgsAbstractGeometry::vertex_iterator vertices_end() const
Returns STL-style iterator pointing to the imaginary vertex after the last vertex of the geometry.
bool deletePart(int partNum)
Deletes part identified by the part number.
QgsGeometry removeInteriorRings(double minimumAllowedArea=-1) const
Removes the interior rings from a (multi)polygon geometry.
bool overlaps(const QgsGeometry &geometry) const
Returns true if the geometry overlaps another geometry.
int avoidIntersections(const QList< QgsVectorLayer * > &avoidIntersectionsLayers, const QHash< QgsVectorLayer *, QSet< QgsFeatureId > > &ignoreFeatures=(QHash< QgsVectorLayer *, QSet< QgsFeatureId > >()))
Modifies geometry to avoid intersections with the layers specified in project properties.
ValidationMethod
Available methods for validating geometries.
@ ValidatorQgisInternal
Use internal QgsGeometryValidator method.
@ ValidatorGeos
Use GEOS validation methods.
QgsGeometry shortestLine(const QgsGeometry &other) const
Returns the shortest line joining this geometry to another geometry.
Does vector analysis using the geos library and handles import, export, exception handling*.
double hausdorffDistanceDensify(const QgsAbstractGeometry *geom, double densifyFraction, QString *errorMsg=nullptr) const
Returns the Hausdorff distance between this geometry and geom.
double hausdorffDistance(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const
Returns the Hausdorff distance between this geometry and geom.
QgsAbstractGeometry * buffer(double distance, int segments, QString *errorMsg=nullptr) const override
double distance(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const override
Calculates the distance between this and geom.
double area(QString *errorMsg=nullptr) const override
double length(QString *errorMsg=nullptr) const override
This class offers geometry processing methods.
QgsGeometry poleOfInaccessibility(double precision, double *distanceFromBoundary=nullptr) const
Calculates the approximate pole of inaccessibility for a surface, which is the most distant internal ...
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 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...
static QVector< QgsPointXY > randomPointsInPolygon(const QgsGeometry &polygon, int count, const std::function< bool(const QgsPointXY &) > &acceptPoint, unsigned long seed=0, QgsFeedback *feedback=nullptr, int maxTriesPerPoint=0)
Returns a list of count random points generated inside a polygon geometry (if acceptPoint is specifie...
QgsGeometry convertToCurves(double distanceTolerance, double angleTolerance) const
Attempts to convert a non-curved geometry into a curved geometry type (e.g.
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.
int numPoints() const override SIP_HOLDGIL
Returns the number of points in the curve.
bool dropZValue() override
Drops any z-dimensions which exist in the geometry.
static QgsLineString * fromQPolygonF(const QPolygonF &polygon)
Returns a new linestring from a QPolygonF polygon input.
QgsLineString * clone() const override
Clones the geometry by performing a deep copy.
bool dropMValue() override
Drops any measure values which exist in the geometry.
const double * xData() const
Returns a const pointer to the x vertex data.
Perform transforms between map coordinates and device coordinates.
QgsPointXY transform(const QgsPointXY &p) const
Transform the point p from map (world) coordinates to device coordinates.
Multi line string geometry collection.
QgsLineString * lineStringN(int index)
Returns the line string with the specified index.
Multi point geometry collection.
QgsPoint * pointN(int index)
Returns the point with the specified index.
Multi polygon geometry collection.
QgsPolygon * polygonN(int index)
Returns the polygon with the specified index.
A class to represent a 2D point.
void setX(double x) SIP_HOLDGIL
Sets the x value of the point.
void setY(double y) SIP_HOLDGIL
Sets the y value of the point.
QPointF toQPointF() const
Converts a point to a QPointF.
Point geometry type, with support for z-dimension and m-values.
void setX(double x) SIP_HOLDGIL
Sets the point's x-coordinate.
QgsPoint project(double distance, double azimuth, double inclination=90.0) const SIP_HOLDGIL
Returns a new point which corresponds to this point projected by a specified distance with specified ...
A rectangle specified with double values.
bool contains(const QgsRectangle &rect) const
Returns true when rectangle contains other rectangle.
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
bool isNull() const
Test if the rectangle is null (all coordinates zero or after call to setMinimal()).
bool isEmpty() const
Returns true if the rectangle is empty.
Represents a vector layer which manages a vector based data sets.
Java-style iterator for traversal of vertices of a geometry.
static GeometryType geometryType(Type type) SIP_HOLDGIL
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
static bool isMultiType(Type type) SIP_HOLDGIL
Returns true if the WKB type is a multi type.
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
static bool hasM(Type type) SIP_HOLDGIL
Tests whether a WKB type contains m values.
Type
The WKB type describes the number of dimensions a geometry has.
static bool isCurvedType(Type type) SIP_HOLDGIL
Returns true if the WKB type is a curved type or can contain curved geometries.
static Type flatType(Type type) SIP_HOLDGIL
Returns the flat type for a WKB type.
static Type multiType(Type type) SIP_HOLDGIL
Returns the multi type for a WKB type.
static bool hasZ(Type type) SIP_HOLDGIL
Tests whether a WKB type contains the z-dimension.
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
Contains geos related utilities and functions.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
#define Q_NOWARN_DEPRECATED_POP
#define Q_NOWARN_DEPRECATED_PUSH
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
QVector< QgsRingSequence > QgsCoordinateSequence
QVector< QgsPointSequence > QgsRingSequence
QVector< QgsPoint > QgsPointSequence
QMap< int, QVariant > QgsAttributeMap
QDataStream & operator>>(QDataStream &in, QgsGeometry &geometry)
Reads a geometry from stream in into geometry. QGIS version compatibility is not guaranteed.
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)
QVector< QgsPolylineXY > QgsPolygonXY
Polygon: first item of the list is outer ring, inner rings (if any) start from second item.
QVector< QgsPolylineXY > QgsMultiPolylineXY
A collection of QgsPolylines that share a common collection of attributes.
QVector< QgsPointXY > QgsMultiPointXY
A collection of QgsPoints that share a common collection of attributes.
QVector< QgsPointXY > QgsPolylineXY
Polyline as represented as a vector of two-dimensional points.
QVector< QgsPolygonXY > QgsMultiPolygonXY
A collection of QgsPolygons that share a common collection of attributes.
QgsPointSequence QgsPolyline
Polyline as represented as a vector of points.
std::unique_ptr< QgsAbstractGeometry > _qgis_lwgeom_make_valid(const QgsAbstractGeometry *lwgeom_in, QString &errorMessage)
Implementation of QgsGeometry::makeValid(). Not a public API.
std::unique_ptr< QgsAbstractGeometry > geometry
Utility class for identifying a unique vertex within a geometry.
bool isValid() const SIP_HOLDGIL
Returns true if the vertex id is valid.
@ SegmentVertex
The actual start or end point of a segment.