20 #include <nlohmann/json.hpp> 55 std::unique_ptr< QgsAbstractGeometry >
geometry;
65 if ( !d->
ref.deref() )
73 d->
ref = QAtomicInt( 1 );
80 d->
ref = QAtomicInt( 1 );
86 mLastError = other.mLastError;
92 if ( !d->
ref.deref() )
97 mLastError = other.mLastError;
103 void QgsGeometry::detach()
108 std::unique_ptr< QgsAbstractGeometry > cGeom;
110 cGeom.reset( d->
geometry->clone() );
112 reset( std::move( cGeom ) );
115 void QgsGeometry::reset( std::unique_ptr<QgsAbstractGeometry> newGeometry )
119 ( void )d->
ref.deref();
122 d->
geometry = std::move( newGeometry );
138 if ( d->
geometry.get() == geometry )
143 reset( std::unique_ptr< QgsAbstractGeometry >( geometry ) );
183 return QgsGeometry( qgis::make_unique< QgsLineString >( polyline ) );
228 std::unique_ptr< QgsLineString > ext = qgis::make_unique< QgsLineString >(
229 QVector< double >() << rect.
xMinimum()
234 QVector< double >() << rect.
yMinimum()
239 std::unique_ptr< QgsPolygon > polygon = qgis::make_unique< QgsPolygon >();
240 polygon->setExteriorRing( ext.release() );
257 if ( g.isMultipart() )
259 for (
auto p = g.const_parts_begin(); p != g.const_parts_end(); ++p )
261 collected.
addPart( ( *p )->clone() );
275 if ( std::abs( angularWidth ) >= 360.0 )
277 std::unique_ptr< QgsCompoundCurve > outerCc = qgis::make_unique< QgsCompoundCurve >();
280 outerCc->addCurve( outerCircle.toCircularString() );
282 std::unique_ptr< QgsCurvePolygon > cp = qgis::make_unique< QgsCurvePolygon >();
283 cp->setExteriorRing( outerCc.release() );
287 std::unique_ptr< QgsCompoundCurve > innerCc = qgis::make_unique< QgsCompoundCurve >();
290 innerCc->addCurve( innerCircle.toCircularString() );
292 cp->setInteriorRings( { innerCc.release() } );
298 std::unique_ptr< QgsCompoundCurve > wedge = qgis::make_unique< QgsCompoundCurve >();
300 const double startAngle = azimuth - angularWidth * 0.5;
301 const double endAngle = azimuth + angularWidth * 0.5;
306 const bool useShortestArc = angularWidth <= 180.0;
324 std::unique_ptr< QgsCurvePolygon > cp = qgis::make_unique< QgsCurvePolygon >();
325 cp->setExteriorRing( wedge.release() );
404 d->
geometry->adjacentVertices(
id, prevVertex, nextVertex );
440 return d->
geometry->vertexAngle( v2 );
459 d->
geometry->adjacentVertices(
id, beforeVertexId, afterVertexId );
497 return d->
geometry->moveVertex(
id, p );
530 return d->
geometry->deleteVertex(
id );
582 return d->
geometry->insertVertex(
id, point );
598 return d->
geometry->vertexAt( vId );
612 result.mLastError = mLastError;
621 result.mLastError = mLastError;
645 double epsilon )
const 655 double sqrDist = d->
geometry->closestSegment(
QgsPoint( point ), segmentPt, vertexAfter, leftOf, epsilon );
659 minDistPoint.
setX( segmentPt.
x() );
660 minDistPoint.
setY( segmentPt.
y() );
667 std::unique_ptr< QgsLineString > ringLine = qgis::make_unique< QgsLineString >( ring );
668 return addRing( ringLine.release() );
673 std::unique_ptr< QgsCurve > r( ring );
693 std::unique_ptr< QgsAbstractGeometry > partGeom;
694 if ( points.size() == 1 )
696 partGeom = qgis::make_unique< QgsPoint >( points[0] );
698 else if ( points.size() > 1 )
700 std::unique_ptr< QgsLineString > ringLine = qgis::make_unique< QgsLineString >();
701 ringLine->setPoints( points );
702 partGeom = std::move( ringLine );
704 return addPart( partGeom.release(), geomType );
709 std::unique_ptr< QgsAbstractGeometry > p( part );
715 reset( qgis::make_unique< QgsMultiPoint >() );
718 reset( qgis::make_unique< QgsMultiLineString >() );
721 reset( qgis::make_unique< QgsMultiPolygon >() );
725 return QgsGeometry::OperationResult::AddPartNotMultiGeometry;
761 QVector<QgsGeometry> results;
762 results.reserve( parts.count() );
769 if ( results.isEmpty() )
773 for (
const QgsGeometry &result : qgis::as_const( results ) )
781 std::unique_ptr< QgsCurvePolygon > newPoly( static_cast< QgsCurvePolygon * >( d->
geometry->clone() ) );
782 newPoly->removeInteriorRings( minimumRingArea );
796 d->
geometry->transform( QTransform::fromTranslate( dx, dy ), dz, 1.0, dm );
809 QTransform t = QTransform::fromTranslate( center.
x(), center.
y() );
810 t.rotate( -rotation );
811 t.translate( -center.
x(), -center.
y() );
821 return splitGeometry( split, newGeometries, topological, topology );
827 return QgsGeometry::OperationResult::InvalidBaseGeometry;
830 QVector<QgsGeometry > newGeoms;
839 *
this = newGeoms.takeAt( 0 );
841 newGeometries = newGeoms;
847 return QgsGeometry::OperationResult::Success;
851 return QgsGeometry::OperationResult::GeometryEngineError;
853 return QgsGeometry::OperationResult::InvalidBaseGeometry;
855 return QgsGeometry::OperationResult::InvalidInputGeometryType;
857 return QgsGeometry::OperationResult::SplitCannotSplitPoint;
859 return QgsGeometry::OperationResult::NothingHappened;
878 std::unique_ptr< QgsAbstractGeometry > geom(
geos.reshapeGeometry( reshapeLineString, &errorCode, &mLastError ) );
881 reset( std::move( geom ) );
917 std::unique_ptr< QgsAbstractGeometry > diffGeom(
geos.intersection( other.
constGet(), &mLastError ) );
923 reset( std::move( diffGeom ) );
937 std::unique_ptr< QgsAbstractGeometry > diffGeom(
geos.intersection( other.
constGet(), &mLastError ) );
941 result.mLastError = mLastError;
960 area = std::numeric_limits<double>::max();
962 width = std::numeric_limits<double>::max();
963 height = std::numeric_limits<double>::max();
979 double prevAngle = 0.0;
983 double rotateAngle = 180.0 / M_PI * ( currentAngle - prevAngle );
984 prevAngle = currentAngle;
986 QTransform t = QTransform::fromTranslate( pt0.
x(), pt0.
y() );
987 t.rotate( rotateAngle );
988 t.translate( -pt0.
x(), -pt0.
y() );
993 double currentArea = bounds.
width() * bounds.
height();
994 if ( currentArea < area )
998 angle = 180.0 / M_PI * currentAngle;
999 width = bounds.
width();
1000 height = bounds.
height();
1010 if ( angle > 180.0 )
1011 angle = std::fmod( angle, 180.0 );
1024 auto l_boundary = boundary.length();
1026 if ( ( points.length() == 0 ) || ( l_boundary == 3 ) )
1028 switch ( l_boundary )
1035 boundary.pop_back();
1040 boundary.pop_back();
1042 boundary.pop_back();
1059 circ_mec = __recMinimalEnclosingCircle( points, boundary );
1063 boundary.append( pxy );
1064 circ_mec = __recMinimalEnclosingCircle( points, boundary );
1088 QgsCircle circ = __recMinimalEnclosingCircle( P, R );
1109 return engine.
orthogonalize( tolerance, maxIterations, angleThreshold );
1118 return QgsGeometry( d->
geometry->snappedToGrid( hSpacing, vSpacing, dSpacing, mSpacing ) );
1127 return d->
geometry->removeDuplicateNodes( epsilon, useZValues );
1155 return geos.intersects( geometry.d->
geometry.get(), &mLastError );
1172 return d->
geometry->boundingBox().intersects( rectangle );
1195 return geos.contains( &pt, &mLastError );
1207 return geos.contains( geometry.d->
geometry.get(), &mLastError );
1219 return geos.disjoint( geometry.d->
geometry.get(), &mLastError );
1230 if ( d == geometry.d )
1250 return geos.touches( geometry.d->
geometry.get(), &mLastError );
1262 return geos.overlaps( geometry.d->
geometry.get(), &mLastError );
1274 return geos.within( geometry.d->
geometry.get(), &mLastError );
1286 return geos.crosses( geometry.d->
geometry.get(), &mLastError );
1295 return d->
geometry->asWkt( precision );
1300 return QString::fromStdString(
asJsonObject( precision ).dump() );
1309 return d->
geometry->asJsonObject( precision );
1318 return convertToPoint( destMultipart );
1321 return convertToLine( destMultipart );
1324 return convertToPolygon( destMultipart );
1376 if ( !multiGeom || multiGeom->
partCount() < 1 )
1379 std::unique_ptr< QgsAbstractGeometry > firstPart( multiGeom->
geometryN( 0 )->
clone() );
1380 reset( std::move( firstPart ) );
1391 std::unique_ptr<QgsGeometryCollection> resGeom;
1395 resGeom = qgis::make_unique<QgsMultiPoint>();
1398 resGeom = qgis::make_unique<QgsMultiLineString>();
1401 resGeom = qgis::make_unique<QgsMultiPolygon>();
1414 resGeom->addGeometry( g->
clone() );
1417 set( resGeom.release() );
1447 std::unique_ptr< QgsLineString > segmentizedLine;
1449 if ( doSegmentation )
1457 line = segmentizedLine.get();
1469 polyLine.resize( nVertices );
1471 const double *xData = line->
xData();
1472 const double *yData = line->
yData();
1473 for (
int i = 0; i < nVertices; ++i )
1475 data->
setX( *xData++ );
1476 data->
setY( *yData++ );
1491 std::unique_ptr< QgsPolygon > segmentized;
1492 if ( doSegmentation )
1499 segmentized.reset( curvePoly->
toPolygon() );
1500 p = segmentized.get();
1513 convertPolygon( *p, polygon );
1533 for (
int i = 0; i < nPoints; ++i )
1536 multiPoint[i].
setX( pt->
x() );
1537 multiPoint[i].setY( pt->
y() );
1550 if ( !geomCollection )
1562 mpl.reserve( nLines );
1563 for (
int i = 0; i < nLines; ++i )
1566 std::unique_ptr< QgsLineString > segmentized;
1575 line = segmentized.get();
1580 polyLine.resize( nVertices );
1582 const double *xData = line->
xData();
1583 const double *yData = line->
yData();
1584 for (
int i = 0; i < nVertices; ++i )
1586 data->
setX( *xData++ );
1587 data->
setY( *yData++ );
1590 mpl.append( polyLine );
1603 if ( !geomCollection )
1609 if ( nPolygons < 1 )
1615 for (
int i = 0; i < nPolygons; ++i )
1632 convertPolygon( *polygon, poly );
1648 double geosArea = g.
area();
1649 double qgisArea = 0;
1653 qgisArea = surface->
area();
1658 return g.area( &mLastError );
1669 return g.length( &mLastError );
1687 return g.distance( geom.d->
geometry.get(), &mLastError );
1699 return g.hausdorffDistance( geom.d->
geometry.get(), &mLastError );
1711 return g.hausdorffDistanceDensify( geom.d->
geometry.get(), densifyFraction, &mLastError );
1718 return d->
geometry->vertices_begin();
1725 return d->
geometry->vertices_end();
1755 return d->
geometry->const_parts_begin();
1762 return d->
geometry->const_parts_end();
1791 std::unique_ptr<QgsAbstractGeometry> geom( g.buffer( distance, segments, &mLastError ) );
1795 result.mLastError = mLastError;
1810 QgsAbstractGeometry *geom = g.buffer( distance, segments, endCapStyle, joinStyle, miterLimit, &mLastError );
1814 result.mLastError = mLastError;
1830 QVector<QgsGeometry> results;
1831 results.reserve( parts.count() );
1838 if ( results.isEmpty() )
1842 for (
const QgsGeometry &result : qgis::as_const( results ) )
1856 std::unique_ptr< QgsAbstractGeometry > offsetGeom(
geos.offsetCurve( distance, segments, joinStyle, miterLimit, &mLastError ) );
1860 result.mLastError = mLastError;
1864 if (
const QgsCurve *
offsetCurve = qgsgeometry_cast< const QgsCurve * >( offsetGeom.get() ) )
1867 if ( newOrientation != prevOrientation )
1870 std::unique_ptr< QgsAbstractGeometry > flipped(
offsetCurve->reversed() );
1871 offsetGeom = std::move( flipped );
1888 QVector<QgsGeometry> results;
1889 results.reserve( parts.count() );
1896 if ( results.isEmpty() )
1900 for (
const QgsGeometry &result : qgis::as_const( results ) )
1910 std::unique_ptr< QgsAbstractGeometry > bufferGeom =
geos.singleSidedBuffer( distance, segments, side,
1911 joinStyle, miterLimit, &mLastError );
1915 result.mLastError = mLastError;
1926 return engine.
taperedBuffer( startWidth, endWidth, segments );
1946 QVector<QgsGeometry> results;
1947 results.reserve( parts.count() );
1954 if ( results.isEmpty() )
1958 for (
const QgsGeometry &result : qgis::as_const( results ) )
1970 std::unique_ptr< QgsLineString > newLine( line->
clone() );
1971 newLine->extend( startDistance, endDistance );
1985 std::unique_ptr< QgsAbstractGeometry > simplifiedGeom(
geos.simplify( tolerance, &mLastError ) );
1986 if ( !simplifiedGeom )
1989 result.mLastError = mLastError;
1992 return QgsGeometry( std::move( simplifiedGeom ) );
2029 result.mLastError = mLastError;
2044 result.mLastError = mLastError;
2063 std::unique_ptr< QgsAbstractGeometry > cHull(
geos.convexHull( &mLastError ) );
2067 geom.mLastError = mLastError;
2083 result.mLastError = mLastError;
2096 QgsGeometry result =
geos.delaunayTriangulation( tolerance, edgesOnly );
2097 result.mLastError = mLastError;
2109 std::unique_ptr< QgsAbstractGeometry > segmentizedCopy;
2112 segmentizedCopy.reset( d->
geometry->segmentize() );
2113 geom = segmentizedCopy.get();
2118 std::unique_ptr< QgsAbstractGeometry > result( geos.
subdivide( maxNodes, &mLastError ) );
2122 geom.mLastError = mLastError;
2148 for (
int part = 0; part < collection->
numGeometries(); ++part )
2153 const double candidateLength = candidate->
length();
2154 if ( candidateLength >= distance )
2160 distance -= candidateLength;
2170 std::unique_ptr< QgsPoint > result( curve->interpolatePoint( distance ) );
2189 segmentized =
QgsGeometry( static_cast< QgsCurve * >( d->
geometry.get() )->segmentize() );
2194 return geos.lineLocatePoint( *( static_cast< QgsPoint * >( point.d->
geometry.get() ) ), &mLastError );
2206 segmentized =
QgsGeometry( static_cast< QgsCurve * >( d->
geometry.get() )->segmentize() );
2214 if ( previous == next )
2261 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.intersection( geometry.d->
geometry.get(), &mLastError ) );
2266 geom.mLastError = mLastError;
2282 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.combine( geometry.d->
geometry.get(), &mLastError ) );
2286 geom.mLastError = mLastError;
2308 result.mLastError = mLastError;
2322 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.difference( geometry.d->
geometry.get(), &mLastError ) );
2326 geom.mLastError = mLastError;
2342 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.symDifference( geometry.d->
geometry.get(), &mLastError ) );
2346 geom.mLastError = mLastError;
2356 return engine.
extrude( x, y );
2363 return QVector< QgsPointXY >();
2371 return QVector< QgsPointXY >();
2384 QVector<QgsGeometry> geometryList;
2387 return geometryList;
2394 geometryList.reserve( numGeom );
2395 for (
int i = 0; i < numGeom; ++i )
2402 geometryList.append( *
this );
2405 return geometryList;
2431 const double *srcX = line->
xData();
2432 const double *srcY = line->
yData();
2434 QPolygonF res( count );
2435 QPointF *dest = res.data();
2436 for (
int i = 0; i < count; ++i )
2438 *dest++ = QPointF( *srcX++, *srcY++ );
2488 reset( std::move( diffGeom ) );
2503 result.mLastError = mLastError;
2520 if (
const QgsCurvePolygon *cp = qgsgeometry_cast< const QgsCurvePolygon * >( g ) )
2522 std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
2523 corrected->forceRHR();
2524 newCollection->addGeometry( corrected.release() );
2528 newCollection->addGeometry( g->
clone() );
2537 std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
2538 corrected->forceRHR();
2597 return d->
geometry->isValid( mLastError, static_cast< int >( flags ) );
2607 return geos.isSimple( &mLastError );
2638 return geos.isEqual( g.d->
geometry.get(), &mLastError );
2646 std::unique_ptr< QgsAbstractGeometry > geom( geos.
combine( geometries, &error ) );
2648 result.mLastError = error;
2656 QVector<const QgsAbstractGeometry *> geomV2List;
2659 if ( !( g.isNull() ) )
2661 geomV2List.append( g.constGet() );
2667 result.mLastError = error;
2678 std::unique_ptr< QgsAbstractGeometry > straightGeom( d->
geometry->segmentize( tolerance, toleranceType ) );
2679 reset( std::move( straightGeom ) );
2689 return d->
geometry->hasCurvedSegments();
2700 d->
geometry->transform( ct, direction, transformZ );
2712 d->
geometry->transform( ct, zTranslate, zScale, mTranslate, mScale );
2734 std::unique_ptr< QgsAbstractGeometry > resultGeom =
geos.clip( rectangle, &mLastError );
2738 result.mLastError = mLastError;
2752 static bool vertexIndexInfo(
const QgsAbstractGeometry *g,
int vertexIndex,
int &partIndex,
int &ringIndex,
int &vertex )
2754 if ( vertexIndex < 0 )
2757 if (
const QgsGeometryCollection *geomCollection = qgsgeometry_cast<const QgsGeometryCollection *>( g ) )
2761 for (
int i = 0; i < geomCollection->numGeometries(); ++i )
2767 for (
int k = 0; k < part->
ringCount(); ++k )
2770 if ( vertexIndex < numPoints )
2773 return vertexIndexInfo( part, vertexIndex, nothing, ringIndex, vertex );
2775 vertexIndex -= numPoints;
2776 offset += numPoints;
2780 else if (
const QgsCurvePolygon *curvePolygon = qgsgeometry_cast<const QgsCurvePolygon *>( g ) )
2782 const QgsCurve *ring = curvePolygon->exteriorRing();
2783 if ( vertexIndex < ring->numPoints() )
2787 vertex = vertexIndex;
2792 for (
int i = 0; i < curvePolygon->numInteriorRings(); ++i )
2794 const QgsCurve *ring = curvePolygon->interiorRing( i );
2795 if ( vertexIndex < ring->numPoints() )
2798 vertex = vertexIndex;
2805 else if (
const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( g ) )
2807 if ( vertexIndex < curve->numPoints() )
2811 vertex = vertexIndex;
2815 else if ( qgsgeometry_cast<const QgsPoint *>( g ) )
2817 if ( vertexIndex == 0 )
2838 bool res = vertexIndexInfo( d->
geometry.get(), nr,
id.part,
id.ring,
id.vertex );
2844 if (
const QgsGeometryCollection *geomCollection = qgsgeometry_cast<const QgsGeometryCollection *>( g ) )
2846 g = geomCollection->geometryN(
id.part );
2849 if (
const QgsCurvePolygon *curvePolygon = qgsgeometry_cast<const QgsCurvePolygon *>( g ) )
2851 g =
id.ring == 0 ? curvePolygon->exteriorRing() : curvePolygon->interiorRing(
id.ring - 1 );
2854 if (
const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( g ) )
2857 res = curve->pointAt(
id.vertex, p,
id.
type );
2871 return d->
geometry->vertexNumberFromVertexId(
id );
2886 d->
geometry->filterVertices( filter );
2920 output.resize( input.size() );
2922 for (
int i = 0; i < input.size(); ++i )
2924 const QgsPoint &pt = input.at( i );
2925 output[i].
setX( pt.
x() );
2926 output[i].setY( pt.
y() );
2934 if ( coords.empty() )
2939 output.resize( rings.size() );
2940 for (
int i = 0; i < rings.size(); ++i )
2942 convertToPolyline( rings[i], output[i] );
2948 return QgsGeometry( qgis::make_unique< QgsPoint >( point.x(), point.y() ) );
2955 if ( polygon.isClosed() )
2957 std::unique_ptr< QgsPolygon > poly = qgis::make_unique< QgsPolygon >();
2958 poly->setExteriorRing( ring.release() );
2979 result.reserve( polygon.count() );
2980 for (
const QPointF &p : polygon )
2989 if ( p1.count() != p2.count() )
2992 for (
int i = 0; i < p1.count(); ++i )
2994 if ( !p1.at( i ).compare( p2.at( i ), epsilon ) )
3002 if ( p1.count() != p2.count() )
3005 for (
int i = 0; i < p1.count(); ++i )
3016 if ( p1.count() != p2.count() )
3019 for (
int i = 0; i < p1.count(); ++i )
3046 return QgsGeometry( smoothLine( *lineString, iterations, offset, minimumDistance, maxAngle ) );
3053 std::unique_ptr< QgsMultiLineString > resultMultiline = qgis::make_unique< QgsMultiLineString> ();
3057 resultMultiline->addGeometry( smoothLine( *( static_cast< QgsLineString * >( multiLine->
geometryN( i ) ) ), iterations, offset, minimumDistance, maxAngle ).release() );
3059 return QgsGeometry( std::move( resultMultiline ) );
3065 return QgsGeometry( smoothPolygon( *poly, iterations, offset, minimumDistance, maxAngle ) );
3072 std::unique_ptr< QgsMultiPolygon > resultMultiPoly = qgis::make_unique< QgsMultiPolygon >();
3076 resultMultiPoly->addGeometry( smoothPolygon( *( static_cast< QgsPolygon * >( multiPoly->
geometryN( i ) ) ), iterations, offset, minimumDistance, maxAngle ).release() );
3078 return QgsGeometry( std::move( resultMultiPoly ) );
3088 const double offset,
double squareDistThreshold,
double maxAngleRads,
3091 std::unique_ptr< QgsLineString > result = qgis::make_unique< QgsLineString >( line );
3093 for (
unsigned int iteration = 0; iteration < iterations; ++iteration )
3095 outputLine.resize( 0 );
3096 outputLine.reserve( 2 * ( result->numPoints() - 1 ) );
3097 bool skipFirst =
false;
3098 bool skipLast =
false;
3101 QgsPoint p1 = result->pointN( result->numPoints() - 2 );
3106 angle = std::fabs( M_PI - angle );
3107 skipFirst = angle > maxAngleRads;
3109 for (
int i = 0; i < result->numPoints() - 1; i++ )
3112 QgsPoint p2 = result->pointN( i + 1 );
3114 double angle = M_PI;
3115 if ( i == 0 && isRing )
3117 QgsPoint p3 = result->pointN( result->numPoints() - 2 );
3121 else if ( i < result->numPoints() - 2 )
3123 QgsPoint p3 = result->pointN( i + 2 );
3127 else if ( i == result->numPoints() - 2 && isRing )
3134 skipLast = angle < M_PI - maxAngleRads || angle > M_PI + maxAngleRads;
3137 if ( i == 0 || i >= result->numPoints() - 2
3162 skipFirst = skipLast;
3165 if ( isRing && outputLine.at( 0 ) != outputLine.at( outputLine.count() - 1 ) )
3166 outputLine << outputLine.at( 0 );
3168 result->setPoints( outputLine );
3173 std::unique_ptr<QgsLineString> QgsGeometry::smoothLine(
const QgsLineString &line,
const unsigned int iterations,
const double offset,
double minimumDistance,
double maxAngle )
const 3175 double maxAngleRads = maxAngle * M_PI / 180.0;
3176 double squareDistThreshold = minimumDistance > 0 ? minimumDistance * minimumDistance : -1;
3177 return smoothCurve( line, iterations, offset, squareDistThreshold, maxAngleRads,
false );
3180 std::unique_ptr<QgsPolygon> QgsGeometry::smoothPolygon(
const QgsPolygon &polygon,
const unsigned int iterations,
const double offset,
double minimumDistance,
double maxAngle )
const 3182 double maxAngleRads = maxAngle * M_PI / 180.0;
3183 double squareDistThreshold = minimumDistance > 0 ? minimumDistance * minimumDistance : -1;
3184 std::unique_ptr< QgsPolygon > resultPoly = qgis::make_unique< QgsPolygon >();
3186 resultPoly->setExteriorRing(
smoothCurve( *( static_cast< const QgsLineString *>( polygon.
exteriorRing() ) ), iterations, offset,
3187 squareDistThreshold, maxAngleRads, true ).release() );
3191 resultPoly->addInteriorRing(
smoothCurve( *( static_cast< const QgsLineString *>( polygon.
interiorRing( i ) ) ), iterations, offset,
3192 squareDistThreshold, maxAngleRads, true ).release() );
3197 QgsGeometry QgsGeometry::convertToPoint(
bool destMultipart )
const 3205 if ( ( destMultipart && srcIsMultipart ) ||
3206 ( !destMultipart && !srcIsMultipart ) )
3211 if ( destMultipart )
3220 if ( multiPoint.count() == 1 )
3231 if ( !destMultipart )
3248 if ( !line.isEmpty() )
3257 if ( !destMultipart )
3288 QgsGeometry QgsGeometry::convertToLine(
bool destMultipart )
const 3298 if ( multiPoint.count() < 2 )
3301 if ( destMultipart )
3311 if ( ( destMultipart && srcIsMultipart ) ||
3312 ( !destMultipart && ! srcIsMultipart ) )
3317 if ( destMultipart )
3321 if ( !line.isEmpty() )
3328 if ( multiLine.count() == 1 )
3345 if ( destMultipart )
3350 else if ( multiLine.count() == 1 )
3361 if ( polygon.count() > 1 )
3365 if ( destMultipart )
3369 multiLine.reserve( polygon.count() );
3376 else if ( polygon.count() == 1 )
3378 if ( destMultipart )
3396 QgsGeometry QgsGeometry::convertToPolygon(
bool destMultipart )
const 3406 if ( multiPoint.count() < 3 )
3409 if ( multiPoint.last() != multiPoint.first() )
3410 multiPoint << multiPoint.first();
3413 if ( destMultipart )
3426 for ( QgsMultiPolylineXY::iterator multiLineIt = multiLine.begin(); multiLineIt != multiLine.end(); ++multiLineIt )
3429 if ( ( *multiLineIt ).count() < 3 )
3431 if ( ( *multiLineIt ).count() == 3 && ( *multiLineIt ).first() == ( *multiLineIt ).last() )
3435 if ( ( *multiLineIt ).first() != ( *multiLineIt ).last() )
3436 *multiLineIt << ( *multiLineIt ).first();
3440 if ( !multiPolygon.isEmpty() )
3442 if ( destMultipart )
3446 else if ( multiPolygon.count() == 1 )
3459 if ( line.count() < 3 )
3461 if ( line.count() == 3 && line.first() == line.last() )
3465 if ( line.first() != line.last() )
3466 line << line.first();
3469 if ( destMultipart )
3485 if ( ( destMultipart && srcIsMultipart ) ||
3486 ( !destMultipart && ! srcIsMultipart ) )
3491 if ( destMultipart )
3495 if ( !polygon.isEmpty() )
3501 if ( multiPolygon.count() == 1 )
3517 return new QgsGeos( geometry );
3522 out << geometry.
asWkb();
3528 QByteArray byteArray;
3530 if ( byteArray.isEmpty() )
3532 geometry.
set(
nullptr );
3536 geometry.
fromWkb( byteArray );
3553 return mHasLocation;
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.
bool boundingBoxIntersects(const QgsRectangle &rectangle) const
Returns true if the bounding box of this geometry intersects with a rectangle.
bool convertGeometryCollectionToSubclass(QgsWkbTypes::GeometryType geomType)
Converts geometry collection to a the desired geometry type subclass (multi-point, multi-linestring or multi-polygon).
QgsGeometry taperedBuffer(double startWidth, double endWidth, int segments) const
Calculates a tapered width buffer for a (multi)curve geometry.
static Q_DECL_DEPRECATED QgsPolygonXY createPolygonFromQPolygonF(const QPolygonF &polygon)
Creates a QgsPolygonXYfrom a QPolygonF.
static QgsGeometry fromMultiPolygonXY(const QgsMultiPolygonXY &multipoly)
Creates a new geometry from a QgsMultiPolygon.
static void validateGeometry(const QgsGeometry &geometry, QVector< QgsGeometry::Error > &errors, QgsGeometry::ValidationMethod method=QgsGeometry::ValidatorQgisInternal)
Validate geometry and produce a list of geometry errors.
QgsGeometry orientedMinimumBoundingBox() const
Returns the oriented minimum bounding box for the geometry, which is the smallest (by area) rotated r...
bool contains(const QgsRectangle &rect) const
Returns true when rectangle contains other rectangle.
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.
QgsGeometryConstPartIterator constParts() const
Returns Java-style iterator for traversal of parts of the geometry.
QgsPointSequence QgsPolyline
Polyline as represented as a vector of points.
A rectangle specified with double values.
Java-style iterator for traversal of parts of a geometry.
QgsGeometry combine(const QgsGeometry &geometry) const
Returns a geometry representing all the points in this geometry and other (a union geometry operation...
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.
double hausdorffDistanceDensify(const QgsGeometry &geom, double densifyFraction) const
Returns the Hausdorff distance between this geometry and geom.
static Type multiType(Type type)
Returns the multi type for a WKB type.
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.
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.
QgsGeometry removeInteriorRings(double minimumAllowedArea=-1) const
Removes the interior rings from a (multi)polygon geometry.
bool isMultipart() const
Returns true if WKB of the geometry is of WKBMulti* type.
QgsGeometry variableWidthBufferByM(int segments) const
Calculates a variable width buffer using the m-values from a (multi)line geometry.
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...
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() )...
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...
double distance(const QgsGeometry &geom) const
Returns the minimum distance between this geometry and another geometry.
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.
bool isValid() const
Returns true if the vertex id is valid.
bool within(const QgsGeometry &geometry) const
Returns true if the geometry is completely within another geometry.
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...
Use GEOS validation methods.
double angleAtVertex(int vertex) const
Returns the bisector angle for this geometry at the specified vertex.
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...
QVector< QgsRingSequence > QgsCoordinateSequence
Java-style iterator for const traversal of parts of a geometry.
QgsGeometry poleOfInaccessibility(double precision, double *distanceFromBoundary=nullptr) const
Calculates the approximate pole of inaccessibility for a surface, which is the most distant internal ...
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.
QgsWkbTypes::Type wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
QgsGeometry subdivide(int maxNodes=256) const
Subdivides the geometry.
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.
QgsAbstractGeometry::const_part_iterator const_parts_end() const
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry...
QgsGeometry orthogonalize(double tolerance=1.0E-8, int maxIterations=1000, double angleThreshold=15.0) const
Attempts to orthogonalize a line or polygon geometry by shifting vertices to make the geometries angl...
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
QString asJson(int precision=17) const
Exports the geometry to a GeoJSON string.
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.
const QgsCurve * interiorRing(int i) const
Retrieves an interior ring from the curve polygon.
QgsAbstractGeometry::const_part_iterator const_parts_begin() const
Returns STL-style const iterator pointing to the first part of the geometry.
QgsGeometryPartIterator parts()
Returns Java-style iterator for traversal of parts of the geometry.
QVector< QgsPolylineXY > QgsPolygonXY
Polygon: first item of the list is outer ring, inner rings (if any) start from second item...
#define Q_NOWARN_DEPRECATED_PUSH
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.
QgsGeometry interpolate(double distance) const
Returns an interpolated point on the geometry at the specified distance.
Curve polygon geometry type.
bool overlaps(const QgsGeometry &geometry) const
Returns true if the geometry overlaps another geometry.
A geometry is the spatial representation of a feature.
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 centroid() const
Returns the center of mass of a geometry.
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.
SegmentationToleranceType
Segmentation tolerance as maximum angle or maximum difference between approximation and circle...
double radius() const
Returns the radius of the circle.
QgsGeometry intersection(const QgsGeometry &geometry) const
Returns a geometry representing the points shared by this geometry and other.
QgsPoint center() const
Returns the center point.
static QgsPoint closestVertex(const QgsAbstractGeometry &geom, const QgsPoint &pt, QgsVertexId &id)
Returns the closest vertex to a geometry for a specified point.
double distanceToVertex(int vertex) const
Returns the distance along this geometry from its first vertex to the specified vertex.
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 minimalEnclosingCircle(QgsPointXY ¢er, double &radius, unsigned int segments=36) const
Returns the minimal enclosing circle for the geometry.
QgsGeometry nearestPoint(const QgsGeometry &other) const
Returns the nearest point on this geometry to another geometry.
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.
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)
bool isGeosEqual(const QgsGeometry &) const
Compares the geometry with another geometry using GEOS.
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 numPoints() const override
Returns the number of points in the curve.
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 ...
QgsGeometry poleOfInaccessibility(double precision, double *distanceToBoundary=nullptr) const
Calculates the approximate pole of inaccessibility for a surface, which is the most distant internal ...
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.
bool intersects(const QgsRectangle &rectangle) const
Returns true if this geometry exactly intersects with a rectangle.
QVector< QgsPolylineXY > QgsMultiPolylineXY
A collection of QgsPolylines that share a common collection of attributes.
QgsMultiPolylineXY asMultiPolyline() const
Returns the contents of the geometry as a multi-linestring.
Base class for feedback objects to be used for cancellation of something running in a worker thread...
QVector< QgsGeometry > asGeometryCollection() const
Returns contents of the geometry as a list of geometries.
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 hasWhere() const
true if the location available from
QgsGeometry mergeLines() const
Merges any connected lines in a LineString/MultiLineString geometry and converts them to single line ...
Perform transforms between map coordinates and device coordinates.
const double * xData() const
Returns a const pointer to the x vertex data.
QgsPointXY transform(const QgsPointXY &p) const
Transform the point from map (world) coordinates to device coordinates.
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
int numInteriorRings() const
Returns the number of interior rings contained with the curve polygon.
virtual double length() const
Returns the planar, 2-dimensional length of the geometry.
Nothing happened, without any error.
Type
The WKB type describes the number of dimensions a geometry has.
QPointF toQPointF() const
Converts a point to a QPointF.
static Q_DECL_DEPRECATED QgsPolylineXY createPolylineFromQPolygonF(const QPolygonF &polygon)
Creates a QgsPolylineXY from a QPolygonF.
bool isGeosValid(QgsGeometry::ValidityFlags flags=nullptr) const
Checks validity of the geometry using GEOS.
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.
bool equals(const QgsGeometry &geometry) const
Test if this geometry is exactly equal to another geometry.
QgsGeometry variableWidthBufferByM(int segments) const
Calculates a variable width buffer for a (multi)linestring geometry, where the width at each node is ...
Utility class for identifying a unique vertex within a geometry.
bool isEmpty() const
Returns true if the rectangle is empty.
QgsGeometry taperedBuffer(double startWidth, double endWidth, int segments) const
Calculates a variable width buffer ("tapered buffer") for a (multi)curve geometry.
QgsPolygonXY asPolygon() const
Returns the contents of the geometry as a polygon.
static QgsGeometry fromQPointF(QPointF point)
Construct geometry from a QPointF.
virtual QgsPolygon * toPolygon(unsigned int segments=36) const
Returns a segmented polygon.
QgsGeometry convexHull() const
Returns the smallest convex polygon that contains all the points in the geometry. ...
The part_iterator class provides STL-style iterator for geometry parts.
double width() const
Returns the width of the rectangle.
QgsGeometry densifyByCount(int extraNodesPerSegment) const
Returns a copy of the geometry which has been densified by adding the specified number of extra nodes...
bool deleteVertex(int atVertex)
Deletes the vertex at the given position number and item (first number is index 0) ...
QString what() const
A human readable error message containing details about the error.
void setY(double y)
Sets the y value of the point.
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...
Use internal QgsGeometryValidator method.
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...
static QgsGeometry fromMultiPointXY(const QgsMultiPointXY &multipoint)
Creates a new geometry from a QgsMultiPointXY object.
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...
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...
T qgsgeometry_cast(const QgsAbstractGeometry *geom)
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 QVector< QgsPointXY > randomPointsInPolygon(const QgsGeometry &polygon, int count, const std::function< bool(const QgsPointXY &) > &acceptPoint, unsigned long seed=0, QgsFeedback *feedback=nullptr)
Returns a list of count random points generated inside a polygon geometry.
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 isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
bool contains(const QgsPoint &point, double epsilon=1E-8) const
Returns true if the circle contains the point.
bool crosses(const QgsGeometry &geometry) const
Returns true if the geometry crosses another geometry.
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...
static QgsGeometry polygonize(const QVector< const QgsAbstractGeometry *> &geometries, QString *errorMsg=nullptr)
Creates a GeometryCollection geometry containing possible polygons formed from the constituent linewo...
QgsGeometry densifyByDistance(double distance) const
Densifies the geometry by adding regularly placed extra nodes inside each segment so that the maximum...
static QgsLineString * fromQPolygonF(const QPolygonF &polygon)
Returns a new linestring from a QPolygonF polygon input.
Method not implemented in geometry engine.
virtual double area() const
Returns the planar, 2-dimensional area of the geometry.
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.
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...
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).
QgsGeometry pointOnSurface() const
Returns a point guaranteed to lie on the surface of a geometry.
bool touches(const QgsGeometry &geometry) const
Returns true if the geometry touches another geometry.
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*...
QgsWkbTypes::Type wkbType() const
Returns the WKB type of the geometry.
static std::unique_ptr< QgsMultiLineString > fromMultiPolylineXY(const QgsMultiPolylineXY &multiline)
Construct geometry from a multipolyline.
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...
Point geometry type, with support for z-dimension and m-values.
QgsPointXY where() const
The coordinates at which the error is located and should be visualized.
QgsGeometry densifyByDistance(double distance) const
Densifies the geometry by adding regularly placed extra nodes inside each segment so that the maximum...
QgsWkbTypes::GeometryType type() const
Returns type of the geometry as a QgsWkbTypes::GeometryType.
const double * yData() const
Returns a const pointer to the y vertex data.
double length() const
Returns the planar, 2-dimensional length of geometry.
This class offers geometry processing methods.
void setX(double x)
Sets the x value of the point.
QByteArray asWkb() const
Export the geometry to WKB.
Error occurred while creating a noded geometry.
QgsLineString * clone() const override
Clones the geometry by performing a deep copy.
QgsGeometry extrude(double x, double y)
Returns an extruded version of this geometry.
Error occurred in the geometry engine.
void draw(QPainter &p) const
Draws the geometry onto a QPainter.
int numGeometries() const
Returns the number of geometries within the collection.
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.
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.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
QgsAbstractGeometry * combine(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const override
Calculate the combination of this and geom.
QString asWkt(int precision=17) const
Exports the geometry to WKT.
QPolygonF asQPolygonF() const
Returns contents of the geometry as a QPolygonF.
double interpolateAngle(double distance) const
Returns the angle parallel to the linestring or polygon boundary at the specified distance along the ...
static QgsGeometry fromPolygonXY(const QgsPolygonXY &polygon)
Creates a new geometry from a QgsPolygon.
double xMaximum() const
Returns the x maximum value (right side of rectangle).
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.
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.
#define Q_NOWARN_DEPRECATED_POP
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.
int partCount() const override
Returns count of parts contained in the geometry.
QVector< QgsPointSequence > QgsRingSequence
void reserve(int size)
Attempts to allocate memory for at least size geometries.
QString lastError() const
Returns an error string referring to the last error encountered either when this geometry was created...
QgsGeometry simplify(double tolerance) const
Returns a simplified version of this geometry using a specified tolerance value.
QVector< QgsPointXY > QgsPolylineXY
Polyline as represented as a vector of two-dimensional points.
static double sqrDistance2D(const QgsPoint &pt1, const QgsPoint &pt2)
Returns the squared 2D distance between two points.
QgsPoint vertexAt(int atVertex) const
Returns coordinates of a vertex.
static std::unique_ptr< QgsAbstractGeometry > geomFromWkt(const QString &text)
Construct geometry from a WKT string.
bool convertToMultiType()
Converts single type geometry into multitype geometry e.g.
double hausdorffDistance(const QgsGeometry &geom) const
Returns the Hausdorff distance between this geometry and geom.
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
The base geometry on which the operation is done is invalid or empty.
Multi polygon geometry collection.
virtual json asJsonObject(int precision=17) const
Exports the geometry to a json object.
int vertexNrFromVertexId(QgsVertexId id) const
Returns the vertex number corresponding to a vertex id.
The input geometry (ring, part, split line, etc.) has not the correct geometry type.
Q_DECL_DEPRECATED 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...
bool requiresConversionToStraightSegments() const
Returns true if the geometry is a curved geometry type which requires conversion to display as straig...
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 makeValid() const
Attempts to make an invalid geometry valid without losing vertices.
bool isSimple() const
Determines whether the geometry is simple (according to OGC definition), i.e.
std::unique_ptr< QgsAbstractGeometry > subdivide(int maxNodes, QString *errorMsg=nullptr) const
Subdivides the geometry.
Line string geometry type, with support for z-dimension and m-values.
QPointF asQPointF() const
Returns contents of the geometry as a QPointF if wkbType is WKBPoint, otherwise returns a null QPoint...
static QgsGeometry createWedgeBuffer(const QgsPoint ¢er, double azimuth, double angularWidth, double outerRadius, double innerRadius=0)
Creates a wedge shaped buffer from a center point.
ValidationMethod
Available methods for validating geometries.
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...
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
QgsGeometry shortestLine(const QgsGeometry &other) const
Returns the shortest line joining this geometry to another geometry.
std::unique_ptr< QgsAbstractGeometry > _qgis_lwgeom_make_valid(const QgsAbstractGeometry *lwgeom_in, QString &errorMessage)
Implementation of QgsGeometry::makeValid(). Not a public API.
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
static QgsCircle minimalCircleFrom3Points(const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3, double epsilon=1E-8)
Constructs the smallest circle from 3 points.
bool isNull() const
Test if the rectangle is null (all coordinates zero or after call to setMinimal()).
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
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 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.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
OperationResult translate(double dx, double dy, double dz=0.0, double dm=0.0)
Translates this geometry by dx, dy, dz and dm.
void adjacentVertices(int atVertex, int &beforeVertex, int &afterVertex) const
Returns the indexes of the vertices before and after the given vertex index.
QgsGeometry convertToType(QgsWkbTypes::GeometryType destType, bool destMultipart=false) const
Try to convert the geometry to the requested type.
QgsGeometry forceRHR() const
Forces geometries to respect the Right-Hand-Rule, in which the area that is bounded by a polygon is t...
double closestVertexWithContext(const QgsPointXY &point, int &atVertex) const
Searches for the closest vertex in this geometry to the given point.
Contains geometry relation and modification algorithms.
double yMaximum() const
Returns the y maximum value (top side of rectangle).
QgsGeometry makeDifference(const QgsGeometry &other) const
Returns the geometry formed by modifying this geometry such that it does not intersect the other geom...
QgsPolylineXY asPolyline() const
Returns the contents of the geometry as a polyline.
Circular string geometry type.
QgsVertexIterator vertices() const
Returns a read-only, Java-style iterator for traversal of vertices of all the geometry, including all geometry parts and rings.
static QgsCircle from2Points(const QgsPoint &pt1, const QgsPoint &pt2)
Constructs a circle by 2 points on the circle.
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.
static bool deletePart(QgsAbstractGeometry *geom, int partNum)
Deletes a part from a geometry.
QgsWkbTypes::GeometryType type
QgsMultiPointXY asMultiPoint() const
Returns the contents of the geometry as a multi-point.
virtual bool dropMValue()=0
Drops any measure values which exist in the geometry.
QgsGeometry orthogonalize(double tolerance=1.0E-8, int maxIterations=1000, double angleThreshold=15.0) const
Attempts to orthogonalize a line or polygon geometry by shifting vertices to make the geometries angl...
double area() const
Returns the planar, 2-dimensional area of the geometry.
EngineOperationResult
Success or failure of a geometry operation.
bool vertexIdFromVertexNr(int number, QgsVertexId &id) const
Calculates the vertex ID from a vertex number.
JoinStyle
Join styles for buffers.
const QgsCurve * exteriorRing() const
Returns the curve polygon's exterior ring.
QVector< QgsPointXY > randomPointsInPolygon(int count, const std::function< bool(const QgsPointXY &) > &acceptPoint, unsigned long seed=0, QgsFeedback *feedback=nullptr) const
Returns a list of count random points generated inside a (multi)polygon geometry. ...
void set(QgsAbstractGeometry *geometry)
Sets the underlying geometry store.
QgsGeometry densifyByCount(int extraNodesPerSegment) const
Densifies the geometry by adding the specified number of extra nodes within each segment of the geome...
bool contains(const QgsPointXY *p) const
Returns true if the geometry contains the point p.
QgsGeometry symDifference(const QgsGeometry &geometry) const
Returns a geometry representing the points making up this geometry that do not make up other...
virtual QgsPoint vertexAt(QgsVertexId id) const =0
Returns the point corresponding to a specified vertex id.
Represents a vector layer which manages a vector based data sets.
QgsAbstractGeometry::vertex_iterator vertices_end() const
Returns STL-style iterator pointing to the imaginary vertex after the last vertex of the geometry...
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.
QgsGeometry delaunayTriangulation(double tolerance=0.0, bool edgesOnly=false) const
Returns the Delaunay triangulation for the vertices of the geometry.
static QgsGeometry unaryUnion(const QVector< QgsGeometry > &geometries)
Compute the unary union on a list of geometries.
QgsMultiPolygonXY asMultiPolygon() const
Returns the contents of the geometry as a multi-polygon.
static QgsGeometry collectGeometry(const QVector< QgsGeometry > &geometries)
Creates a new multipart geometry from a list of QgsGeometry objects.
The geometry on which the operation occurs is not valid.
virtual int numPoints() const =0
Returns the number of points in the curve.
static double distanceToVertex(const QgsAbstractGeometry &geom, QgsVertexId id)
Returns the distance along a geometry from its first vertex to the specified vertex.
QgsAbstractGeometry::vertex_iterator vertices_begin() const
Returns STL-style iterator pointing to the first vertex of the geometry.
QgsAbstractGeometry::part_iterator parts_end()
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry...
double lineLocatePoint(const QgsGeometry &point) const
Returns a distance representing the location along this linestring of the closest point on this lines...
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'. Negative values mean left ...
bool disjoint(const QgsGeometry &geometry) const
Returns true if the geometry is disjoint of another geometry.
virtual bool dropZValue()=0
Drops any z-dimensions which exist in the geometry.
static QgsGeometry fromPointXY(const QgsPointXY &point)
Creates a new geometry from a QgsPointXY object.
void validateGeometry(QVector< QgsGeometry::Error > &errors, ValidationMethod method=ValidatorQgisInternal, QgsGeometry::ValidityFlags flags=nullptr) const
Validates geometry and produces a list of geometry errors.
static QgsGeometry::OperationResult addRing(QgsAbstractGeometry *geometry, std::unique_ptr< QgsCurve > ring)
Add an interior ring to a 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...
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.
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.
int avoidIntersections(const QList< QgsVectorLayer *> &avoidIntersectionsLayers, const QHash< QgsVectorLayer *, QSet< QgsFeatureId > > &ignoreFeatures=(QHash< QgsVectorLayer *, QSet< QgsFeatureId > >()))
Modifies geometry to avoid intersections with the layers specified in project properties.
QgsGeometry difference(const QgsGeometry &geometry) const
Returns a geometry representing the points making up this geometry that do not make up other...