54 std::unique_ptr< QgsAbstractGeometry >
geometry;
64 if ( !d->
ref.deref() )
72 d->
ref = QAtomicInt( 1 );
79 d->
ref = QAtomicInt( 1 );
85 mLastError = other.mLastError;
91 if ( !d->
ref.deref() )
96 mLastError = other.mLastError;
102 void QgsGeometry::detach()
107 std::unique_ptr< QgsAbstractGeometry > cGeom;
109 cGeom.reset( d->
geometry->clone() );
111 reset( std::move( cGeom ) );
114 void QgsGeometry::reset( std::unique_ptr<QgsAbstractGeometry> newGeometry )
118 ( void )d->
ref.deref();
121 d->
geometry = std::move( newGeometry );
137 if ( d->
geometry.get() == geometry )
142 reset( std::unique_ptr< QgsAbstractGeometry >( geometry ) );
182 return QgsGeometry( qgis::make_unique< QgsLineString >( polyline ) );
227 std::unique_ptr< QgsLineString > ext = qgis::make_unique< QgsLineString >(
228 QVector< double >() << rect.
xMinimum()
233 QVector< double >() << rect.
yMinimum()
238 std::unique_ptr< QgsPolygon > polygon = qgis::make_unique< QgsPolygon >();
239 polygon->setExteriorRing( ext.release() );
256 if ( g.isMultipart() )
258 for (
auto p = g.const_parts_begin(); p != g.const_parts_end(); ++p )
260 collected.
addPart( ( *p )->clone() );
274 if ( std::abs( angularWidth ) >= 360.0 )
276 std::unique_ptr< QgsCompoundCurve > outerCc = qgis::make_unique< QgsCompoundCurve >();
279 outerCc->addCurve( outerCircle.toCircularString() );
281 std::unique_ptr< QgsCurvePolygon > cp = qgis::make_unique< QgsCurvePolygon >();
282 cp->setExteriorRing( outerCc.release() );
286 std::unique_ptr< QgsCompoundCurve > innerCc = qgis::make_unique< QgsCompoundCurve >();
289 innerCc->addCurve( innerCircle.toCircularString() );
291 cp->setInteriorRings( { innerCc.release() } );
297 std::unique_ptr< QgsCompoundCurve > wedge = qgis::make_unique< QgsCompoundCurve >();
299 const double startAngle = azimuth - angularWidth * 0.5;
300 const double endAngle = azimuth + angularWidth * 0.5;
305 const bool useShortestArc = angularWidth <= 180.0;
323 std::unique_ptr< QgsCurvePolygon > cp = qgis::make_unique< QgsCurvePolygon >();
324 cp->setExteriorRing( wedge.release() );
403 d->
geometry->adjacentVertices(
id, prevVertex, nextVertex );
439 return d->
geometry->vertexAngle( v2 );
458 d->
geometry->adjacentVertices(
id, beforeVertexId, afterVertexId );
496 return d->
geometry->moveVertex(
id, p );
529 return d->
geometry->deleteVertex(
id );
581 return d->
geometry->insertVertex(
id, point );
597 return d->
geometry->vertexAt( vId );
611 result.mLastError = mLastError;
620 result.mLastError = mLastError;
644 double epsilon )
const 654 double sqrDist = d->
geometry->closestSegment(
QgsPoint( point ), segmentPt, vertexAfter, leftOf, epsilon );
658 minDistPoint.
setX( segmentPt.
x() );
659 minDistPoint.
setY( segmentPt.
y() );
666 std::unique_ptr< QgsLineString > ringLine = qgis::make_unique< QgsLineString >( ring );
667 return addRing( ringLine.release() );
672 std::unique_ptr< QgsCurve > r( ring );
692 std::unique_ptr< QgsAbstractGeometry > partGeom;
693 if ( points.size() == 1 )
695 partGeom = qgis::make_unique< QgsPoint >( points[0] );
697 else if ( points.size() > 1 )
699 std::unique_ptr< QgsLineString > ringLine = qgis::make_unique< QgsLineString >();
700 ringLine->setPoints( points );
701 partGeom = std::move( ringLine );
703 return addPart( partGeom.release(), geomType );
708 std::unique_ptr< QgsAbstractGeometry > p( part );
714 reset( qgis::make_unique< QgsMultiPoint >() );
717 reset( qgis::make_unique< QgsMultiLineString >() );
720 reset( qgis::make_unique< QgsMultiPolygon >() );
724 return QgsGeometry::OperationResult::AddPartNotMultiGeometry;
760 QVector<QgsGeometry> results;
761 results.reserve( parts.count() );
768 if ( results.isEmpty() )
772 for (
const QgsGeometry &result : qgis::as_const( results ) )
780 std::unique_ptr< QgsCurvePolygon > newPoly( static_cast< QgsCurvePolygon * >( d->
geometry->clone() ) );
781 newPoly->removeInteriorRings( minimumRingArea );
795 d->
geometry->transform( QTransform::fromTranslate( dx, dy ), dz, 1.0, dm );
808 QTransform t = QTransform::fromTranslate( center.
x(), center.
y() );
809 t.rotate( -rotation );
810 t.translate( -center.
x(), -center.
y() );
819 return QgsGeometry::OperationResult::InvalidBaseGeometry;
822 QVector<QgsGeometry > newGeoms;
832 *
this = newGeoms.takeAt( 0 );
834 newGeometries = newGeoms;
842 return QgsGeometry::OperationResult::Success;
846 return QgsGeometry::OperationResult::GeometryEngineError;
848 return QgsGeometry::OperationResult::InvalidBaseGeometry;
850 return QgsGeometry::OperationResult::InvalidInputGeometryType;
852 return QgsGeometry::OperationResult::SplitCannotSplitPoint;
854 return QgsGeometry::OperationResult::NothingHappened;
873 std::unique_ptr< QgsAbstractGeometry > geom(
geos.reshapeGeometry( reshapeLineString, &errorCode, &mLastError ) );
876 reset( std::move( geom ) );
912 std::unique_ptr< QgsAbstractGeometry > diffGeom(
geos.intersection( other.
constGet(), &mLastError ) );
918 reset( std::move( diffGeom ) );
932 std::unique_ptr< QgsAbstractGeometry > diffGeom(
geos.intersection( other.
constGet(), &mLastError ) );
936 result.mLastError = mLastError;
955 area = std::numeric_limits<double>::max();
957 width = std::numeric_limits<double>::max();
958 height = std::numeric_limits<double>::max();
974 double prevAngle = 0.0;
978 double rotateAngle = 180.0 / M_PI * ( currentAngle - prevAngle );
979 prevAngle = currentAngle;
981 QTransform t = QTransform::fromTranslate( pt0.
x(), pt0.
y() );
982 t.rotate( rotateAngle );
983 t.translate( -pt0.
x(), -pt0.
y() );
988 double currentArea = bounds.
width() * bounds.
height();
989 if ( currentArea < area )
993 angle = 180.0 / M_PI * currentAngle;
994 width = bounds.
width();
1005 if ( angle > 180.0 )
1006 angle = std::fmod( angle, 180.0 );
1019 auto l_boundary = boundary.length();
1021 if ( ( points.length() == 0 ) || ( l_boundary == 3 ) )
1023 switch ( l_boundary )
1030 boundary.pop_back();
1035 boundary.pop_back();
1037 boundary.pop_back();
1054 circ_mec = __recMinimalEnclosingCircle( points, boundary );
1058 boundary.append( pxy );
1059 circ_mec = __recMinimalEnclosingCircle( points, boundary );
1083 QgsCircle circ = __recMinimalEnclosingCircle( P, R );
1104 return engine.
orthogonalize( tolerance, maxIterations, angleThreshold );
1113 return QgsGeometry( d->
geometry->snappedToGrid( hSpacing, vSpacing, dSpacing, mSpacing ) );
1122 return d->
geometry->removeDuplicateNodes( epsilon, useZValues );
1140 return geos.intersects( geometry.d->
geometry.get(), &mLastError );
1150 return d->
geometry->boundingBox().intersects( rectangle );
1173 return geos.contains( &pt, &mLastError );
1185 return geos.contains( geometry.d->
geometry.get(), &mLastError );
1197 return geos.disjoint( geometry.d->
geometry.get(), &mLastError );
1208 if ( d == geometry.d )
1224 return geos.touches( geometry.d->
geometry.get(), &mLastError );
1236 return geos.overlaps( geometry.d->
geometry.get(), &mLastError );
1248 return geos.within( geometry.d->
geometry.get(), &mLastError );
1260 return geos.crosses( geometry.d->
geometry.get(), &mLastError );
1269 return d->
geometry->asWkt( precision );
1276 return QStringLiteral(
"null" );
1278 return d->
geometry->asJson( precision );
1286 return convertToPoint( destMultipart );
1289 return convertToLine( destMultipart );
1292 return convertToPolygon( destMultipart );
1344 if ( !multiGeom || multiGeom->
partCount() < 1 )
1347 std::unique_ptr< QgsAbstractGeometry > firstPart( multiGeom->
geometryN( 0 )->
clone() );
1348 reset( std::move( firstPart ) );
1359 std::unique_ptr<QgsGeometryCollection> resGeom;
1363 resGeom = qgis::make_unique<QgsMultiPoint>();
1366 resGeom = qgis::make_unique<QgsMultiLineString>();
1369 resGeom = qgis::make_unique<QgsMultiPolygon>();
1381 resGeom->addGeometry( g->
clone() );
1384 set( resGeom.release() );
1414 std::unique_ptr< QgsLineString > segmentizedLine;
1416 if ( doSegmentation )
1424 line = segmentizedLine.get();
1436 polyLine.resize( nVertices );
1437 for (
int i = 0; i < nVertices; ++i )
1439 polyLine[i].setX( line->
xAt( i ) );
1440 polyLine[i].setY( line->
yAt( i ) );
1454 std::unique_ptr< QgsPolygon > segmentized;
1455 if ( doSegmentation )
1462 segmentized.reset( curvePoly->
toPolygon() );
1463 p = segmentized.get();
1476 convertPolygon( *p, polygon );
1496 for (
int i = 0; i < nPoints; ++i )
1499 multiPoint[i].
setX( pt->
x() );
1500 multiPoint[i].setY( pt->
y() );
1513 if ( !geomCollection )
1525 for (
int i = 0; i < nLines; ++i )
1528 std::unique_ptr< QgsLineString > segmentized;
1537 line = segmentized.get();
1541 line->
points( lineCoords );
1543 convertToPolyline( lineCoords, polyLine );
1544 mpl.append( polyLine );
1557 if ( !geomCollection )
1563 if ( nPolygons < 1 )
1569 for (
int i = 0; i < nPolygons; ++i )
1586 convertPolygon( *polygon, poly );
1602 double geosArea = g.
area();
1603 double qgisArea = 0;
1607 qgisArea = surface->
area();
1612 return g.area( &mLastError );
1623 return g.length( &mLastError );
1641 return g.distance( geom.d->
geometry.get(), &mLastError );
1653 return g.hausdorffDistance( geom.d->
geometry.get(), &mLastError );
1665 return g.hausdorffDistanceDensify( geom.d->
geometry.get(), densifyFraction, &mLastError );
1672 return d->
geometry->vertices_begin();
1679 return d->
geometry->vertices_end();
1709 return d->
geometry->const_parts_begin();
1716 return d->
geometry->const_parts_end();
1745 std::unique_ptr<QgsAbstractGeometry> geom( g.buffer( distance, segments, &mLastError ) );
1749 result.mLastError = mLastError;
1764 QgsAbstractGeometry *geom = g.buffer( distance, segments, endCapStyle, joinStyle, miterLimit, &mLastError );
1768 result.mLastError = mLastError;
1784 QVector<QgsGeometry> results;
1785 results.reserve( parts.count() );
1792 if ( results.isEmpty() )
1796 for (
const QgsGeometry &result : qgis::as_const( results ) )
1810 std::unique_ptr< QgsAbstractGeometry > offsetGeom(
geos.offsetCurve( distance, segments, joinStyle, miterLimit, &mLastError ) );
1814 result.mLastError = mLastError;
1818 if (
const QgsCurve *
offsetCurve = qgsgeometry_cast< const QgsCurve * >( offsetGeom.get() ) )
1821 if ( newOrientation != prevOrientation )
1824 std::unique_ptr< QgsAbstractGeometry > flipped(
offsetCurve->reversed() );
1825 offsetGeom = std::move( flipped );
1842 QVector<QgsGeometry> results;
1843 results.reserve( parts.count() );
1850 if ( results.isEmpty() )
1854 for (
const QgsGeometry &result : qgis::as_const( results ) )
1864 std::unique_ptr< QgsAbstractGeometry > bufferGeom =
geos.singleSidedBuffer( distance, segments, side,
1865 joinStyle, miterLimit, &mLastError );
1869 result.mLastError = mLastError;
1880 return engine.
taperedBuffer( startWidth, endWidth, segments );
1900 QVector<QgsGeometry> results;
1901 results.reserve( parts.count() );
1908 if ( results.isEmpty() )
1912 for (
const QgsGeometry &result : qgis::as_const( results ) )
1924 std::unique_ptr< QgsLineString > newLine( line->
clone() );
1925 newLine->extend( startDistance, endDistance );
1939 std::unique_ptr< QgsAbstractGeometry > simplifiedGeom(
geos.simplify( tolerance, &mLastError ) );
1940 if ( !simplifiedGeom )
1943 result.mLastError = mLastError;
1946 return QgsGeometry( std::move( simplifiedGeom ) );
1983 result.mLastError = mLastError;
1998 result.mLastError = mLastError;
2017 std::unique_ptr< QgsAbstractGeometry > cHull(
geos.convexHull( &mLastError ) );
2021 geom.mLastError = mLastError;
2037 result.mLastError = mLastError;
2050 QgsGeometry result =
geos.delaunayTriangulation( tolerance, edgesOnly );
2051 result.mLastError = mLastError;
2063 std::unique_ptr< QgsAbstractGeometry > segmentizedCopy;
2066 segmentizedCopy.reset( d->
geometry->segmentize() );
2067 geom = segmentizedCopy.get();
2072 std::unique_ptr< QgsAbstractGeometry > result( geos.
subdivide( maxNodes, &mLastError ) );
2076 geom.mLastError = mLastError;
2114 std::unique_ptr< QgsPoint > result( curve->interpolatePoint( distance ) );
2133 segmentized =
QgsGeometry( static_cast< QgsCurve * >( d->
geometry.get() )->segmentize() );
2138 return geos.lineLocatePoint( *( static_cast< QgsPoint * >( point.d->
geometry.get() ) ), &mLastError );
2150 segmentized =
QgsGeometry( static_cast< QgsCurve * >( d->
geometry.get() )->segmentize() );
2158 if ( previous == next )
2205 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.intersection( geometry.d->
geometry.get(), &mLastError ) );
2210 geom.mLastError = mLastError;
2226 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.combine( geometry.d->
geometry.get(), &mLastError ) );
2230 geom.mLastError = mLastError;
2252 result.mLastError = mLastError;
2266 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.difference( geometry.d->
geometry.get(), &mLastError ) );
2270 geom.mLastError = mLastError;
2286 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.symDifference( geometry.d->
geometry.get(), &mLastError ) );
2290 geom.mLastError = mLastError;
2300 return engine.
extrude( x, y );
2310 QVector<QgsGeometry> geometryList;
2313 return geometryList;
2320 geometryList.reserve( numGeom );
2321 for (
int i = 0; i < numGeom; ++i )
2328 geometryList.append( *
this );
2331 return geometryList;
2352 if ( polygon.empty() )
2354 polyline = polygon.at( 0 );
2361 result.reserve( polyline.count() );
2362 for (
const QgsPointXY &p : qgis::as_const( polyline ) )
2364 result << p.toQPointF();
2409 reset( std::move( diffGeom ) );
2424 result.mLastError = mLastError;
2440 if (
const QgsCurvePolygon *cp = qgsgeometry_cast< const QgsCurvePolygon * >( g ) )
2442 std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
2443 corrected->forceRHR();
2444 newCollection->addGeometry( corrected.release() );
2448 newCollection->addGeometry( g->
clone() );
2457 std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
2458 corrected->forceRHR();
2535 return geos.isSimple( &mLastError );
2547 return geos.isEqual( g.d->
geometry.get(), &mLastError );
2555 std::unique_ptr< QgsAbstractGeometry > geom( geos.
combine( geometries, &error ) );
2557 result.mLastError = error;
2565 QVector<const QgsAbstractGeometry *> geomV2List;
2568 if ( !( g.isNull() ) )
2570 geomV2List.append( g.constGet() );
2576 result.mLastError = error;
2587 std::unique_ptr< QgsAbstractGeometry > straightGeom( d->
geometry->segmentize( tolerance, toleranceType ) );
2588 reset( std::move( straightGeom ) );
2598 return d->
geometry->hasCurvedSegments();
2609 d->
geometry->transform( ct, direction, transformZ );
2621 d->
geometry->transform( ct, zTranslate, zScale, mTranslate, mScale );
2643 std::unique_ptr< QgsAbstractGeometry > resultGeom =
geos.clip( rectangle, &mLastError );
2647 result.mLastError = mLastError;
2661 static bool vertexIndexInfo(
const QgsAbstractGeometry *g,
int vertexIndex,
int &partIndex,
int &ringIndex,
int &vertex )
2663 if ( vertexIndex < 0 )
2666 if (
const QgsGeometryCollection *geomCollection = qgsgeometry_cast<const QgsGeometryCollection *>( g ) )
2670 for (
int i = 0; i < geomCollection->numGeometries(); ++i )
2676 for (
int k = 0; k < part->
ringCount(); ++k )
2679 if ( vertexIndex < numPoints )
2682 return vertexIndexInfo( part, vertexIndex, nothing, ringIndex, vertex );
2684 vertexIndex -= numPoints;
2685 offset += numPoints;
2689 else if (
const QgsCurvePolygon *curvePolygon = qgsgeometry_cast<const QgsCurvePolygon *>( g ) )
2691 const QgsCurve *ring = curvePolygon->exteriorRing();
2692 if ( vertexIndex < ring->numPoints() )
2696 vertex = vertexIndex;
2701 for (
int i = 0; i < curvePolygon->numInteriorRings(); ++i )
2703 const QgsCurve *ring = curvePolygon->interiorRing( i );
2704 if ( vertexIndex < ring->numPoints() )
2707 vertex = vertexIndex;
2714 else if (
const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( g ) )
2716 if ( vertexIndex < curve->numPoints() )
2720 vertex = vertexIndex;
2724 else if ( qgsgeometry_cast<const QgsPoint *>( g ) )
2726 if ( vertexIndex == 0 )
2747 bool res = vertexIndexInfo( d->
geometry.get(), nr,
id.part,
id.ring,
id.vertex );
2753 if (
const QgsGeometryCollection *geomCollection = qgsgeometry_cast<const QgsGeometryCollection *>( g ) )
2755 g = geomCollection->geometryN(
id.part );
2758 if (
const QgsCurvePolygon *curvePolygon = qgsgeometry_cast<const QgsCurvePolygon *>( g ) )
2760 g =
id.ring == 0 ? curvePolygon->exteriorRing() : curvePolygon->interiorRing(
id.ring - 1 );
2763 if (
const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( g ) )
2766 res = curve->pointAt(
id.vertex, p,
id.
type );
2780 return d->
geometry->vertexNumberFromVertexId(
id );
2795 d->
geometry->filterVertices( filter );
2829 output.resize( input.size() );
2831 for (
int i = 0; i < input.size(); ++i )
2833 const QgsPoint &pt = input.at( i );
2834 output[i].
setX( pt.
x() );
2835 output[i].setY( pt.
y() );
2843 if ( coords.empty() )
2848 output.resize( rings.size() );
2849 for (
int i = 0; i < rings.size(); ++i )
2851 convertToPolyline( rings[i], output[i] );
2857 return QgsGeometry( qgis::make_unique< QgsPoint >( point.x(), point.y() ) );
2862 if ( polygon.isClosed() )
2882 result.reserve( polygon.count() );
2883 for (
const QPointF &p : polygon )
2892 if ( p1.count() != p2.count() )
2895 for (
int i = 0; i < p1.count(); ++i )
2897 if ( !p1.at( i ).compare( p2.at( i ), epsilon ) )
2905 if ( p1.count() != p2.count() )
2908 for (
int i = 0; i < p1.count(); ++i )
2919 if ( p1.count() != p2.count() )
2922 for (
int i = 0; i < p1.count(); ++i )
2949 return QgsGeometry( smoothLine( *lineString, iterations, offset, minimumDistance, maxAngle ) );
2956 std::unique_ptr< QgsMultiLineString > resultMultiline = qgis::make_unique< QgsMultiLineString> ();
2959 resultMultiline->
addGeometry( smoothLine( *( static_cast< QgsLineString * >( multiLine->
geometryN( i ) ) ), iterations, offset, minimumDistance, maxAngle ).release() );
2961 return QgsGeometry( std::move( resultMultiline ) );
2967 return QgsGeometry( smoothPolygon( *poly, iterations, offset, minimumDistance, maxAngle ) );
2974 std::unique_ptr< QgsMultiPolygon > resultMultiPoly = qgis::make_unique< QgsMultiPolygon >();
2977 resultMultiPoly->
addGeometry( smoothPolygon( *( static_cast< QgsPolygon * >( multiPoly->
geometryN( i ) ) ), iterations, offset, minimumDistance, maxAngle ).release() );
2979 return QgsGeometry( std::move( resultMultiPoly ) );
2989 const double offset,
double squareDistThreshold,
double maxAngleRads,
2992 std::unique_ptr< QgsLineString > result = qgis::make_unique< QgsLineString >( line );
2994 for (
unsigned int iteration = 0; iteration < iterations; ++iteration )
2996 outputLine.resize( 0 );
2997 outputLine.reserve( 2 * ( result->numPoints() - 1 ) );
2998 bool skipFirst =
false;
2999 bool skipLast =
false;
3002 QgsPoint p1 = result->pointN( result->numPoints() - 2 );
3007 angle = std::fabs( M_PI - angle );
3008 skipFirst = angle > maxAngleRads;
3010 for (
int i = 0; i < result->numPoints() - 1; i++ )
3013 QgsPoint p2 = result->pointN( i + 1 );
3015 double angle = M_PI;
3016 if ( i == 0 && isRing )
3018 QgsPoint p3 = result->pointN( result->numPoints() - 2 );
3022 else if ( i < result->numPoints() - 2 )
3024 QgsPoint p3 = result->pointN( i + 2 );
3028 else if ( i == result->numPoints() - 2 && isRing )
3035 skipLast = angle < M_PI - maxAngleRads || angle > M_PI + maxAngleRads;
3038 if ( i == 0 || i >= result->numPoints() - 2
3063 skipFirst = skipLast;
3066 if ( isRing && outputLine.at( 0 ) != outputLine.at( outputLine.count() - 1 ) )
3067 outputLine << outputLine.at( 0 );
3069 result->setPoints( outputLine );
3074 std::unique_ptr<QgsLineString> QgsGeometry::smoothLine(
const QgsLineString &line,
const unsigned int iterations,
const double offset,
double minimumDistance,
double maxAngle )
const 3076 double maxAngleRads = maxAngle * M_PI / 180.0;
3077 double squareDistThreshold = minimumDistance > 0 ? minimumDistance * minimumDistance : -1;
3078 return smoothCurve( line, iterations, offset, squareDistThreshold, maxAngleRads,
false );
3081 std::unique_ptr<QgsPolygon> QgsGeometry::smoothPolygon(
const QgsPolygon &polygon,
const unsigned int iterations,
const double offset,
double minimumDistance,
double maxAngle )
const 3083 double maxAngleRads = maxAngle * M_PI / 180.0;
3084 double squareDistThreshold = minimumDistance > 0 ? minimumDistance * minimumDistance : -1;
3085 std::unique_ptr< QgsPolygon > resultPoly = qgis::make_unique< QgsPolygon >();
3087 resultPoly->setExteriorRing(
smoothCurve( *( static_cast< const QgsLineString *>( polygon.
exteriorRing() ) ), iterations, offset,
3088 squareDistThreshold, maxAngleRads, true ).release() );
3092 resultPoly->addInteriorRing(
smoothCurve( *( static_cast< const QgsLineString *>( polygon.
interiorRing( i ) ) ), iterations, offset,
3093 squareDistThreshold, maxAngleRads, true ).release() );
3098 QgsGeometry QgsGeometry::convertToPoint(
bool destMultipart )
const 3106 if ( ( destMultipart && srcIsMultipart ) ||
3107 ( !destMultipart && !srcIsMultipart ) )
3112 if ( destMultipart )
3121 if ( multiPoint.count() == 1 )
3132 if ( !destMultipart )
3149 if ( !line.isEmpty() )
3158 if ( !destMultipart )
3189 QgsGeometry QgsGeometry::convertToLine(
bool destMultipart )
const 3199 if ( multiPoint.count() < 2 )
3202 if ( destMultipart )
3212 if ( ( destMultipart && srcIsMultipart ) ||
3213 ( !destMultipart && ! srcIsMultipart ) )
3218 if ( destMultipart )
3222 if ( !line.isEmpty() )
3229 if ( multiLine.count() == 1 )
3246 if ( destMultipart )
3251 else if ( multiLine.count() == 1 )
3262 if ( polygon.count() > 1 )
3266 if ( destMultipart )
3270 multiLine.reserve( polygon.count() );
3277 else if ( polygon.count() == 1 )
3279 if ( destMultipart )
3297 QgsGeometry QgsGeometry::convertToPolygon(
bool destMultipart )
const 3307 if ( multiPoint.count() < 3 )
3310 if ( multiPoint.last() != multiPoint.first() )
3311 multiPoint << multiPoint.first();
3314 if ( destMultipart )
3327 for ( QgsMultiPolylineXY::iterator multiLineIt = multiLine.begin(); multiLineIt != multiLine.end(); ++multiLineIt )
3330 if ( ( *multiLineIt ).count() < 3 )
3332 if ( ( *multiLineIt ).count() == 3 && ( *multiLineIt ).first() == ( *multiLineIt ).last() )
3336 if ( ( *multiLineIt ).first() != ( *multiLineIt ).last() )
3337 *multiLineIt << ( *multiLineIt ).first();
3341 if ( !multiPolygon.isEmpty() )
3343 if ( destMultipart )
3347 else if ( multiPolygon.count() == 1 )
3360 if ( line.count() < 3 )
3362 if ( line.count() == 3 && line.first() == line.last() )
3366 if ( line.first() != line.last() )
3367 line << line.first();
3370 if ( destMultipart )
3386 if ( ( destMultipart && srcIsMultipart ) ||
3387 ( !destMultipart && ! srcIsMultipart ) )
3392 if ( destMultipart )
3396 if ( !polygon.isEmpty() )
3402 if ( multiPolygon.count() == 1 )
3418 return new QgsGeos( geometry );
3423 out << geometry.
asWkb();
3429 QByteArray byteArray;
3431 if ( byteArray.isEmpty() )
3433 geometry.
set(
nullptr );
3437 geometry.
fromWkb( byteArray );
3454 return mHasLocation;
QPointF toQPointF() const
Converts a point to a QPointF.
Geometry engine misses a method implemented or an error occurred in the geometry engine.
static std::unique_ptr< QgsAbstractGeometry > geomFromWkb(QgsConstWkbPtr &wkb)
Construct geometry from a WKB string.
QgsGeometry poleOfInaccessibility(double precision, double *distanceToBoundary=nullptr) const
Calculates the approximate pole of inaccessibility for a surface, which is the most distant internal ...
bool convertGeometryCollectionToSubclass(QgsWkbTypes::GeometryType geomType)
Converts geometry collection to a the desired geometry type subclass (multi-point, multi-linestring or multi-polygon).
static QgsPolygonXY createPolygonFromQPolygonF(const QPolygonF &polygon)
Creates a QgsPolygonXYfrom a QPolygonF.
static QgsGeometry fromMultiPolygonXY(const QgsMultiPolygonXY &multipoly)
Creates a new geometry from a QgsMultiPolygon.
const QgsCurve * exteriorRing() const
Returns the curve polygon's exterior ring.
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 isGeosValid(QgsGeometry::ValidityFlags flags=nullptr) const
Checks validity of the geometry using GEOS.
A rectangle specified with double values.
Java-style iterator for traversal of parts of a geometry.
bool isSimple() const
Determines whether the geometry is simple (according to OGC definition), i.e.
QgsGeometry interpolate(double distance) const
Returns an interpolated point on the geometry at the specified distance.
QgsGeometry pointOnSurface() const
Returns a point guaranteed to lie on the surface of a geometry.
bool isEmpty() const
Returns true if the rectangle is empty.
static QgsGeometry fromPolylineXY(const QgsPolylineXY &polyline)
Creates a new LineString geometry from a list of QgsPointXY points.
static std::unique_ptr< QgsAbstractGeometry > geomFromWkbType(QgsWkbTypes::Type t)
Returns empty geometry from wkb type.
void points(QgsPointSequence &pt) const override
Returns a list of points within the curve.
static Type multiType(Type type)
Returns the multi type for a WKB type.
void validateGeometry(QVector< QgsGeometry::Error > &errors, ValidationMethod method=ValidatorQgisInternal, QgsGeometry::ValidityFlags flags=nullptr) const
Validates geometry and produces a list of geometry errors.
bool hasWhere() const
True if the location available from.
int makeDifferenceInPlace(const QgsGeometry &other)
Changes this geometry such that it does not intersect the other geometry.
static QgsGeometry fromPolyline(const QgsPolyline &polyline)
Creates a new LineString geometry from a list of QgsPoint points.
QDataStream & operator<<(QDataStream &out, const QgsGeometry &geometry)
Writes the geometry to stream out. QGIS version compatibility is not guaranteed.
double angleAtVertex(int vertex) const
Returns the bisector angle for this geometry at the specified vertex.
virtual void transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d=QgsCoordinateTransform::ForwardTransform, bool transformZ=false) SIP_THROW(QgsCsException)=0
Transforms the geometry using a coordinate transform.
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...
QgsAbstractGeometry::vertex_iterator vertices_end() const
Returns STL-style iterator pointing to the imaginary vertex after the last vertex of the geometry...
OperationResult addPart(const QVector< QgsPointXY > &points, QgsWkbTypes::GeometryType geomType=QgsWkbTypes::UnknownGeometry)
Adds a new part to a the geometry.
bool isNull() const
Returns true if the geometry is null (ie, contains no underlying geometry accessible via geometry() )...
QString what() const
A human readable error message containing details about the error.
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.
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...
static double lineAngle(double x1, double y1, double x2, double y2)
Calculates the direction of line joining two points in radians, clockwise from the north direction...
Java-style iterator for traversal of vertices of a geometry.
Multi point geometry collection.
QgsPointXY where() const
The coordinates at which the error is located and should be visualized.
QPolygonF asQPolygonF() const
Returns contents of the geometry as a QPolygonF.
static bool isMultiType(Type type)
Returns true if the WKB type is a multi type.
The source geometry is not multi.
Nothing happened, without any error.
void fromWkb(unsigned char *wkb, int length)
Set the geometry, feeding in the buffer containing OGC Well-Known Binary and the buffer's length...
double distance(const QgsGeometry &geom) const
Returns the minimum distance between this geometry and another geometry, using GEOS.
Use GEOS validation methods.
static double averageAngle(double x1, double y1, double x2, double y2, double x3, double y3)
Calculates the average angle (in radians) between the two linear segments from (x1, y1) to (x2, y2) and (x2, y2) to (x3, y3).
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...
double yMaximum() const
Returns the y maximum value (top side of rectangle).
QVector< QgsRingSequence > QgsCoordinateSequence
Java-style iterator for const traversal of parts of a geometry.
static double angleBetweenThreePoints(double x1, double y1, double x2, double y2, double x3, double y3)
Calculates the angle between the lines AB and BC, where AB and BC described by points a...
static std::unique_ptr< QgsAbstractGeometry > fromPointXY(const QgsPointXY &point)
Construct geometry from a point.
QgsGeometry subdivide(int maxNodes=256) const
Subdivides the geometry.
double hausdorffDistanceDensify(const QgsGeometry &geom, double densifyFraction) const
Returns the Hausdorff distance between this geometry and geom.
static std::unique_ptr< QgsAbstractGeometry > fromPolylineXY(const QgsPolylineXY &polyline)
Construct geometry from a polyline.
double area(QString *errorMsg=nullptr) const override
A class to represent a 2D point.
QVector< QgsPoint > QgsPolyline
Polyline as represented as a vector of points.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
QPointF asQPointF() const
Returns contents of the geometry as a QPointF if wkbType is WKBPoint, otherwise returns a null QPoint...
OperationResult rotate(double rotation, const QgsPointXY ¢er)
Rotate this geometry around the Z axis.
static QgsGeometry fromMultiPolylineXY(const QgsMultiPolylineXY &multiline)
Creates a new geometry from a QgsMultiPolylineXY object.
QgsGeometry densifyByDistance(double distance) const
Densifies the geometry by adding regularly placed extra nodes inside each segment so that the maximum...
QgsWkbTypes::Type wkbType() const
Returns the WKB type of the geometry.
QgsGeometryPartIterator parts()
Returns Java-style iterator for traversal of parts of the geometry.
QgsAbstractGeometry::vertex_iterator vertices_begin() const
Returns STL-style iterator pointing to the first vertex of the geometry.
bool isNull() const
Test if the rectangle is null (all coordinates zero or after call to setMinimal()).
QVector< QgsPolylineXY > QgsPolygonXY
Polygon: first item of the list is outer ring, inner rings (if any) start from second item...
int vertexNrFromVertexId(QgsVertexId id) const
Returns the vertex number corresponding to a vertex id.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
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...
Multi line string geometry collection.
double interpolateAngle(double distance) const
Returns the angle parallel to the linestring or polygon boundary at the specified distance along the ...
Curve polygon geometry type.
bool vertexIdFromVertexNr(int number, QgsVertexId &id) const
Calculates the vertex ID from a vertex number.
QgsGeometry intersection(const QgsGeometry &geometry) const
Returns a geometry representing the points shared by this geometry and other.
void adjacentVertices(int atVertex, int &beforeVertex, int &afterVertex) const
Returns the indexes of the vertices before and after the given vertex index.
A geometry is the spatial representation of a feature.
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
QgsGeometry()
Constructor.
QVector< QgsPointXY > QgsMultiPointXY
A collection of QgsPoints that share a common collection of attributes.
OperationResult addRing(const QVector< QgsPointXY > &ring)
Adds a new ring to this geometry.
The part_iterator class provides STL-style iterator for const references to geometry parts...
OperationResult reshapeGeometry(const QgsLineString &reshapeLineString)
Replaces a part of this geometry with another line.
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.
SegmentationToleranceType
Segmentation tolerance as maximum angle or maximum difference between approximation and circle...
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
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.
static QgsPoint closestVertex(const QgsAbstractGeometry &geom, const QgsPoint &pt, QgsVertexId &id)
Returns the closest vertex to a geometry for a specified point.
QgsVertexIterator vertices() const
Returns a read-only, Java-style iterator for traversal of vertices of all the geometry, including all geometry parts and rings.
EndCapStyle
End cap styles for buffers.
virtual bool nextVertex(QgsVertexId &id, QgsPoint &vertex) const =0
Returns next vertex id and coordinates.
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...
virtual QgsRectangle boundingBox() const =0
Returns the minimal bounding box for the geometry.
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...
QgsGeometry & operator=(QgsGeometry const &rhs)
Creates a deep copy of the object.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
static std::unique_ptr< QgsPolygon > fromPolygonXY(const QgsPolygonXY &polygon)
Construct geometry from a polygon.
OperationResult
Success or failure of a geometry operation.
double closestSegmentWithContext(const QgsPointXY &point, QgsPointXY &minDistPoint, int &afterVertex, int *leftOf=nullptr, double epsilon=DEFAULT_SEGMENT_EPSILON) const
Searches for the closest segment of geometry to the given point.
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 ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
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...
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...
QVector< QgsPolygonXY > QgsMultiPolygonXY
A collection of QgsPolygons that share a common collection of attributes.
bool deleteRing(int ringNum, int partNum=0)
Deletes a ring in polygon or multipolygon.
int numInteriorRings() const
Returns the number of interior rings contained with the curve polygon.
bool addGeometry(QgsAbstractGeometry *g) override
Adds a geometry and takes ownership. Returns true in case of success.
int numPoints() const override
Returns the number of points in the curve.
bool contains(const QgsPointXY *p) const
Tests for containment of a point (uses GEOS)
QgsGeometry variableWidthBufferByM(int segments) const
Calculates a variable width buffer for a (multi)linestring geometry, where the width at each node is ...
QgsMultiPolygonXY asMultiPolygon() const
Returns contents of the geometry as a multi polygon if wkbType is WKBMultiPolygon, otherwise an empty list.
static std::unique_ptr< QgsMultiPoint > fromMultiPointXY(const QgsMultiPointXY &multipoint)
Construct geometry from a multipoint.
bool deletePart(int partNum)
Deletes part identified by the part number.
QVector< QgsPolylineXY > QgsMultiPolylineXY
A collection of QgsPolylines that share a common collection of attributes.
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...
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
Indicates that self-touching holes are permitted. OGC validity states that self-touching holes are NO...
bool disjoint(const QgsGeometry &geometry) const
Tests for if geometry is disjoint of another (uses GEOS)
Perform transforms between map coordinates and device coordinates.
QgsGeometry removeInteriorRings(double minimumAllowedArea=-1) const
Removes the interior rings from a (multi)polygon geometry.
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
bool touches(const QgsGeometry &geometry) const
Test for if geometry touch another (uses GEOS)
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
Nothing happened, without any error.
Type
The WKB type describes the number of dimensions a geometry has.
QgsGeometry taperedBuffer(double startWidth, double endWidth, int segments) const
Calculates a variable width buffer ("tapered buffer") for a (multi)curve geometry.
static QgsPolylineXY createPolylineFromQPolygonF(const QPolygonF &polygon)
Creates a QgsPolylineXY from a QPolygonF.
static bool deleteRing(QgsAbstractGeometry *geom, int ringNum, int partNum=0)
Deletes a ring from a geometry.
bool convertToSingleType()
Converts multi type geometry into single type geometry e.g.
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
double xMaximum() const
Returns the x maximum value (right side of rectangle).
Utility class for identifying a unique vertex within a geometry.
QString lastError() const
Returns an error string referring to the last error encountered either when this geometry was created...
bool contains(const QgsPoint &point, double epsilon=1E-8) const
Returns true if the circle contains the point.
bool overlaps(const QgsGeometry &geometry) const
Test for if geometry overlaps another (uses GEOS)
static QgsGeometry fromQPointF(QPointF point)
Construct geometry from a QPointF.
QgsGeometry forceRHR() const
Forces geometries to respect the Right-Hand-Rule, in which the area that is bounded by a polygon is t...
The part_iterator class provides STL-style iterator for geometry parts.
QgsGeometry makeValid() const
Attempts to make an invalid geometry valid without losing vertices.
bool deleteVertex(int atVertex)
Deletes the vertex at the given position number and item (first number is index 0) ...
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...
double yAt(int index) const override
Returns the y-coordinate of the specified node in the line string.
double closestVertexWithContext(const QgsPointXY &point, int &atVertex) const
Searches for the closest vertex in this geometry to the given point.
void setY(double y)
Sets the y value of the point.
QgsPolylineXY asPolyline() const
Returns the contents of the geometry as a polyline.
QgsGeometryCollection * createEmptyWithSameType() const override
Creates a new geometry with the same class and same WKB type as the original and transfers ownership...
static GeometryType geometryType(Type type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
bool boundingBoxIntersects(const QgsRectangle &rectangle) const
Returns true if the bounding box of this geometry intersects with a rectangle.
Use internal QgsGeometryValidator method.
static QgsGeometry fromMultiPointXY(const QgsMultiPointXY &multipoint)
Creates a new geometry from a QgsMultiPointXY object.
QgsGeometry densifyByCount(int extraNodesPerSegment) const
Densifies the geometry by adding the specified number of extra nodes within each segment of the geome...
T qgsgeometry_cast(const QgsAbstractGeometry *geom)
QgsGeometry difference(const QgsGeometry &geometry) const
Returns a geometry representing the points making up this geometry that do not make up other...
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...
QString asJson(int precision=17) const
Exports the geometry to a GeoJSON string.
QgsGeometry clipped(const QgsRectangle &rectangle)
Clips the geometry using the specified rectangle.
void transformVertices(const std::function< QgsPoint(const QgsPoint &) > &transform)
Transforms the vertices from the geometry in place, applying the transform function to every vertex...
Method not implemented in geometry engine.
QgsAbstractGeometry::const_part_iterator const_parts_begin() const
Returns STL-style const iterator pointing to the first part of the geometry.
QgsMultiPolylineXY asMultiPolyline() const
Returns contents of the geometry as a multi linestring if wkbType is WKBMultiLineString, otherwise an empty list.
virtual int ringCount(int part=0) const =0
Returns the number of rings of which this geometry is built.
Orientation
Curve orientation.
Abstract base class for curved geometry type.
static QgsPointXY interpolatePointOnLine(double x1, double y1, double x2, double y2, double fraction)
Interpolates the position of a point a fraction of the way along the line from (x1, y1) to (x2, y2).
int numGeometries() const
Returns the number of geometries within the collection.
bool intersects(const QgsRectangle &rectangle) const
Returns true if this geometry exactly intersects with a rectangle.
Abstract base class for all geometries.
QgsCoordinateSequence coordinateSequence() const override
Retrieves the sequence of geometries, rings and nodes.
The vertex_iterator class provides STL-style iterator for vertices.
Does vector analysis using the geos library and handles import, export, exception handling*...
QVector< QgsGeometry > asGeometryCollection() const
Returns contents of the geometry as a list of geometries.
static std::unique_ptr< QgsMultiLineString > fromMultiPolylineXY(const QgsMultiPolylineXY &multiline)
Construct geometry from a multipolyline.
Point geometry type, with support for z-dimension and m-values.
This class offers geometry processing methods.
void setX(double x)
Sets the x value of the point.
Error occurred while creating a noded geometry.
QgsLineString * clone() const override
Clones the geometry by performing a deep copy.
void draw(QPainter &p) const
Draws the geometry onto a QPainter.
QgsGeometry extrude(double x, double y)
Returns an extruded version of this geometry.
QgsGeometry taperedBuffer(double startWidth, double endWidth, int segments) const
Calculates a tapered width buffer for a (multi)curve geometry.
Error occurred in the geometry engine.
bool addGeometry(QgsAbstractGeometry *g) override
Adds a geometry and takes ownership. Returns true in case of success.
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...
Contains geos related utilities and functions.
QgsGeometry convexHull() const
Returns the smallest convex polygon that contains all the points in the geometry. ...
void setX(double x)
Sets the point's x-coordinate.
QgsAbstractGeometry * get()
Returns a modifiable (non-const) reference to the underlying abstract geometry primitive.
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry)
Creates and returns a new geometry engine.
QgsAbstractGeometry * combine(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const override
Calculate the combination of this and geom.
double length() const
Returns the length of geometry using GEOS.
static QgsGeometry fromPolygonXY(const QgsPolygonXY &polygon)
Creates a new geometry from a QgsPolygon.
BufferSide
Side of line to buffer.
QVector< QgsPoint > QgsPointSequence
static void convertPointList(const QVector< QgsPointXY > &input, QgsPointSequence &output)
Upgrades a point list from QgsPointXY to QgsPoint.
QgsGeometry simplify(double tolerance) const
Returns a simplified version of this geometry using a specified tolerance value.
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
static QgsGeometry fromWkt(const QString &wkt)
Creates a new geometry from a WKT string.
QgsGeometry minimalEnclosingCircle(QgsPointXY ¢er, double &radius, unsigned int segments=36) const
Returns the minimal enclosing circle for the geometry.
bool isGeosEqual(const QgsGeometry &) const
Compares the geometry with another geometry using GEOS.
static QgsGeometry::OperationResult addPart(QgsAbstractGeometry *geometry, std::unique_ptr< QgsAbstractGeometry > part)
Add a part to multi type geometry.
virtual void adjacentVertices(QgsVertexId vertex, QgsVertexId &previousVertex, QgsVertexId &nextVertex) const =0
Returns the vertices adjacent to a specified vertex within a geometry.
QgsGeometry densifyByDistance(double distance) const
Densifies the geometry by adding regularly placed extra nodes inside each segment so that the maximum...
int partCount() const override
Returns count of parts contained in the geometry.
QVector< QgsPointSequence > QgsRingSequence
bool crosses(const QgsGeometry &geometry) const
Test for if geometry crosses another (uses GEOS)
QVector< QgsPointXY > QgsPolylineXY
Polyline as represented as a vector of two-dimensional points.
QgsGeometry densifyByCount(int extraNodesPerSegment) const
Returns a copy of the geometry which has been densified by adding the specified number of extra nodes...
static double sqrDistance2D(const QgsPoint &pt1, const QgsPoint &pt2)
Returns the squared 2D distance between two points.
static std::unique_ptr< QgsAbstractGeometry > geomFromWkt(const QString &text)
Construct geometry from a WKT string.
QgsAbstractGeometry::const_part_iterator const_parts_end() const
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry...
QByteArray asWkb() const
Export the geometry to WKB.
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...
bool convertToMultiType()
Converts single type geometry into multitype geometry e.g.
QString asWkt(int precision=17) const
Exports the geometry to WKT.
QgsGeometry shortestLine(const QgsGeometry &other) const
Returns the shortest line joining this geometry to another geometry.
The base geometry on which the operation is done is invalid or empty.
Multi polygon geometry collection.
QgsGeometry nearestPoint(const QgsGeometry &other) const
Returns the nearest point on this geometry to another geometry.
virtual QgsPolygon * toPolygon(unsigned int segments=36) const
Returns a segmented polygon.
The input geometry (ring, part, split line, etc.) has not the correct geometry type.
OperationResult splitGeometry(const QVector< QgsPointXY > &splitLine, QVector< QgsGeometry > &newGeometries, bool topological, QVector< QgsPointXY > &topologyTestPoints)
Splits this geometry according to a given line.
static QgsGeometry polygonize(const QVector< QgsGeometry > &geometries)
Creates a GeometryCollection geometry containing possible polygons formed from the constituent linewo...
void mapToPixel(const QgsMapToPixel &mtp)
Transforms the geometry from map units to pixels in place.
static bool isCurvedType(Type type)
Returns true if the WKB type is a curved type or can contain curved geometries.
QgsGeometry convertToType(QgsWkbTypes::GeometryType destType, bool destMultipart=false) const
Try to convert the geometry to the requested type.
Line string geometry type, with support for z-dimension and m-values.
static QgsGeometry createWedgeBuffer(const QgsPoint ¢er, double azimuth, double angularWidth, double outerRadius, double innerRadius=0)
Creates a wedge shaped buffer from a center point.
static std::unique_ptr< QgsAbstractGeometry > avoidIntersections(const QgsAbstractGeometry &geom, const QList< QgsVectorLayer * > &avoidIntersectionsLayers, 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...
const QgsCurve * interiorRing(int i) const
Retrieves an interior ring from the curve polygon.
ValidationMethod
Available methods for validating geometries.
bool isMultipart() const
Returns true if WKB of the geometry is of WKBMulti* type.
QgsGeometry makeDifference(const QgsGeometry &other) const
Returns the geometry formed by modifying this geometry such that it does not intersect the other geom...
QgsGeometryConstPartIterator constParts() const
Returns Java-style iterator for traversal of parts of the geometry.
virtual int vertexCount(int part=0, int ring=0) const =0
Returns the number of vertices of which this geometry is built.
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...
std::unique_ptr< QgsAbstractGeometry > _qgis_lwgeom_make_valid(const QgsAbstractGeometry *lwgeom_in, QString &errorMessage)
Implementation of QgsGeometry::makeValid(). Not a public API.
static QgsCircle minimalCircleFrom3Points(const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3, double epsilon=1E-8)
Constructs the smallest circle from 3 points.
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.
double hausdorffDistance(const QgsGeometry &geom) const
Returns the Hausdorff distance between this geometry and geom.
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
virtual double area() const
Returns the area of the geometry.
QgsGeometry symDifference(const QgsGeometry &geometry) const
Returns a geometry representing the points making up this geometry that do not make up other...
QgsGeometry combine(const QgsGeometry &geometry) const
Returns a geometry representing all the points in this geometry and other (a union geometry operation...
QgsGeometry orientedMinimumBoundingBox() const
Returns the oriented minimum bounding box for the geometry, which is the smallest (by area) rotated r...
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.
bool requiresConversionToStraightSegments() const
Returns true if the geometry is a curved geometry type which requires conversion to display as straig...
double lineLocatePoint(const QgsGeometry &point) const
Returns a distance representing the location along this linestring of the closest point on this lines...
QgsMultiPointXY asMultiPoint() const
Returns contents of the geometry as a multi point if wkbType is WKBMultiPoint, otherwise an empty lis...
double xAt(int index) const override
Returns the x-coordinate of the specified node in the line string.
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 polygonize(const QVector< const QgsAbstractGeometry * > &geometries, QString *errorMsg=nullptr)
Creates a GeometryCollection geometry containing possible polygons formed from the constituent linewo...
Contains geometry relation and modification algorithms.
std::unique_ptr< QgsAbstractGeometry > subdivide(int maxNodes, QString *errorMsg=nullptr) const
Subdivides the geometry.
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
Circular string geometry type.
static QgsCircle from2Points(const QgsPoint &pt1, const QgsPoint &pt2)
Constructs a circle by 2 points on the circle.
bool within(const QgsGeometry &geometry) const
Test for if geometry is within another (uses GEOS)
bool isValid() const
Returns true if the vertex id is valid.
static bool deletePart(QgsAbstractGeometry *geom, int partNum)
Deletes a part from a geometry.
double radius() const
Returns the radius of the circle.
QgsGeometry delaunayTriangulation(double tolerance=0.0, bool edgesOnly=false) const
Returns the Delaunay triangulation for the vertices of the geometry.
QgsGeometry variableWidthBufferByM(int segments) const
Calculates a variable width buffer using the m-values from a (multi)line geometry.
virtual bool dropMValue()=0
Drops any measure values which exist in the geometry.
EngineOperationResult
Success or failure of a geometry operation.
bool equals(const QgsGeometry &geometry) const
Test if this geometry is exactly equal to another geometry.
JoinStyle
Join styles for buffers.
void set(QgsAbstractGeometry *geometry)
Sets the underlying geometry store.
double width() const
Returns the width of the rectangle.
virtual QgsPoint vertexAt(QgsVertexId id) const =0
Returns the point corresponding to a specified vertex id.
QgsPoint center() const
Returns the center point.
Represents a vector layer which manages a vector based data sets.
QgsPointXY transform(const QgsPointXY &p) const
Transform the point from map (world) coordinates to device coordinates.
QgsAbstractGeometry::part_iterator parts_begin()
Returns STL-style iterator pointing to the first part of the geometry.
static Type flatType(Type type)
Returns the flat type for a WKB type.
QgsWkbTypes::GeometryType type() const
Returns type of the geometry as a QgsWkbTypes::GeometryType.
double distanceToVertex(int vertex) const
Returns the distance along this geometry from its first vertex to the specified vertex.
QgsPoint project(double distance, double azimuth, double inclination=90.0) const
Returns a new point which correspond to this point projected by a specified distance with specified a...
double xMinimum() const
Returns the x minimum value (left side of rectangle).
static QgsGeometry unaryUnion(const QVector< QgsGeometry > &geometries)
Compute the unary union on a list of geometries.
static QgsGeometry collectGeometry(const QVector< QgsGeometry > &geometries)
Creates a new multipart geometry from a list of QgsGeometry objects.
QgsWkbTypes::Type wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
The geometry on which the operation occurs is not valid.
virtual int numPoints() const =0
Returns the number of points in the curve.
QgsGeometry mergeLines() const
Merges any connected lines in a LineString/MultiLineString geometry and converts them to single line ...
static double distanceToVertex(const QgsAbstractGeometry &geom, QgsVertexId id)
Returns the distance along a geometry from its first vertex to the specified vertex.
QgsAbstractGeometry::part_iterator parts_end()
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry...
QgsPoint vertexAt(int atVertex) const
Returns coordinates of a vertex.
double ANALYSIS_EXPORT leftOf(const QgsPoint &thepoint, const QgsPoint *p1, const QgsPoint *p2)
Returns whether 'thepoint' is left or right of the line from 'p1' to 'p2'. Negativ values mean left a...
virtual bool dropZValue()=0
Drops any z-dimensions which exist in the geometry.
double area() const
Returns the area of the geometry using GEOS.
static QgsGeometry fromPointXY(const QgsPointXY &point)
Creates a new geometry from a QgsPointXY object.
static QgsGeometry::OperationResult addRing(QgsAbstractGeometry *geometry, std::unique_ptr< QgsCurve > ring)
Add an interior ring to a geometry.
QgsPointXY closestVertex(const QgsPointXY &point, int &atVertex, int &beforeVertex, int &afterVertex, double &sqrDist) const
Returns the vertex closest to the given point, the corresponding vertex index, squared distance snap ...
std::unique_ptr< QgsAbstractGeometry > 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.
virtual bool addGeometry(QgsAbstractGeometry *g)
Adds a geometry and takes ownership. Returns true in case of success.
double height() const
Returns the height of the rectangle.
QgsGeometry centroid() const
Returns the center of mass of a 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.
static std::unique_ptr< QgsMultiPolygon > fromMultiPolygonXY(const QgsMultiPolygonXY &multipoly)
Construct geometry from a multipolygon.
std::unique_ptr< QgsLineString > smoothCurve(const QgsLineString &line, const unsigned int iterations, const double offset, double squareDistThreshold, double maxAngleRads, bool isRing)
QDataStream & operator>>(QDataStream &in, QgsGeometry &geometry)
Reads a geometry from stream in into geometry. QGIS version compatibility is not guaranteed.
QgsPolygonXY asPolygon() const
Returns the contents of the geometry as a polygon.
QgsGeometry poleOfInaccessibility(double precision, double *distanceFromBoundary=nullptr) const
Calculates the approximate pole of inaccessibility for a surface, which is the most distant internal ...