20 #include <nlohmann/json.hpp> 
   29 #if ( GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR<8 ) 
   61   std::unique_ptr< QgsAbstractGeometry > 
geometry;
 
   71   if ( !d->
ref.deref() )
 
   79   d->
ref = QAtomicInt( 1 );
 
   86   d->
ref = QAtomicInt( 1 );
 
   92   mLastError = other.mLastError;
 
  100     if ( !d->
ref.deref() )
 
  105     mLastError = other.mLastError;
 
  112 void QgsGeometry::detach()
 
  117   std::unique_ptr< QgsAbstractGeometry > cGeom;
 
  119     cGeom.reset( d->
geometry->clone() );
 
  121   reset( std::move( cGeom ) );
 
  124 void QgsGeometry::reset( std::unique_ptr<QgsAbstractGeometry> newGeometry )
 
  128     ( void )d->
ref.deref();
 
  131   d->
geometry = std::move( newGeometry );
 
  147   if ( d->
geometry.get() == geometry )
 
  152   reset( std::unique_ptr< QgsAbstractGeometry >( geometry ) );
 
  192   return QgsGeometry( std::make_unique< QgsLineString >( polyline ) );
 
  237   std::unique_ptr< QgsLineString > ext = std::make_unique< QgsLineString >(
 
  238       QVector< double >() << rect.
xMinimum()
 
  243       QVector< double >() << rect.
yMinimum()
 
  248   std::unique_ptr< QgsPolygon > polygon = std::make_unique< QgsPolygon >();
 
  249   polygon->setExteriorRing( ext.release() );
 
  266       if ( g.isMultipart() )
 
  268         for ( 
auto p = g.const_parts_begin(); p != g.const_parts_end(); ++p )
 
  270           collected.
addPart( ( *p )->clone() );
 
  284   if ( std::abs( angularWidth ) >= 360.0 )
 
  286     std::unique_ptr< QgsCompoundCurve > outerCc = std::make_unique< QgsCompoundCurve >();
 
  291     std::unique_ptr< QgsCurvePolygon > cp = std::make_unique< QgsCurvePolygon >();
 
  292     cp->setExteriorRing( outerCc.release() );
 
  296       std::unique_ptr< QgsCompoundCurve > innerCc = std::make_unique< QgsCompoundCurve >();
 
  301       cp->setInteriorRings( { innerCc.release() } );
 
  307   std::unique_ptr< QgsCompoundCurve > wedge = std::make_unique< QgsCompoundCurve >();
 
  309   const double startAngle = azimuth - angularWidth * 0.5;
 
  310   const double endAngle = azimuth + angularWidth * 0.5;
 
  315   const bool useShortestArc = angularWidth <= 180.0;
 
  333   std::unique_ptr< QgsCurvePolygon > cp = std::make_unique< QgsCurvePolygon >();
 
  334   cp->setExteriorRing( wedge.release() );
 
  412   d->
geometry->adjacentVertices( 
id, prevVertex, nextVertex );
 
  448   return d->
geometry->vertexAngle( v2 );
 
  467   d->
geometry->adjacentVertices( 
id, beforeVertexId, afterVertexId );
 
  505   return d->
geometry->moveVertex( 
id, p );
 
  538   return d->
geometry->deleteVertex( 
id );
 
  590   return d->
geometry->insertVertex( 
id, point );
 
  606   return d->
geometry->vertexAt( vId );
 
  626   result.mLastError = mLastError;
 
  635     return QgsGeometry( std::make_unique< QgsLineString >( *qgsgeometry_cast< const QgsPoint * >( d->
geometry.get() ), *qgsgeometry_cast< const QgsPoint * >( other.
constGet() ) ) );
 
  641   result.mLastError = mLastError;
 
  663     int &nextVertexIndex,
 
  664     int *leftOrRightOfSegment,
 
  665     double epsilon )
 const 
  675   double sqrDist = d->
geometry->closestSegment( 
QgsPoint( point ), segmentPt,  vertexAfter, leftOrRightOfSegment, epsilon );
 
  679   minDistPoint.
setX( segmentPt.
x() );
 
  680   minDistPoint.
setY( segmentPt.
y() );
 
  687   std::unique_ptr< QgsLineString > ringLine = std::make_unique< QgsLineString >( ring );
 
  688   return addRing( ringLine.release() );
 
  693   std::unique_ptr< QgsCurve > r( ring );
 
  713   std::unique_ptr< QgsAbstractGeometry > partGeom;
 
  714   if ( points.size() == 1 )
 
  716     partGeom = std::make_unique< QgsPoint >( points[0] );
 
  718   else if ( points.size() > 1 )
 
  720     std::unique_ptr< QgsLineString > ringLine = std::make_unique< QgsLineString >();
 
  721     ringLine->setPoints( points );
 
  722     partGeom = std::move( ringLine );
 
  724   return addPart( partGeom.release(), geomType );
 
  729   std::unique_ptr< QgsAbstractGeometry > p( part );
 
  735         reset( std::make_unique< QgsMultiPoint >() );
 
  738         reset( std::make_unique< QgsMultiLineString >() );
 
  741         reset( std::make_unique< QgsMultiPolygon >() );
 
  745         return QgsGeometry::OperationResult::AddPartNotMultiGeometry;
 
  781     QVector<QgsGeometry> results;
 
  782     results.reserve( 
parts.count() );
 
  789     if ( results.isEmpty() )
 
  793     for ( 
const QgsGeometry &result : std::as_const( results ) )
 
  802     newPoly->removeInteriorRings( minimumRingArea );
 
  816   d->
geometry->transform( QTransform::fromTranslate( dx, dy ), dz, 1.0, dm );
 
  829   QTransform t = QTransform::fromTranslate( center.
x(), center.
y() );
 
  830   t.rotate( -rotation );
 
  831   t.translate( -center.
x(), -center.
y() );
 
  849     return QgsGeometry::OperationResult::InvalidBaseGeometry;
 
  852   QVector<QgsGeometry > newGeoms;
 
  873       *
this = newGeoms.takeAt( 0 );
 
  874     newGeometries = newGeoms;
 
  880       return QgsGeometry::OperationResult::Success;
 
  884       return QgsGeometry::OperationResult::GeometryEngineError;
 
  886       return QgsGeometry::OperationResult::InvalidBaseGeometry;
 
  888       return QgsGeometry::OperationResult::InvalidInputGeometryType;
 
  890       return QgsGeometry::OperationResult::SplitCannotSplitPoint;
 
  892       return QgsGeometry::OperationResult::NothingHappened;
 
  903   std::unique_ptr<QgsLineString> segmentizedLine( curve->
curveToLine() );
 
  905   segmentizedLine->points( points );
 
  910     if ( preserveCircular )
 
  912       for ( 
int i = 0; i < newGeometries.count(); ++i )
 
  931   std::unique_ptr< QgsAbstractGeometry > geom( 
geos.reshapeGeometry( reshapeLineString, &errorCode, &mLastError ) );
 
  934     reset( std::move( geom ) );
 
  970   std::unique_ptr< QgsAbstractGeometry > diffGeom( 
geos.intersection( other.
constGet(), &mLastError ) );
 
  976   reset( std::move( diffGeom ) );
 
  990   std::unique_ptr< QgsAbstractGeometry > diffGeom( 
geos.intersection( other.
constGet(), &mLastError ) );
 
  994     result.mLastError = mLastError;
 
 1028   auto l_boundary = boundary.length();
 
 1030   if ( ( points.length() == 0 ) || ( l_boundary == 3 ) )
 
 1032     switch ( l_boundary )
 
 1039         boundary.pop_back();
 
 1044         boundary.pop_back();
 
 1046         boundary.pop_back();
 
 1063     circ_mec = __recMinimalEnclosingCircle( points, boundary );
 
 1067       boundary.append( pxy );
 
 1068       circ_mec = __recMinimalEnclosingCircle( points, boundary );
 
 1092   QgsCircle circ = __recMinimalEnclosingCircle( P, R );
 
 1113   return engine.
orthogonalize( tolerance, maxIterations, angleThreshold );
 
 1122   return QgsGeometry( d->
geometry->snappedToGrid( hSpacing, vSpacing, dSpacing, mSpacing ) );
 
 1131   return d->
geometry->removeDuplicateNodes( epsilon, useZValues );
 
 1159   return geos.intersects( geometry.d->
geometry.get(), &mLastError );
 
 1169   return d->
geometry->boundingBoxIntersects( rectangle );
 
 1192   return geos.contains( &pt, &mLastError );
 
 1204   return geos.contains( geometry.d->
geometry.get(), &mLastError );
 
 1216   return geos.disjoint( geometry.d->
geometry.get(), &mLastError );
 
 1227   if ( d == geometry.d )
 
 1247   return geos.touches( geometry.d->
geometry.get(), &mLastError );
 
 1259   return geos.overlaps( geometry.d->
geometry.get(), &mLastError );
 
 1271   return geos.within( geometry.d->
geometry.get(), &mLastError );
 
 1283   return geos.crosses( geometry.d->
geometry.get(), &mLastError );
 
 1312   QVector< QgsGeometry > res;
 
 1350       std::unique_ptr< QgsAbstractGeometry > exterior( ( *part )->clone() );
 
 1351       if ( 
QgsCurve *curve = qgsgeometry_cast< QgsCurve * >( exterior.get() ) )
 
 1355           std::unique_ptr< QgsCurvePolygon > cp = std::make_unique< QgsCurvePolygon >();
 
 1356           cp->setExteriorRing( curve );
 
 1358           gc->addGeometry( cp.release() );
 
 1362           std::unique_ptr< QgsPolygon > p = std::make_unique< QgsPolygon  >();
 
 1363           p->setExteriorRing( qgsgeometry_cast< QgsLineString * >( curve ) );
 
 1365           gc->addGeometry( p.release() );
 
 1378     std::unique_ptr< QgsMultiPoint > mp = std::make_unique< QgsMultiPoint >();
 
 1380     QSet< QgsPoint > added;
 
 1383       if ( added.contains( *vertex ) )
 
 1385       mp->addGeometry( ( *vertex ).clone() );
 
 1386       added.insert( *vertex );
 
 1420     res.reserve( 
parts->partCount() );
 
 1421     for ( 
int i = 0; i < 
parts->partCount( ); i++ )
 
 1438       return convertToPoint( destMultipart );
 
 1441       return convertToLine( destMultipart );
 
 1444       return convertToPolygon( destMultipart );
 
 1496   if ( !multiGeom || multiGeom->
partCount() < 1 )
 
 1499   std::unique_ptr< QgsAbstractGeometry > firstPart( multiGeom->
geometryN( 0 )->
clone() );
 
 1500   reset( std::move( firstPart ) );
 
 1511   std::unique_ptr<QgsGeometryCollection> resGeom;
 
 1515       resGeom = std::make_unique<QgsMultiPoint>();
 
 1518       resGeom = std::make_unique<QgsMultiLineString>();
 
 1521       resGeom = std::make_unique<QgsMultiPolygon>();
 
 1534       resGeom->addGeometry( g->
clone() );
 
 1537   set( resGeom.release() );
 
 1567   std::unique_ptr< QgsLineString > segmentizedLine;
 
 1569   if ( doSegmentation )
 
 1577     line = segmentizedLine.get();
 
 1581     line = qgsgeometry_cast<QgsLineString *>( d->
geometry.get() );
 
 1589   polyLine.resize( nVertices );
 
 1591   const double *xData = line->
xData();
 
 1592   const double *yData = line->
yData();
 
 1593   for ( 
int i = 0; i < nVertices; ++i )
 
 1595     data->
setX( *xData++ );
 
 1596     data->
setY( *yData++ );
 
 1611   std::unique_ptr< QgsPolygon > segmentized;
 
 1612   if ( doSegmentation )
 
 1619     segmentized.reset( curvePoly->
toPolygon() );
 
 1620     p = segmentized.get();
 
 1624     p = qgsgeometry_cast<QgsPolygon *>( d->
geometry.get() );
 
 1633   convertPolygon( *p, polygon );
 
 1653   for ( 
int i = 0; i < nPoints; ++i )
 
 1656     multiPoint[i].
setX( pt->
x() );
 
 1657     multiPoint[i].setY( pt->
y() );
 
 1670   if ( !geomCollection )
 
 1682   mpl.reserve( nLines );
 
 1683   for ( 
int i = 0; i < nLines; ++i )
 
 1686     std::unique_ptr< QgsLineString > segmentized;
 
 1689       const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( geomCollection->
geometryN( i ) );
 
 1695       line = segmentized.get();
 
 1700     polyLine.resize( nVertices );
 
 1702     const double *xData = line->
xData();
 
 1703     const double *yData = line->
yData();
 
 1704     for ( 
int i = 0; i < nVertices; ++i )
 
 1706       data->
setX( *xData++ );
 
 1707       data->
setY( *yData++ );
 
 1710     mpl.append( polyLine );
 
 1723   if ( !geomCollection )
 
 1729   if ( nPolygons < 1 )
 
 1735   mp.reserve( nPolygons );
 
 1736   for ( 
int i = 0; i < nPolygons; ++i )
 
 1738     const QgsPolygon *polygon = qgsgeometry_cast<const QgsPolygon *>( geomCollection->
geometryN( i ) );
 
 1753     convertPolygon( *polygon, poly );
 
 1754     mp.push_back( poly );
 
 1769   double geosArea = g.
area();
 
 1770   double qgisArea = 0;
 
 1774     qgisArea = surface->
area();
 
 1779   return g.
area( &mLastError );
 
 1797   return g.
length( &mLastError );
 
 1810     return qgsgeometry_cast< const QgsPoint * >( d->
geometry.get() )->distance( *qgsgeometry_cast< const QgsPoint * >( geom.
constGet() ) );
 
 1871   return d->
geometry->vertices_begin();
 
 1878   return d->
geometry->vertices_end();
 
 1908   return d->
geometry->const_parts_begin();
 
 1915   return d->
geometry->const_parts_end();
 
 1944   std::unique_ptr<QgsAbstractGeometry> geom( g.
buffer( 
distance, segments, &mLastError ) );
 
 1948     result.mLastError = mLastError;
 
 1967     result.mLastError = mLastError;
 
 1983     QVector<QgsGeometry> results;
 
 1984     results.reserve( 
parts.count() );
 
 1991     if ( results.isEmpty() )
 
 1995     for ( 
const QgsGeometry &result : std::as_const( results ) )
 
 2009     std::unique_ptr< QgsAbstractGeometry > offsetGeom( 
geos.offsetCurve( 
distance, segments, joinStyle, miterLimit, &mLastError ) );
 
 2013       result.mLastError = mLastError;
 
 2017     if ( 
const QgsCurve *
offsetCurve = qgsgeometry_cast< const QgsCurve * >( offsetGeom.get() ) )
 
 2020       if ( newOrientation != prevOrientation )
 
 2023         std::unique_ptr< QgsAbstractGeometry > flipped( 
offsetCurve->reversed() );
 
 2024         offsetGeom = std::move( flipped );
 
 2041     QVector<QgsGeometry> results;
 
 2042     results.reserve( 
parts.count() );
 
 2049     if ( results.isEmpty() )
 
 2053     for ( 
const QgsGeometry &result : std::as_const( results ) )
 
 2063     std::unique_ptr< QgsAbstractGeometry > bufferGeom = 
geos.singleSidedBuffer( 
distance, segments, side,
 
 2064         joinStyle, miterLimit, &mLastError );
 
 2068       result.mLastError = mLastError;
 
 2079   return engine.
taperedBuffer( startWidth, endWidth, segments );
 
 2099     QVector<QgsGeometry> results;
 
 2100     results.reserve( 
parts.count() );
 
 2107     if ( results.isEmpty() )
 
 2111     for ( 
const QgsGeometry &result : std::as_const( results ) )
 
 2123     std::unique_ptr< QgsLineString > newLine( line->
clone() );
 
 2124     newLine->extend( startDistance, endDistance );
 
 2138   std::unique_ptr< QgsAbstractGeometry > simplifiedGeom( 
geos.simplify( tolerance, &mLastError ) );
 
 2139   if ( !simplifiedGeom )
 
 2142     result.mLastError = mLastError;
 
 2145   return QgsGeometry( std::move( simplifiedGeom ) );
 
 2180     c.get()->dropZValue();
 
 2181     c.get()->dropMValue();
 
 2189   result.mLastError = mLastError;
 
 2204   result.mLastError = mLastError;
 
 2226   result.mLastError = mLastError;
 
 2241   result.mLastError = mLastError;
 
 2249     return std::numeric_limits< double >::quiet_NaN();
 
 2255   return geos.minimumClearance( &mLastError );
 
 2269   result.mLastError = mLastError;
 
 2281   std::unique_ptr< QgsAbstractGeometry > cHull( 
geos.convexHull( &mLastError ) );
 
 2285     geom.mLastError = mLastError;
 
 2301   result.mLastError = mLastError;
 
 2314   QgsGeometry result = 
geos.delaunayTriangulation( tolerance, edgesOnly );
 
 2315   result.mLastError = mLastError;
 
 2329   result.mLastError = mLastError;
 
 2343   result.mLastError = mLastError;
 
 2355   std::unique_ptr< QgsAbstractGeometry > segmentizedCopy;
 
 2358     segmentizedCopy.reset( d->
geometry->segmentize() );
 
 2359     geom = segmentizedCopy.get();
 
 2364   std::unique_ptr< QgsAbstractGeometry > result( 
geos.subdivide( maxNodes, &mLastError ) );
 
 2368     geom.mLastError = mLastError;
 
 2394     for ( 
int part = 0; part < collection->
numGeometries(); ++part )
 
 2396       const QgsCurve *candidate = qgsgeometry_cast< const QgsCurve * >( collection->
geometryN( part ) );
 
 2399       const double candidateLength = candidate->
length();
 
 2411     curve = qgsgeometry_cast< const QgsCurve * >( line.
constGet() );
 
 2440   return geos.lineLocatePoint( *( 
static_cast< QgsPoint * 
>( point.d->
geometry.get() ) ), &mLastError );
 
 2460   if ( previous == next )
 
 2507   std::unique_ptr< QgsAbstractGeometry > resultGeom( 
geos.intersection( geometry.d->
geometry.get(), &mLastError ) );
 
 2512     geom.mLastError = mLastError;
 
 2528   std::unique_ptr< QgsAbstractGeometry > resultGeom( 
geos.combine( geometry.d->
geometry.get(), &mLastError ) );
 
 2532     geom.mLastError = mLastError;
 
 2554   result.mLastError = mLastError;
 
 2568   std::unique_ptr< QgsAbstractGeometry > resultGeom( 
geos.difference( geometry.d->
geometry.get(), &mLastError ) );
 
 2572     geom.mLastError = mLastError;
 
 2588   std::unique_ptr< QgsAbstractGeometry > resultGeom( 
geos.symDifference( geometry.d->
geometry.get(), &mLastError ) );
 
 2592     geom.mLastError = mLastError;
 
 2602   return engine.
extrude( x, y );
 
 2610     return QVector< QgsPointXY >();
 
 2618     return QVector< QgsPointXY >();
 
 2636   QVector<QgsGeometry> geometryList;
 
 2639     return geometryList;
 
 2646     geometryList.reserve( numGeom );
 
 2647     for ( 
int i = 0; i < numGeom; ++i )
 
 2654     geometryList.append( *
this );
 
 2657   return geometryList;
 
 2671   if ( 
const QgsGeometryCollection *collection = qgsgeometry_cast< const QgsGeometryCollection *>( part ) )
 
 2673     if ( collection->numGeometries() > 0 )
 
 2674       part = collection->geometryN( 0 );
 
 2679   if ( 
const QgsCurve *curve = qgsgeometry_cast< const QgsCurve * >( part ) )
 
 2680     return curve->asQPolygonF();
 
 2681   else if ( 
const QgsCurvePolygon *polygon = qgsgeometry_cast< const QgsCurvePolygon * >( part ) )
 
 2682     return polygon->exteriorRing() ? polygon->exteriorRing()->asQPolygonF() : QPolygonF();
 
 2725   bool haveInvalidGeometry = 
false;
 
 2729     reset( std::move( diffGeom ) );
 
 2732   if ( geomTypeBeforeModification != 
wkbType() )
 
 2734   if ( haveInvalidGeometry )
 
 2747 #if GEOS_VERSION_MAJOR>3 || ( GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR>=8 ) 
 2749   std::unique_ptr< QgsAbstractGeometry > g( 
geos.makeValid( &mLastError ) );
 
 2751   std::unique_ptr< QgsAbstractGeometry > g( _qgis_lwgeom_make_valid( d->
geometry.get(), mLastError ) );
 
 2755   result.mLastError = mLastError;
 
 2772       if ( 
const QgsCurvePolygon *cp = qgsgeometry_cast< const QgsCurvePolygon * >( g ) )
 
 2774         std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
 
 2775         corrected->forceRHR();
 
 2776         newCollection->addGeometry( corrected.release() );
 
 2780         newCollection->addGeometry( g->
clone() );
 
 2789       std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
 
 2790       corrected->forceRHR();
 
 2860   return d->
geometry->isValid( mLastError, 
static_cast< int >( flags ) );
 
 2870   return geos.isSimple( &mLastError );
 
 2910   return geos.isEqual( g.d->
geometry.get(), &mLastError );
 
 2918   std::unique_ptr< QgsAbstractGeometry > geom( 
geos.combine( geometries, &error ) );
 
 2920   result.mLastError = error;
 
 2928   QVector<const QgsAbstractGeometry *> geomV2List;
 
 2931     if ( !( g.isNull() ) )
 
 2933       geomV2List.append( g.constGet() );
 
 2939   result.mLastError = error;
 
 2950   std::unique_ptr< QgsAbstractGeometry > straightGeom( d->
geometry->segmentize( tolerance, toleranceType ) );
 
 2951   reset( std::move( straightGeom ) );
 
 2961   return d->
geometry->hasCurvedSegments();
 
 2972   d->
geometry->transform( ct, direction, transformZ );
 
 2984   d->
geometry->transform( ct, zTranslate, zScale, mTranslate, mScale );
 
 3006   std::unique_ptr< QgsAbstractGeometry > resultGeom = 
geos.clip( rectangle, &mLastError );
 
 3010     result.mLastError = mLastError;
 
 3024 static bool vertexIndexInfo( 
const QgsAbstractGeometry *g, 
int vertexIndex, 
int &partIndex, 
int &ringIndex, 
int &vertex )
 
 3026   if ( vertexIndex < 0 )
 
 3029   if ( 
const QgsGeometryCollection *geomCollection = qgsgeometry_cast<const QgsGeometryCollection *>( g ) )
 
 3033     for ( 
int i = 0; i < geomCollection->numGeometries(); ++i )
 
 3039       for ( 
int k = 0; k < part->
ringCount(); ++k )
 
 3042       if ( vertexIndex < numPoints )
 
 3045         return vertexIndexInfo( part, vertexIndex, nothing, ringIndex, vertex ); 
 
 3047       vertexIndex -= numPoints;
 
 3048       offset += numPoints;
 
 3052   else if ( 
const QgsCurvePolygon *curvePolygon = qgsgeometry_cast<const QgsCurvePolygon *>( g ) )
 
 3054     const QgsCurve *ring = curvePolygon->exteriorRing();
 
 3055     if ( vertexIndex < ring->numPoints() )
 
 3059       vertex = vertexIndex;
 
 3064     for ( 
int i = 0; i < curvePolygon->numInteriorRings(); ++i )
 
 3066       const QgsCurve *ring = curvePolygon->interiorRing( i );
 
 3067       if ( vertexIndex < ring->numPoints() )
 
 3070         vertex = vertexIndex;
 
 3077   else if ( 
const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( g ) )
 
 3079     if ( vertexIndex < curve->numPoints() )
 
 3083       vertex = vertexIndex;
 
 3087   else if ( qgsgeometry_cast<const QgsPoint *>( g ) )
 
 3089     if ( vertexIndex == 0 )
 
 3110   bool res = vertexIndexInfo( d->
geometry.get(), nr, 
id.part, 
id.ring, 
id.vertex );
 
 3116   if ( 
const QgsGeometryCollection *geomCollection = qgsgeometry_cast<const QgsGeometryCollection *>( g ) )
 
 3118     g = geomCollection->geometryN( 
id.part );
 
 3121   if ( 
const QgsCurvePolygon *curvePolygon = qgsgeometry_cast<const QgsCurvePolygon *>( g ) )
 
 3123     g = 
id.ring == 0 ? curvePolygon->exteriorRing() : curvePolygon->interiorRing( 
id.ring - 1 );
 
 3126   if ( 
const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( g ) )
 
 3129     res = curve->pointAt( 
id.vertex, p, 
id.
type );
 
 3143   return d->
geometry->vertexNumberFromVertexId( 
id );
 
 3158   d->
geometry->filterVertices( filter );
 
 3198     std::unique_ptr< QgsLineString > segmentizedLine;
 
 3200     if ( doSegmentation )
 
 3203       line = segmentizedLine.get();
 
 3207       line = qgsgeometry_cast<const QgsLineString *>( ring );
 
 3215     res.resize( nVertices );
 
 3217     const double *xData = line->
xData();
 
 3218     const double *yData = line->
yData();
 
 3219     for ( 
int i = 0; i < nVertices; ++i )
 
 3221       data->
setX( *xData++ );
 
 3222       data->
setY( *yData++ );
 
 3230     output.push_back( convertRing( exterior ) );
 
 3234   output.reserve( output.size() + interiorRingCount );
 
 3235   for ( 
int n = 0; n < interiorRingCount; ++n )
 
 3237     output.push_back( convertRing( input.
interiorRing( n ) ) );
 
 3243   return QgsGeometry( std::make_unique< QgsPoint >( point.x(), point.y() ) );
 
 3250   if ( polygon.isClosed() )
 
 3252     std::unique_ptr< QgsPolygon > poly = std::make_unique< QgsPolygon >();
 
 3253     poly->setExteriorRing( ring.release() );
 
 3274   result.reserve( polygon.count() );
 
 3275   for ( 
const QPointF &p : polygon )
 
 3284   if ( p1.count() != p2.count() )
 
 3287   for ( 
int i = 0; i < p1.count(); ++i )
 
 3289     if ( !p1.at( i ).compare( p2.at( i ), epsilon ) )
 
 3297   if ( p1.count() != p2.count() )
 
 3300   for ( 
int i = 0; i < p1.count(); ++i )
 
 3311   if ( p1.count() != p2.count() )
 
 3314   for ( 
int i = 0; i < p1.count(); ++i )
 
 3341       return QgsGeometry( smoothLine( *lineString, iterations, offset, minimumDistance, maxAngle ) );
 
 3348       std::unique_ptr< QgsMultiLineString > resultMultiline = std::make_unique< QgsMultiLineString> ();
 
 3352         resultMultiline->addGeometry( smoothLine( *( multiLine->
lineStringN( i ) ), iterations, offset, minimumDistance, maxAngle ).release() );
 
 3354       return QgsGeometry( std::move( resultMultiline ) );
 
 3360       return QgsGeometry( smoothPolygon( *poly, iterations, offset, minimumDistance, maxAngle ) );
 
 3367       std::unique_ptr< QgsMultiPolygon > resultMultiPoly = std::make_unique< QgsMultiPolygon >();
 
 3371         resultMultiPoly->addGeometry( smoothPolygon( *( multiPoly->
polygonN( i ) ), iterations, offset, minimumDistance, maxAngle ).release() );
 
 3373       return QgsGeometry( std::move( resultMultiPoly ) );
 
 3383     const double offset, 
double squareDistThreshold, 
double maxAngleRads,
 
 3386   std::unique_ptr< QgsLineString > result = std::make_unique< QgsLineString >( line );
 
 3388   for ( 
unsigned int iteration = 0; iteration < iterations; ++iteration )
 
 3390     outputLine.resize( 0 );
 
 3391     outputLine.reserve( 2 * ( result->numPoints() - 1 ) );
 
 3392     bool skipFirst = 
false;
 
 3393     bool skipLast = 
false;
 
 3396       QgsPoint p1 = result->pointN( result->numPoints() - 2 );
 
 3402       skipFirst = 
angle > maxAngleRads;
 
 3404     for ( 
int i = 0; i < result->numPoints() - 1; i++ )
 
 3407       QgsPoint p2 = result->pointN( i + 1 );
 
 3409       double angle = M_PI;
 
 3410       if ( i == 0 && isRing )
 
 3412         QgsPoint p3 = result->pointN( result->numPoints() - 2 );
 
 3416       else if ( i < result->numPoints() - 2 )
 
 3418         QgsPoint p3 = result->pointN( i + 2 );
 
 3422       else if ( i == result->numPoints() - 2 && isRing )
 
 3429       skipLast = 
angle < M_PI - maxAngleRads || 
angle > M_PI + maxAngleRads;
 
 3432       if ( i == 0 || i >= result->numPoints() - 2
 
 3457       skipFirst = skipLast;
 
 3460     if ( isRing && outputLine.at( 0 ) != outputLine.at( outputLine.count() - 1 ) )
 
 3461       outputLine << outputLine.at( 0 );
 
 3463     result->setPoints( outputLine );
 
 3468 std::unique_ptr<QgsLineString> QgsGeometry::smoothLine( 
const QgsLineString &line, 
const unsigned int iterations, 
const double offset, 
double minimumDistance, 
double maxAngle )
 const 
 3470   double maxAngleRads = maxAngle * M_PI / 180.0;
 
 3471   double squareDistThreshold = minimumDistance > 0 ? minimumDistance * minimumDistance : -1;
 
 3472   return smoothCurve( line, iterations, offset, squareDistThreshold, maxAngleRads, 
false );
 
 3475 std::unique_ptr<QgsPolygon> QgsGeometry::smoothPolygon( 
const QgsPolygon &polygon, 
const unsigned int iterations, 
const double offset, 
double minimumDistance, 
double maxAngle )
 const 
 3477   double maxAngleRads = maxAngle * M_PI / 180.0;
 
 3478   double squareDistThreshold = minimumDistance > 0 ? minimumDistance * minimumDistance : -1;
 
 3479   std::unique_ptr< QgsPolygon > resultPoly = std::make_unique< QgsPolygon >();
 
 3482                                squareDistThreshold, maxAngleRads, 
true ).release() );
 
 3487                                  squareDistThreshold, maxAngleRads, 
true ).release() );
 
 3492 QgsGeometry QgsGeometry::convertToPoint( 
bool destMultipart )
 const 
 3500       if ( ( destMultipart && srcIsMultipart ) ||
 
 3501            ( !destMultipart && !srcIsMultipart ) )
 
 3506       if ( destMultipart )
 
 3515         if ( multiPoint.count() == 1 )
 
 3526       if ( !destMultipart )
 
 3543         if ( !line.isEmpty() )
 
 3552       if ( !destMultipart )
 
 3583 QgsGeometry QgsGeometry::convertToLine( 
bool destMultipart )
 const 
 3593       if ( multiPoint.count() < 2 )
 
 3596       if ( destMultipart )
 
 3606       if ( ( destMultipart && srcIsMultipart ) ||
 
 3607            ( !destMultipart && ! srcIsMultipart ) )
 
 3612       if ( destMultipart )
 
 3616         if ( !line.isEmpty() )
 
 3623         if ( multiLine.count() == 1 )
 
 3640         if ( destMultipart )
 
 3645         else if ( multiLine.count() == 1 )
 
 3656         if ( polygon.count() > 1 )
 
 3660           if ( destMultipart )
 
 3664             multiLine.reserve( polygon.count() );
 
 3671         else if ( polygon.count() == 1 )
 
 3673           if ( destMultipart )
 
 3691 QgsGeometry QgsGeometry::convertToPolygon( 
bool destMultipart )
 const 
 3701       if ( multiPoint.count() < 3 )
 
 3704       if ( multiPoint.last() != multiPoint.first() )
 
 3705         multiPoint << multiPoint.first();
 
 3708       if ( destMultipart )
 
 3721         for ( QgsMultiPolylineXY::iterator multiLineIt = multiLine.begin(); multiLineIt != multiLine.end(); ++multiLineIt )
 
 3724           if ( ( *multiLineIt ).count() < 3 )
 
 3726           if ( ( *multiLineIt ).count() == 3 && ( *multiLineIt ).first() == ( *multiLineIt ).last() )
 
 3730           if ( ( *multiLineIt ).first() != ( *multiLineIt ).last() )
 
 3731             *multiLineIt << ( *multiLineIt ).first();
 
 3735         if ( !multiPolygon.isEmpty() )
 
 3737           if ( destMultipart )
 
 3741           else if ( multiPolygon.count() == 1 )
 
 3754         if ( line.count() < 3 )
 
 3756         if ( line.count() == 3 && line.first() == line.last() )
 
 3760         if ( line.first() != line.last() )
 
 3761           line << line.first();
 
 3764         if ( destMultipart )
 
 3780       if ( ( destMultipart && srcIsMultipart ) ||
 
 3781            ( !destMultipart && ! srcIsMultipart ) )
 
 3786       if ( destMultipart )
 
 3790         if ( !polygon.isEmpty() )
 
 3796         if ( multiPolygon.count() == 1 )
 
 3812   return new QgsGeos( geometry );
 
 3817   out << geometry.
asWkb();
 
 3823   QByteArray byteArray;
 
 3825   if ( byteArray.isEmpty() )
 
 3827     geometry.
set( 
nullptr );
 
 3831   geometry.
fromWkb( byteArray );
 
 3848   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.
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.
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< 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 ...
QgsGeometry largestEmptyCircle(double tolerance, const QgsGeometry &boundary=QgsGeometry()) const SIP_THROW(QgsNotSupportedException)
Constructs the Largest Empty Circle for a set of obstacle geometries, up to a specified tolerance.
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.
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.
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 ...
void normalize()
Reorganizes the geometry into a normalized form (or "canonical" form).
BufferSide
Side of line to buffer.
int wkbSize(QgsAbstractGeometry::WkbFlags flags=QgsAbstractGeometry::WkbFlags()) const
Returns the length of the QByteArray returned by asWkb()
QgsGeometry minimumWidth() const SIP_THROW(QgsNotSupportedException)
Returns a linestring geometry which represents the minimum diameter of the geometry.
QgsPolygonXY asPolygon() const
Returns the contents of the geometry as a polygon.
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 minimumClearance() const SIP_THROW(QgsNotSupportedException)
Computes the minimum clearance of a geometry.
double sqrDistToVertexAt(QgsPointXY &point SIP_IN, int atVertex) const
Returns the squared Cartesian distance between the given point to the given vertex index (vertex at t...
bool isMultipart() const SIP_HOLDGIL
Returns true if WKB of the geometry is of WKBMulti* type.
QgsGeometry 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.
QgsGeometry minimumClearanceLine() const SIP_THROW(QgsNotSupportedException)
Returns a LineString whose endpoints define the minimum clearance of a geometry.
virtual json asJsonObject(int precision=17) const
Exports the geometry to a json object.
void filterVertices(const std::function< bool(const QgsPoint &) > &filter)
Filters the vertices from the geometry in place, removing any which do not return true for the filter...
bool equals(const QgsGeometry &geometry) const
Test if this geometry is exactly equal to another geometry.
bool 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.
double frechetDistanceDensify(const QgsGeometry &geom, double densifyFraction) const SIP_THROW(QgsNotSupportedException)
Returns the Fréchet distance between this geometry and geom, restricted to discrete points for both g...
void convertToStraightSegment(double tolerance=M_PI/180., QgsAbstractGeometry::SegmentationToleranceType toleranceType=QgsAbstractGeometry::MaximumAngle)
Converts the geometry to straight line segments, if it is a curved geometry type.
double area() const
Returns the planar, 2-dimensional area of the geometry.
QgsGeometry centroid() const
Returns the center of mass of a geometry.
bool crosses(const QgsGeometry &geometry) const
Returns true if the geometry crosses another geometry.
QgsGeometry & operator=(QgsGeometry const &rhs)
Creates a deep copy of the object.
QgsGeometry orthogonalize(double tolerance=1.0E-8, int maxIterations=1000, double angleThreshold=15.0) const
Attempts to orthogonalize a line or polygon geometry by shifting vertices to make the geometries angl...
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry)
Creates and returns a new geometry engine representing the specified geometry.
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.
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 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.
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...
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,...
double frechetDistance(const QgsGeometry &geom) const SIP_THROW(QgsNotSupportedException)
Returns the Fréchet distance between this geometry and geom, restricted to discrete points for both g...
QgsGeometry smooth(unsigned int iterations=1, double offset=0.25, double minimumDistance=-1.0, double maxAngle=180.0) const
Smooths a geometry by rounding off corners using the Chaikin algorithm.
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 frechetDistance(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const
Returns the Fréchet distance between this geometry and geom, restricted to discrete points for both g...
double area(QString *errorMsg=nullptr) const override
double length(QString *errorMsg=nullptr) const override
double frechetDistanceDensify(const QgsAbstractGeometry *geom, double densifyFraction, QString *errorMsg=nullptr) const
Returns the Fréchet distance between this geometry and geom, restricted to discrete points for both g...
This class offers geometry processing methods.
QgsGeometry 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.
bool isAxisParallelRectangle(double maximumDeviation, bool simpleRectanglesOnly=false) const
Returns true if the geometry is a polygon that is almost an axis-parallel rectangle.
Line string geometry type, with support for z-dimension and m-values.
const double * yData() const
Returns a const pointer to the y vertex data.
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.
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< 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 > 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.