QGIS API Documentation
3.16.0-Hannover (43b64b13f3)
|
Go to the documentation of this file.
20 #include <nlohmann/json.hpp>
55 std::unique_ptr< QgsAbstractGeometry >
geometry;
65 if ( !d->
ref.deref() )
73 d->
ref = QAtomicInt( 1 );
80 d->
ref = QAtomicInt( 1 );
86 mLastError = other.mLastError;
94 if ( !d->
ref.deref() )
99 mLastError = other.mLastError;
106 void QgsGeometry::detach()
111 std::unique_ptr< QgsAbstractGeometry > cGeom;
113 cGeom.reset( d->
geometry->clone() );
115 reset( std::move( cGeom ) );
118 void QgsGeometry::reset( std::unique_ptr<QgsAbstractGeometry> newGeometry )
122 ( void )d->
ref.deref();
125 d->
geometry = std::move( newGeometry );
141 if ( d->
geometry.get() == geometry )
146 reset( std::unique_ptr< QgsAbstractGeometry >( geometry ) );
186 return QgsGeometry( qgis::make_unique< QgsLineString >( polyline ) );
231 std::unique_ptr< QgsLineString > ext = qgis::make_unique< QgsLineString >(
232 QVector< double >() << rect.
xMinimum()
237 QVector< double >() << rect.
yMinimum()
242 std::unique_ptr< QgsPolygon > polygon = qgis::make_unique< QgsPolygon >();
243 polygon->setExteriorRing( ext.release() );
260 if ( g.isMultipart() )
262 for (
auto p = g.const_parts_begin(); p != g.const_parts_end(); ++p )
264 collected.
addPart( ( *p )->clone() );
278 if ( std::abs( angularWidth ) >= 360.0 )
280 std::unique_ptr< QgsCompoundCurve > outerCc = qgis::make_unique< QgsCompoundCurve >();
285 std::unique_ptr< QgsCurvePolygon > cp = qgis::make_unique< QgsCurvePolygon >();
286 cp->setExteriorRing( outerCc.release() );
290 std::unique_ptr< QgsCompoundCurve > innerCc = qgis::make_unique< QgsCompoundCurve >();
295 cp->setInteriorRings( { innerCc.release() } );
301 std::unique_ptr< QgsCompoundCurve > wedge = qgis::make_unique< QgsCompoundCurve >();
303 const double startAngle = azimuth - angularWidth * 0.5;
304 const double endAngle = azimuth + angularWidth * 0.5;
309 const bool useShortestArc = angularWidth <= 180.0;
327 std::unique_ptr< QgsCurvePolygon > cp = qgis::make_unique< QgsCurvePolygon >();
328 cp->setExteriorRing( wedge.release() );
407 d->
geometry->adjacentVertices(
id, prevVertex, nextVertex );
443 return d->
geometry->vertexAngle( v2 );
462 d->
geometry->adjacentVertices(
id, beforeVertexId, afterVertexId );
500 return d->
geometry->moveVertex(
id, p );
533 return d->
geometry->deleteVertex(
id );
585 return d->
geometry->insertVertex(
id, point );
601 return d->
geometry->vertexAt( vId );
621 result.mLastError = mLastError;
630 return QgsGeometry( qgis::make_unique< QgsLineString >( *qgsgeometry_cast< const QgsPoint * >( d->
geometry.get() ), *qgsgeometry_cast< const QgsPoint * >( other.
constGet() ) ) );
636 result.mLastError = mLastError;
660 double epsilon )
const
670 double sqrDist = d->
geometry->closestSegment(
QgsPoint( point ), segmentPt, vertexAfter,
leftOf, epsilon );
674 minDistPoint.
setX( segmentPt.
x() );
675 minDistPoint.
setY( segmentPt.
y() );
682 std::unique_ptr< QgsLineString > ringLine = qgis::make_unique< QgsLineString >( ring );
683 return addRing( ringLine.release() );
688 std::unique_ptr< QgsCurve > r( ring );
708 std::unique_ptr< QgsAbstractGeometry > partGeom;
709 if ( points.size() == 1 )
711 partGeom = qgis::make_unique< QgsPoint >( points[0] );
713 else if ( points.size() > 1 )
715 std::unique_ptr< QgsLineString > ringLine = qgis::make_unique< QgsLineString >();
716 ringLine->setPoints( points );
717 partGeom = std::move( ringLine );
719 return addPart( partGeom.release(), geomType );
724 std::unique_ptr< QgsAbstractGeometry > p( part );
730 reset( qgis::make_unique< QgsMultiPoint >() );
733 reset( qgis::make_unique< QgsMultiLineString >() );
736 reset( qgis::make_unique< QgsMultiPolygon >() );
740 return QgsGeometry::OperationResult::AddPartNotMultiGeometry;
776 QVector<QgsGeometry> results;
777 results.reserve(
parts.count() );
784 if ( results.isEmpty() )
788 for (
const QgsGeometry &result : qgis::as_const( results ) )
797 newPoly->removeInteriorRings( minimumRingArea );
811 d->
geometry->transform( QTransform::fromTranslate( dx, dy ), dz, 1.0, dm );
824 QTransform t = QTransform::fromTranslate( center.
x(), center.
y() );
825 t.rotate( -rotation );
826 t.translate( -center.
x(), -center.
y() );
844 return QgsGeometry::OperationResult::InvalidBaseGeometry;
847 QVector<QgsGeometry > newGeoms;
868 *
this = newGeoms.takeAt( 0 );
869 newGeometries = newGeoms;
875 return QgsGeometry::OperationResult::Success;
879 return QgsGeometry::OperationResult::GeometryEngineError;
881 return QgsGeometry::OperationResult::InvalidBaseGeometry;
883 return QgsGeometry::OperationResult::InvalidInputGeometryType;
885 return QgsGeometry::OperationResult::SplitCannotSplitPoint;
887 return QgsGeometry::OperationResult::NothingHappened;
898 std::unique_ptr<QgsLineString> segmentizedLine( curve->
curveToLine() );
900 segmentizedLine->points( points );
905 if ( preserveCircular )
907 for (
int i = 0; i < newGeometries.count(); ++i )
926 std::unique_ptr< QgsAbstractGeometry > geom(
geos.reshapeGeometry( reshapeLineString, &errorCode, &mLastError ) );
929 reset( std::move( geom ) );
965 std::unique_ptr< QgsAbstractGeometry > diffGeom(
geos.intersection( other.
constGet(), &mLastError ) );
971 reset( std::move( diffGeom ) );
985 std::unique_ptr< QgsAbstractGeometry > diffGeom(
geos.intersection( other.
constGet(), &mLastError ) );
989 result.mLastError = mLastError;
1023 auto l_boundary = boundary.length();
1025 if ( ( points.length() == 0 ) || ( l_boundary == 3 ) )
1027 switch ( l_boundary )
1034 boundary.pop_back();
1039 boundary.pop_back();
1041 boundary.pop_back();
1058 circ_mec = __recMinimalEnclosingCircle( points, boundary );
1062 boundary.append( pxy );
1063 circ_mec = __recMinimalEnclosingCircle( points, boundary );
1087 QgsCircle circ = __recMinimalEnclosingCircle( P, R );
1108 return engine.
orthogonalize( tolerance, maxIterations, angleThreshold );
1117 return QgsGeometry( d->
geometry->snappedToGrid( hSpacing, vSpacing, dSpacing, mSpacing ) );
1126 return d->
geometry->removeDuplicateNodes( epsilon, useZValues );
1154 return geos.intersects( geometry.d->
geometry.get(), &mLastError );
1167 const QgsPoint *point = qgsgeometry_cast< const QgsPoint * >( d->
geometry.get() );
1171 return d->
geometry->boundingBox().intersects( rectangle );
1194 return geos.contains( &pt, &mLastError );
1206 return geos.contains( geometry.d->
geometry.get(), &mLastError );
1218 return geos.disjoint( geometry.d->
geometry.get(), &mLastError );
1229 if ( d == geometry.d )
1249 return geos.touches( geometry.d->
geometry.get(), &mLastError );
1261 return geos.overlaps( geometry.d->
geometry.get(), &mLastError );
1273 return geos.within( geometry.d->
geometry.get(), &mLastError );
1285 return geos.crosses( geometry.d->
geometry.get(), &mLastError );
1314 QVector< QgsGeometry > res;
1352 std::unique_ptr< QgsAbstractGeometry > exterior( ( *part )->clone() );
1353 if (
QgsCurve *curve = qgsgeometry_cast< QgsCurve * >( exterior.get() ) )
1357 std::unique_ptr< QgsCurvePolygon > cp = qgis::make_unique< QgsCurvePolygon >();
1358 cp->setExteriorRing( curve );
1360 gc->addGeometry( cp.release() );
1364 std::unique_ptr< QgsPolygon > p = qgis::make_unique< QgsPolygon >();
1365 p->setExteriorRing( qgsgeometry_cast< QgsLineString * >( curve ) );
1367 gc->addGeometry( p.release() );
1380 std::unique_ptr< QgsMultiPoint > mp = qgis::make_unique< QgsMultiPoint >();
1382 QSet< QgsPoint > added;
1385 if ( added.contains( *vertex ) )
1387 mp->addGeometry( ( *vertex ).clone() );
1388 added.insert( *vertex );
1422 res.reserve(
parts->partCount() );
1423 for (
int i = 0; i <
parts->partCount( ); i++ )
1440 return convertToPoint( destMultipart );
1443 return convertToLine( destMultipart );
1446 return convertToPolygon( destMultipart );
1498 if ( !multiGeom || multiGeom->
partCount() < 1 )
1501 std::unique_ptr< QgsAbstractGeometry > firstPart( multiGeom->
geometryN( 0 )->
clone() );
1502 reset( std::move( firstPart ) );
1513 std::unique_ptr<QgsGeometryCollection> resGeom;
1517 resGeom = qgis::make_unique<QgsMultiPoint>();
1520 resGeom = qgis::make_unique<QgsMultiLineString>();
1523 resGeom = qgis::make_unique<QgsMultiPolygon>();
1536 resGeom->addGeometry( g->
clone() );
1539 set( resGeom.release() );
1569 std::unique_ptr< QgsLineString > segmentizedLine;
1571 if ( doSegmentation )
1579 line = segmentizedLine.get();
1583 line = qgsgeometry_cast<QgsLineString *>( d->
geometry.get() );
1591 polyLine.resize( nVertices );
1593 const double *xData = line->
xData();
1594 const double *yData = line->
yData();
1595 for (
int i = 0; i < nVertices; ++i )
1597 data->
setX( *xData++ );
1598 data->
setY( *yData++ );
1613 std::unique_ptr< QgsPolygon > segmentized;
1614 if ( doSegmentation )
1621 segmentized.reset( curvePoly->
toPolygon() );
1622 p = segmentized.get();
1626 p = qgsgeometry_cast<QgsPolygon *>( d->
geometry.get() );
1635 convertPolygon( *p, polygon );
1655 for (
int i = 0; i < nPoints; ++i )
1658 multiPoint[i].
setX( pt->
x() );
1659 multiPoint[i].setY( pt->
y() );
1672 if ( !geomCollection )
1684 mpl.reserve( nLines );
1685 for (
int i = 0; i < nLines; ++i )
1688 std::unique_ptr< QgsLineString > segmentized;
1691 const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( geomCollection->
geometryN( i ) );
1697 line = segmentized.get();
1702 polyLine.resize( nVertices );
1704 const double *xData = line->
xData();
1705 const double *yData = line->
yData();
1706 for (
int i = 0; i < nVertices; ++i )
1708 data->
setX( *xData++ );
1709 data->
setY( *yData++ );
1712 mpl.append( polyLine );
1725 if ( !geomCollection )
1731 if ( nPolygons < 1 )
1737 for (
int i = 0; i < nPolygons; ++i )
1739 const QgsPolygon *polygon = qgsgeometry_cast<const QgsPolygon *>( geomCollection->
geometryN( i ) );
1754 convertPolygon( *polygon, poly );
1770 double geosArea = g.
area();
1771 double qgisArea = 0;
1775 qgisArea = surface->
area();
1780 return g.
area( &mLastError );
1791 return g.
length( &mLastError );
1804 return qgsgeometry_cast< const QgsPoint * >( d->
geometry.get() )->distance( *qgsgeometry_cast< const QgsPoint * >( geom.
constGet() ) );
1840 return d->
geometry->vertices_begin();
1847 return d->
geometry->vertices_end();
1877 return d->
geometry->const_parts_begin();
1884 return d->
geometry->const_parts_end();
1913 std::unique_ptr<QgsAbstractGeometry> geom( g.
buffer(
distance, segments, &mLastError ) );
1917 result.mLastError = mLastError;
1936 result.mLastError = mLastError;
1952 QVector<QgsGeometry> results;
1953 results.reserve(
parts.count() );
1960 if ( results.isEmpty() )
1964 for (
const QgsGeometry &result : qgis::as_const( results ) )
1978 std::unique_ptr< QgsAbstractGeometry > offsetGeom(
geos.offsetCurve(
distance, segments, joinStyle, miterLimit, &mLastError ) );
1982 result.mLastError = mLastError;
1986 if (
const QgsCurve *
offsetCurve = qgsgeometry_cast< const QgsCurve * >( offsetGeom.get() ) )
1989 if ( newOrientation != prevOrientation )
1992 std::unique_ptr< QgsAbstractGeometry > flipped(
offsetCurve->reversed() );
1993 offsetGeom = std::move( flipped );
2010 QVector<QgsGeometry> results;
2011 results.reserve(
parts.count() );
2018 if ( results.isEmpty() )
2022 for (
const QgsGeometry &result : qgis::as_const( results ) )
2032 std::unique_ptr< QgsAbstractGeometry > bufferGeom =
geos.singleSidedBuffer(
distance, segments, side,
2033 joinStyle, miterLimit, &mLastError );
2037 result.mLastError = mLastError;
2048 return engine.
taperedBuffer( startWidth, endWidth, segments );
2068 QVector<QgsGeometry> results;
2069 results.reserve(
parts.count() );
2076 if ( results.isEmpty() )
2080 for (
const QgsGeometry &result : qgis::as_const( results ) )
2092 std::unique_ptr< QgsLineString > newLine( line->
clone() );
2093 newLine->extend( startDistance, endDistance );
2107 std::unique_ptr< QgsAbstractGeometry > simplifiedGeom(
geos.simplify( tolerance, &mLastError ) );
2108 if ( !simplifiedGeom )
2111 result.mLastError = mLastError;
2114 return QgsGeometry( std::move( simplifiedGeom ) );
2149 c.get()->dropZValue();
2150 c.get()->dropMValue();
2158 result.mLastError = mLastError;
2173 result.mLastError = mLastError;
2192 std::unique_ptr< QgsAbstractGeometry > cHull(
geos.convexHull( &mLastError ) );
2196 geom.mLastError = mLastError;
2212 result.mLastError = mLastError;
2225 QgsGeometry result =
geos.delaunayTriangulation( tolerance, edgesOnly );
2226 result.mLastError = mLastError;
2238 std::unique_ptr< QgsAbstractGeometry > segmentizedCopy;
2241 segmentizedCopy.reset( d->
geometry->segmentize() );
2242 geom = segmentizedCopy.get();
2247 std::unique_ptr< QgsAbstractGeometry > result(
geos.subdivide( maxNodes, &mLastError ) );
2251 geom.mLastError = mLastError;
2277 for (
int part = 0; part < collection->
numGeometries(); ++part )
2279 const QgsCurve *candidate = qgsgeometry_cast< const QgsCurve * >( collection->
geometryN( part ) );
2282 const double candidateLength = candidate->
length();
2294 curve = qgsgeometry_cast< const QgsCurve * >( line.
constGet() );
2323 return geos.lineLocatePoint( *(
static_cast< QgsPoint *
>( point.d->
geometry.get() ) ), &mLastError );
2343 if ( previous == next )
2390 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.intersection( geometry.d->
geometry.get(), &mLastError ) );
2395 geom.mLastError = mLastError;
2411 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.combine( geometry.d->
geometry.get(), &mLastError ) );
2415 geom.mLastError = mLastError;
2437 result.mLastError = mLastError;
2451 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.difference( geometry.d->
geometry.get(), &mLastError ) );
2455 geom.mLastError = mLastError;
2471 std::unique_ptr< QgsAbstractGeometry > resultGeom(
geos.symDifference( geometry.d->
geometry.get(), &mLastError ) );
2475 geom.mLastError = mLastError;
2485 return engine.
extrude( x, y );
2493 return QVector< QgsPointXY >();
2501 return QVector< QgsPointXY >();
2519 QVector<QgsGeometry> geometryList;
2522 return geometryList;
2529 geometryList.reserve( numGeom );
2530 for (
int i = 0; i < numGeom; ++i )
2537 geometryList.append( *
this );
2540 return geometryList;
2554 if (
const QgsGeometryCollection *collection = qgsgeometry_cast< const QgsGeometryCollection *>( part ) )
2556 if ( collection->numGeometries() > 0 )
2557 part = collection->geometryN( 0 );
2562 if (
const QgsCurve *curve = qgsgeometry_cast< const QgsCurve * >( part ) )
2563 return curve->asQPolygonF();
2564 else if (
const QgsCurvePolygon *polygon = qgsgeometry_cast< const QgsCurvePolygon * >( part ) )
2565 return polygon->exteriorRing() ? polygon->exteriorRing()->asQPolygonF() : QPolygonF();
2609 reset( std::move( diffGeom ) );
2624 result.mLastError = mLastError;
2641 if (
const QgsCurvePolygon *cp = qgsgeometry_cast< const QgsCurvePolygon * >( g ) )
2643 std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
2644 corrected->forceRHR();
2645 newCollection->addGeometry( corrected.release() );
2649 newCollection->addGeometry( g->
clone() );
2658 std::unique_ptr< QgsCurvePolygon > corrected( cp->clone() );
2659 corrected->forceRHR();
2718 return d->
geometry->isValid( mLastError,
static_cast< int >( flags ) );
2728 return geos.isSimple( &mLastError );
2759 return geos.isEqual( g.d->
geometry.get(), &mLastError );
2767 std::unique_ptr< QgsAbstractGeometry > geom(
geos.combine( geometries, &error ) );
2769 result.mLastError = error;
2777 QVector<const QgsAbstractGeometry *> geomV2List;
2780 if ( !( g.isNull() ) )
2782 geomV2List.append( g.constGet() );
2788 result.mLastError = error;
2799 std::unique_ptr< QgsAbstractGeometry > straightGeom( d->
geometry->segmentize( tolerance, toleranceType ) );
2800 reset( std::move( straightGeom ) );
2810 return d->
geometry->hasCurvedSegments();
2821 d->
geometry->transform( ct, direction, transformZ );
2833 d->
geometry->transform( ct, zTranslate, zScale, mTranslate, mScale );
2855 std::unique_ptr< QgsAbstractGeometry > resultGeom =
geos.clip( rectangle, &mLastError );
2859 result.mLastError = mLastError;
2873 static bool vertexIndexInfo(
const QgsAbstractGeometry *g,
int vertexIndex,
int &partIndex,
int &ringIndex,
int &vertex )
2875 if ( vertexIndex < 0 )
2878 if (
const QgsGeometryCollection *geomCollection = qgsgeometry_cast<const QgsGeometryCollection *>( g ) )
2882 for (
int i = 0; i < geomCollection->numGeometries(); ++i )
2888 for (
int k = 0; k < part->
ringCount(); ++k )
2891 if ( vertexIndex < numPoints )
2894 return vertexIndexInfo( part, vertexIndex, nothing, ringIndex, vertex );
2896 vertexIndex -= numPoints;
2897 offset += numPoints;
2901 else if (
const QgsCurvePolygon *curvePolygon = qgsgeometry_cast<const QgsCurvePolygon *>( g ) )
2903 const QgsCurve *ring = curvePolygon->exteriorRing();
2904 if ( vertexIndex < ring->numPoints() )
2908 vertex = vertexIndex;
2913 for (
int i = 0; i < curvePolygon->numInteriorRings(); ++i )
2915 const QgsCurve *ring = curvePolygon->interiorRing( i );
2916 if ( vertexIndex < ring->numPoints() )
2919 vertex = vertexIndex;
2926 else if (
const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( g ) )
2928 if ( vertexIndex < curve->numPoints() )
2932 vertex = vertexIndex;
2936 else if ( qgsgeometry_cast<const QgsPoint *>( g ) )
2938 if ( vertexIndex == 0 )
2959 bool res = vertexIndexInfo( d->
geometry.get(), nr,
id.part,
id.ring,
id.vertex );
2965 if (
const QgsGeometryCollection *geomCollection = qgsgeometry_cast<const QgsGeometryCollection *>( g ) )
2967 g = geomCollection->geometryN(
id.part );
2970 if (
const QgsCurvePolygon *curvePolygon = qgsgeometry_cast<const QgsCurvePolygon *>( g ) )
2972 g =
id.ring == 0 ? curvePolygon->exteriorRing() : curvePolygon->interiorRing(
id.ring - 1 );
2975 if (
const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( g ) )
2978 res = curve->pointAt(
id.vertex, p,
id.
type );
2992 return d->
geometry->vertexNumberFromVertexId(
id );
3007 d->
geometry->filterVertices( filter );
3041 output.resize( input.size() );
3043 for (
int i = 0; i < input.size(); ++i )
3045 const QgsPoint &pt = input.at( i );
3046 output[i].
setX( pt.
x() );
3047 output[i].setY( pt.
y() );
3055 if ( coords.empty() )
3060 output.resize( rings.size() );
3061 for (
int i = 0; i < rings.size(); ++i )
3063 convertToPolyline( rings[i], output[i] );
3069 return QgsGeometry( qgis::make_unique< QgsPoint >( point.x(), point.y() ) );
3076 if ( polygon.isClosed() )
3078 std::unique_ptr< QgsPolygon > poly = qgis::make_unique< QgsPolygon >();
3079 poly->setExteriorRing( ring.release() );
3100 result.reserve( polygon.count() );
3101 for (
const QPointF &p : polygon )
3110 if ( p1.count() != p2.count() )
3113 for (
int i = 0; i < p1.count(); ++i )
3115 if ( !p1.at( i ).compare( p2.at( i ), epsilon ) )
3123 if ( p1.count() != p2.count() )
3126 for (
int i = 0; i < p1.count(); ++i )
3137 if ( p1.count() != p2.count() )
3140 for (
int i = 0; i < p1.count(); ++i )
3167 return QgsGeometry( smoothLine( *lineString, iterations, offset, minimumDistance, maxAngle ) );
3174 std::unique_ptr< QgsMultiLineString > resultMultiline = qgis::make_unique< QgsMultiLineString> ();
3178 resultMultiline->addGeometry( smoothLine( *( multiLine->
lineStringN( i ) ), iterations, offset, minimumDistance, maxAngle ).release() );
3180 return QgsGeometry( std::move( resultMultiline ) );
3186 return QgsGeometry( smoothPolygon( *poly, iterations, offset, minimumDistance, maxAngle ) );
3193 std::unique_ptr< QgsMultiPolygon > resultMultiPoly = qgis::make_unique< QgsMultiPolygon >();
3197 resultMultiPoly->addGeometry( smoothPolygon( *( multiPoly->
polygonN( i ) ), iterations, offset, minimumDistance, maxAngle ).release() );
3199 return QgsGeometry( std::move( resultMultiPoly ) );
3209 const double offset,
double squareDistThreshold,
double maxAngleRads,
3212 std::unique_ptr< QgsLineString > result = qgis::make_unique< QgsLineString >( line );
3214 for (
unsigned int iteration = 0; iteration < iterations; ++iteration )
3216 outputLine.resize( 0 );
3217 outputLine.reserve( 2 * ( result->numPoints() - 1 ) );
3218 bool skipFirst =
false;
3219 bool skipLast =
false;
3222 QgsPoint p1 = result->pointN( result->numPoints() - 2 );
3228 skipFirst =
angle > maxAngleRads;
3230 for (
int i = 0; i < result->numPoints() - 1; i++ )
3233 QgsPoint p2 = result->pointN( i + 1 );
3235 double angle = M_PI;
3236 if ( i == 0 && isRing )
3238 QgsPoint p3 = result->pointN( result->numPoints() - 2 );
3242 else if ( i < result->numPoints() - 2 )
3244 QgsPoint p3 = result->pointN( i + 2 );
3248 else if ( i == result->numPoints() - 2 && isRing )
3255 skipLast =
angle < M_PI - maxAngleRads ||
angle > M_PI + maxAngleRads;
3258 if ( i == 0 || i >= result->numPoints() - 2
3283 skipFirst = skipLast;
3286 if ( isRing && outputLine.at( 0 ) != outputLine.at( outputLine.count() - 1 ) )
3287 outputLine << outputLine.at( 0 );
3289 result->setPoints( outputLine );
3294 std::unique_ptr<QgsLineString> QgsGeometry::smoothLine(
const QgsLineString &line,
const unsigned int iterations,
const double offset,
double minimumDistance,
double maxAngle )
const
3296 double maxAngleRads = maxAngle * M_PI / 180.0;
3297 double squareDistThreshold = minimumDistance > 0 ? minimumDistance * minimumDistance : -1;
3298 return smoothCurve( line, iterations, offset, squareDistThreshold, maxAngleRads,
false );
3301 std::unique_ptr<QgsPolygon> QgsGeometry::smoothPolygon(
const QgsPolygon &polygon,
const unsigned int iterations,
const double offset,
double minimumDistance,
double maxAngle )
const
3303 double maxAngleRads = maxAngle * M_PI / 180.0;
3304 double squareDistThreshold = minimumDistance > 0 ? minimumDistance * minimumDistance : -1;
3305 std::unique_ptr< QgsPolygon > resultPoly = qgis::make_unique< QgsPolygon >();
3308 squareDistThreshold, maxAngleRads,
true ).release() );
3313 squareDistThreshold, maxAngleRads,
true ).release() );
3318 QgsGeometry QgsGeometry::convertToPoint(
bool destMultipart )
const
3326 if ( ( destMultipart && srcIsMultipart ) ||
3327 ( !destMultipart && !srcIsMultipart ) )
3332 if ( destMultipart )
3341 if ( multiPoint.count() == 1 )
3352 if ( !destMultipart )
3369 if ( !line.isEmpty() )
3378 if ( !destMultipart )
3409 QgsGeometry QgsGeometry::convertToLine(
bool destMultipart )
const
3419 if ( multiPoint.count() < 2 )
3422 if ( destMultipart )
3432 if ( ( destMultipart && srcIsMultipart ) ||
3433 ( !destMultipart && ! srcIsMultipart ) )
3438 if ( destMultipart )
3442 if ( !line.isEmpty() )
3449 if ( multiLine.count() == 1 )
3466 if ( destMultipart )
3471 else if ( multiLine.count() == 1 )
3482 if ( polygon.count() > 1 )
3486 if ( destMultipart )
3490 multiLine.reserve( polygon.count() );
3497 else if ( polygon.count() == 1 )
3499 if ( destMultipart )
3517 QgsGeometry QgsGeometry::convertToPolygon(
bool destMultipart )
const
3527 if ( multiPoint.count() < 3 )
3530 if ( multiPoint.last() != multiPoint.first() )
3531 multiPoint << multiPoint.first();
3534 if ( destMultipart )
3547 for ( QgsMultiPolylineXY::iterator multiLineIt = multiLine.begin(); multiLineIt != multiLine.end(); ++multiLineIt )
3550 if ( ( *multiLineIt ).count() < 3 )
3552 if ( ( *multiLineIt ).count() == 3 && ( *multiLineIt ).first() == ( *multiLineIt ).last() )
3556 if ( ( *multiLineIt ).first() != ( *multiLineIt ).last() )
3557 *multiLineIt << ( *multiLineIt ).first();
3561 if ( !multiPolygon.isEmpty() )
3563 if ( destMultipart )
3567 else if ( multiPolygon.count() == 1 )
3580 if ( line.count() < 3 )
3582 if ( line.count() == 3 && line.first() == line.last() )
3586 if ( line.first() != line.last() )
3587 line << line.first();
3590 if ( destMultipart )
3606 if ( ( destMultipart && srcIsMultipart ) ||
3607 ( !destMultipart && ! srcIsMultipart ) )
3612 if ( destMultipart )
3616 if ( !polygon.isEmpty() )
3622 if ( multiPolygon.count() == 1 )
3638 return new QgsGeos( geometry );
3643 out << geometry.
asWkb();
3649 QByteArray byteArray;
3651 if ( byteArray.isEmpty() )
3653 geometry.
set(
nullptr );
3657 geometry.
fromWkb( byteArray );
3674 return mHasLocation;
Abstract base class for curved geometry type.
QgsGeometry combine(const QgsGeometry &geometry) const
Returns a geometry representing all the points in this geometry and other (a union geometry operation...
@ Success
Operation succeeded.
@ AddPartNotMultiGeometry
The source geometry is not multi.
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...
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...
bool contains(const QgsPoint &point, double epsilon=1E-8) const
Returns true if the circle contains the point.
QString lastError() const SIP_HOLDGIL
Returns an error string referring to the last error encountered either when this geometry was created...
@ ValidatorGeos
Use GEOS validation methods.
double hausdorffDistanceDensify(const QgsAbstractGeometry *geom, double densifyFraction, QString *errorMsg=nullptr) const
Returns the Hausdorff distance between this geometry and geom.
QVector< QgsRingSequence > QgsCoordinateSequence
double hausdorffDistanceDensify(const QgsGeometry &geom, double densifyFraction) const
Returns the Hausdorff distance between this geometry and geom.
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 makeDifferenceInPlace(const QgsGeometry &other)
Changes this geometry such that it does not intersect the other geometry.
double distance(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const override
Calculates the distance between this and geom.
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.
virtual bool dropMValue()=0
Drops any measure values which exist in the geometry.
QgsGeometry densifyByCount(int extraNodesPerSegment) const
Densifies the geometry by adding the specified number of extra nodes within each segment of the geome...
QByteArray asWkb(QgsAbstractGeometry::WkbFlags flags=QgsAbstractGeometry::WkbFlags()) const
Export the geometry to WKB.
OperationResult addPart(const QVector< QgsPointXY > &points, QgsWkbTypes::GeometryType geomType=QgsWkbTypes::UnknownGeometry)
Adds a new part to a the 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.
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.
@ InvalidInput
The input is not valid.
virtual void adjacentVertices(QgsVertexId vertex, QgsVertexId &previousVertex, QgsVertexId &nextVertex) const =0
Returns the vertices adjacent to a specified vertex within a geometry.
double distance(const QgsGeometry &geom) const
Returns the minimum distance between this geometry and another geometry.
bool convertGeometryCollectionToSubclass(QgsWkbTypes::GeometryType geomType)
Converts geometry collection to a the desired geometry type subclass (multi-point,...
virtual bool dropZValue()=0
Drops any z-dimensions which exist in the geometry.
bool within(const QgsGeometry &geometry) const
Returns true if the geometry is completely within another geometry.
static Q_DECL_DEPRECATED QgsPolygonXY createPolygonFromQPolygonF(const QPolygonF &polygon)
Creates a QgsPolygonXYfrom a QPolygonF.
void validateGeometry(QVector< QgsGeometry::Error > &errors, ValidationMethod method=ValidatorQgisInternal, QgsGeometry::ValidityFlags flags=QgsGeometry::ValidityFlags()) const
Validates geometry and produces a list of geometry errors.
static QgsCircle minimalCircleFrom3Points(const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3, double epsilon=1E-8) SIP_HOLDGIL
Constructs the smallest circle from 3 points.
@ SegmentVertex
The actual start or end point of a segment.
double angleAtVertex(int vertex) const
Returns the bisector angle for this geometry at the specified vertex.
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...
virtual QgsPoint * interpolatePoint(double distance) const =0
Returns an interpolated point on the curve at the specified distance.
QVector< QgsPolylineXY > QgsPolygonXY
Polygon: first item of the list is outer ring, inner rings (if any) start from second item.
virtual bool addZValue(double zValue=0)=0
Adds a z-dimension to the geometry, initialized to a preset value.
QgsGeometry subdivide(int maxNodes=256) const
Subdivides the geometry.
static QgsGeometry fromPolylineXY(const QgsPolylineXY &polyline)
Creates a new LineString geometry from a list of QgsPointXY points.
Point geometry type, with support for z-dimension and m-values.
QgsAbstractGeometry::const_part_iterator const_parts_end() const
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry.
QString asJson(int precision=17) const
Exports the geometry to a GeoJSON string.
static QgsGeometry fromMultiPolylineXY(const QgsMultiPolylineXY &multiline)
Creates a new geometry from a QgsMultiPolylineXY object.
static QgsGeometry fromPolyline(const QgsPolyline &polyline)
Creates a new LineString geometry from a list of QgsPoint points.
QgsGeometry variableWidthBufferByM(int segments) const
Calculates a variable width buffer using the m-values from a (multi)line geometry.
QgsGeometry removeInteriorRings(double minimumAllowedArea=-1) const
Removes the interior rings from a (multi)polygon geometry.
static std::unique_ptr< QgsPolygon > fromPolygonXY(const QgsPolygonXY &polygon)
Construct geometry from a polygon.
QgsGeometryPartIterator parts()
Returns Java-style iterator for traversal of parts of the geometry.
const QgsCurve * exteriorRing() const SIP_HOLDGIL
Returns the curve polygon's exterior ring.
QDataStream & operator<<(QDataStream &out, const QgsGeometry &geometry)
Writes the geometry to stream out. QGIS version compatibility is not guaranteed.
@ NothingHappened
Nothing happened, without any error.
virtual bool addMValue(double mValue=0)=0
Adds a measure to the geometry, initialized to a preset value.
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 Type flatType(Type type) SIP_HOLDGIL
Returns the flat type for a WKB type.
static std::unique_ptr< QgsAbstractGeometry > geomFromWkb(QgsConstWkbPtr &wkb)
Construct geometry from a WKB string.
Curve polygon geometry type.
QgsGeometry interpolate(double distance) const
Returns an interpolated point on the geometry at the specified distance.
QVector< QgsPointXY > QgsPolylineXY
Polyline as represented as a vector of two-dimensional points.
static QgsGeometry::OperationResult addRing(QgsAbstractGeometry *geometry, std::unique_ptr< QgsCurve > ring)
Add an interior ring to a geometry.
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
void fromWkb(unsigned char *wkb, int length)
Set the geometry, feeding in the buffer containing OGC Well-Known Binary and the buffer's length.
Contains geos related utilities and functions.
static QgsGeometry fromPointXY(const QgsPointXY &point) SIP_HOLDGIL
Creates a new geometry from a QgsPointXY object.
@ EngineError
Error occurred in the geometry engine.
Multi line string geometry collection.
QgsGeometry poleOfInaccessibility(double precision, double *distanceFromBoundary=nullptr) const
Calculates the approximate pole of inaccessibility for a surface, which is the most distant internal ...
static std::unique_ptr< QgsMultiPolygon > fromMultiPolygonXY(const QgsMultiPolygonXY &multipoly)
Construct geometry from a multipolygon.
QgsGeometry centroid() const
Returns the center of mass of a geometry.
static QVector< QgsPointXY > randomPointsInPolygon(const QgsGeometry &polygon, int count, const std::function< bool(const QgsPointXY &) > &acceptPoint, unsigned long seed=0, QgsFeedback *feedback=nullptr, int maxTriesPerPoint=0)
Returns a list of count random points generated inside a polygon geometry (if acceptPoint is specifie...
Java-style iterator for const traversal of parts of a geometry.
static QgsGeometry fromQPointF(QPointF point) SIP_HOLDGIL
Construct geometry from a QPointF.
OperationResult addRing(const QVector< QgsPointXY > &ring)
Adds a new ring to this geometry.
void setY(double y) SIP_HOLDGIL
Sets the y value of the point.
@ MethodNotImplemented
Method not implemented in geometry engine.
static double lineAngle(double x1, double y1, double x2, double y2) SIP_HOLDGIL
Calculates the direction of line joining two points in radians, clockwise from the north direction.
OperationResult reshapeGeometry(const QgsLineString &reshapeLineString)
Replaces a part of this geometry with another line.
double area(QString *errorMsg=nullptr) const override
const double * yData() const
Returns a const pointer to the y vertex data.
virtual double length() const
Returns the planar, 2-dimensional length of the geometry.
QPointF toQPointF() const
Converts a point to a QPointF.
QVector< QgsPolygonXY > QgsMultiPolygonXY
A collection of QgsPolygons that share a common collection of attributes.
EndCapStyle
End cap styles for buffers.
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...
OperationResult rotate(double rotation, const QgsPointXY ¢er)
Rotate this geometry around the Z axis.
QgsGeometry minimalEnclosingCircle(QgsPointXY ¢er, double &radius, unsigned int segments=36) const
Returns the minimal enclosing circle for the geometry.
QgsAbstractGeometry::const_part_iterator const_parts_begin() const
Returns STL-style const iterator pointing to the first part of the geometry.
Type
The WKB type describes the number of dimensions a geometry has.
QgsGeometry & operator=(QgsGeometry const &rhs)
Creates a deep copy of the object.
OperationResult
Success or failure of a geometry operation.
SegmentationToleranceType
Segmentation tolerance as maximum angle or maximum difference between approximation and circle.
QgsAbstractGeometry * buffer(double distance, int segments, QString *errorMsg=nullptr) const override
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...
QString lastError() const
Returns an error string referring to the last error encountered.
static Type multiType(Type type) SIP_HOLDGIL
Returns the multi type for a WKB type.
static double sqrDistance2D(const QgsPoint &pt1, const QgsPoint &pt2) SIP_HOLDGIL
Returns the squared 2D distance between two points.
Line string geometry type, with support for z-dimension and m-values.
bool overlaps(const QgsGeometry &geometry) const
Returns true if the geometry overlaps another geometry.
QVector< QgsGeometry > coerceToType(QgsWkbTypes::Type type) const
Attempts to coerce this geometry into the specified destination type.
void setX(double x) SIP_HOLDGIL
Sets the x value of the point.
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...
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 ...
bool deletePart(int partNum)
Deletes part identified by the part number.
A rectangle specified with double values.
QgsMultiPolylineXY asMultiPolyline() const
Returns the contents of the geometry as a multi-linestring.
QVector< QgsPointXY > QgsMultiPointXY
A collection of QgsPoints that share a common collection of attributes.
QVector< QgsGeometry > asGeometryCollection() const
Returns contents of the geometry as a list of geometries.
double hausdorffDistance(const QgsAbstractGeometry *geom, QString *errorMsg=nullptr) const
Returns the Hausdorff distance between this geometry and geom.
QgsPoint project(double distance, double azimuth, double inclination=90.0) const SIP_HOLDGIL
Returns a new point which correspond to this point projected by a specified distance with specified a...
const double * xData() const
Returns a const pointer to the x vertex data.
QgsGeometry mergeLines() const
Merges any connected lines in a LineString/MultiLineString geometry and converts them to single line ...
int numGeometries() const SIP_HOLDGIL
Returns the number of geometries within the collection.
double distanceToVertex(int vertex) const
Returns the distance along this geometry from its first vertex to the specified vertex.
QgsGeometry intersection(const QgsGeometry &geometry) const
Returns a geometry representing the points shared by this geometry and other.
virtual int vertexCount(int part=0, int ring=0) const =0
Returns the number of vertices of which this geometry is built.
bool insertVertex(double x, double y, int beforeVertex)
Insert a new vertex before the given vertex index, ring and item (first number is index 0) If the req...
static bool deleteRing(QgsAbstractGeometry *geom, int ringNum, int partNum=0)
Deletes a ring from a geometry.
bool isMultipart() const SIP_HOLDGIL
Returns true if WKB of the geometry is of WKBMulti* type.
QgsGeometry nearestPoint(const QgsGeometry &other) const
Returns the nearest point on this geometry to another geometry.
virtual QgsPoint vertexAt(QgsVertexId id) const =0
Returns the point corresponding to a specified vertex id.
bool isMeasure() const SIP_HOLDGIL
Returns true if the geometry contains m values.
static Q_DECL_DEPRECATED QgsPolylineXY createPolylineFromQPolygonF(const QPolygonF &polygon)
Creates a QgsPolylineXY from a QPolygonF.
static QgsCircle from2Points(const QgsPoint &pt1, const QgsPoint &pt2) SIP_HOLDGIL
Constructs a circle by 2 points on the circle.
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.
bool isGeosEqual(const QgsGeometry &) const
Compares the geometry with another geometry using GEOS.
bool deleteRing(int ringNum, int partNum=0)
Deletes a ring in polygon or multipolygon.
int numInteriorRings() const SIP_HOLDGIL
Returns the number of interior rings contained with the curve polygon.
The part_iterator class provides STL-style iterator for geometry parts.
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 ...
#define Q_NOWARN_DEPRECATED_POP
QgsGeometryCollection * createEmptyWithSameType() const override
Creates a new geometry with the same class and same WKB type as the original and transfers ownership.
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
virtual double area() const
Returns the planar, 2-dimensional area of the geometry.
bool hasWhere() const
true if the location available from
QPolygonF asQPolygonF() const SIP_HOLDGIL
Returns contents of the geometry as a QPolygonF.
QgsGeometry poleOfInaccessibility(double precision, double *distanceToBoundary=nullptr) const
Calculates the approximate pole of inaccessibility for a surface, which is the most distant internal ...
QgsPolygonXY asPolygon() const
Returns the contents of the geometry as a polygon.
bool intersects(const QgsRectangle &rectangle) const
Returns true if this geometry exactly intersects with a rectangle.
QgsLineString * clone() const override
Clones the geometry by performing a deep copy.
int partCount() const override
Returns count of parts contained in the geometry.
@ NodedGeometryError
Error occurred while creating a noded geometry.
Circular string geometry type.
QgsGeometry densifyByCount(int extraNodesPerSegment) const
Returns a copy of the geometry which has been densified by adding the specified number of extra nodes...
@ InvalidBaseGeometry
The geometry on which the operation occurs is not valid.
QgsWkbTypes::Type wkbType() const SIP_HOLDGIL
Returns the WKB type of the geometry.
static std::unique_ptr< QgsMultiLineString > fromMultiPolylineXY(const QgsMultiPolylineXY &multiline)
Construct geometry from a multipolyline.
static std::unique_ptr< QgsGeometryCollection > createCollectionOfType(QgsWkbTypes::Type type)
Returns a new geometry collection matching a specified WKB type.
QVector< QgsPointXY > randomPointsInPolygon(int count, const std::function< bool(const QgsPointXY &) > &acceptPoint, unsigned long seed=0, QgsFeedback *feedback=nullptr, int maxTriesPerPoint=0) const
Returns a list of count random points generated inside a (multi)polygon geometry (if acceptPoint is s...
int wkbSize(QgsAbstractGeometry::WkbFlags flags=QgsAbstractGeometry::WkbFlags()) const
Returns the length of the QByteArray returned by asWkb()
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...
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 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...
QgsGeometry convertToCurves(double distanceTolerance, double angleTolerance) const
Attempts to convert a non-curved geometry into a curved geometry type (e.g.
QString what() const
A human readable error message containing details about the error.
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...
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.
bool contains(const QgsRectangle &rect) const
Returns true when rectangle contains other rectangle.
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.
This class offers geometry processing methods.
The part_iterator class provides STL-style iterator for const references to geometry parts.
QgsPointXY where() const
The coordinates at which the error is located and should be visualized.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Base class for feedback objects to be used for cancellation of something running in a worker thread.
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.
@ FlagAllowSelfTouchingHoles
Indicates that self-touching holes are permitted. OGC validity states that self-touching holes are NO...
virtual bool addGeometry(QgsAbstractGeometry *g)
Adds a geometry and takes ownership. Returns true in case of success.
QgsGeometry variableWidthBufferByM(int segments) const
Calculates a variable width buffer for a (multi)linestring geometry, where the width at each node is ...
QgsGeometry taperedBuffer(double startWidth, double endWidth, int segments) const
Calculates a variable width buffer ("tapered buffer") for a (multi)curve geometry.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
Does vector analysis using the geos library and handles import, export, exception handling*.
static double averageAngle(double x1, double y1, double x2, double y2, double x3, double y3) SIP_HOLDGIL
Calculates the average angle (in radians) between the two linear segments from (x1,...
static std::unique_ptr< QgsMultiPoint > fromMultiPointXY(const QgsMultiPointXY &multipoint)
Construct geometry from a multipoint.
@ ValidatorQgisInternal
Use internal QgsGeometryValidator method.
static QgsLineString * fromQPolygonF(const QPolygonF &polygon)
Returns a new linestring from a QPolygonF polygon input.
double radius() const SIP_HOLDGIL
Returns the radius of the circle.
QgsGeometry convexHull() const
Returns the smallest convex polygon that contains all the points in the geometry.
bool deleteVertex(int atVertex)
Deletes the vertex at the given position number and item (first number is index 0)
void setX(double x) SIP_HOLDGIL
Sets the point's x-coordinate.
QMap< int, QVariant > QgsAttributeMap
static bool hasM(Type type) SIP_HOLDGIL
Tests whether a WKB type contains m values.
QgsGeometry densifyByDistance(double distance) const
Densifies the geometry by adding regularly placed extra nodes inside each segment so that the maximum...
QgsCircularString * toCircularString(bool oriented=false) const
Returns a circular string from the circle.
static std::unique_ptr< QgsAbstractGeometry > geomFromWkt(const QString &text)
Construct geometry from a WKT string.
double length() const
Returns the planar, 2-dimensional length of geometry.
QVector< QgsPolylineXY > QgsMultiPolylineXY
A collection of QgsPolylines that share a common collection of attributes.
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
QgsGeometry extrude(double x, double y)
Returns an extruded version of this geometry.
bool crosses(const QgsGeometry &geometry) const
Returns true if the geometry crosses another geometry.
Multi polygon geometry collection.
void draw(QPainter &p) const
Draws the geometry onto a QPainter.
void transformVertices(const std::function< QgsPoint(const QgsPoint &) > &transform)
Transforms the vertices from the geometry in place, applying the transform function to every vertex.
QPointF asQPointF() const SIP_HOLDGIL
Returns contents of the geometry as a QPointF if wkbType is WKBPoint, otherwise returns a null QPoint...
QgsGeometry clipped(const QgsRectangle &rectangle)
Clips the geometry using the specified rectangle.
QgsGeometry orientedMinimumBoundingBox(double &area, double &angle, double &width, double &height) const
Returns the oriented minimum bounding box for the geometry, which is the smallest (by area) rotated r...
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
std::unique_ptr< QgsAbstractGeometry > geometry
const QgsCurve * interiorRing(int i) const SIP_HOLDGIL
Retrieves an interior ring from the curve polygon.
Q_DECL_DEPRECATED OperationResult splitGeometry(const QVector< QgsPointXY > &splitLine, QVector< QgsGeometry > &newGeometries, bool topological, QVector< QgsPointXY > &topologyTestPoints, bool splitFeature=true)
Splits this geometry according to a given line.
QgsPoint center() const SIP_HOLDGIL
Returns the center point.
QVector< QgsPointSequence > QgsRingSequence
QgsGeometry pointOnSurface() const
Returns a point guaranteed to lie on the surface of a geometry.
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
@ InvalidInputGeometryType
The input geometry (ring, part, split line, etc.) has not the correct geometry type.
bool touches(const QgsGeometry &geometry) const
Returns true if the geometry touches another geometry.
static QgsGeometry fromWkt(const QString &wkt)
Creates a new geometry from a WKT string.
Multi point geometry collection.
QgsPointXY transform(const QgsPointXY &p) const
Transform the point from map (world) coordinates to device coordinates.
static QgsPoint closestVertex(const QgsAbstractGeometry &geom, const QgsPoint &pt, QgsVertexId &id)
Returns the closest vertex to a geometry for a specified point.
Abstract base class for all geometries.
QgsGeometry simplify(double tolerance) const
Returns a simplified version of this geometry using a specified tolerance value.
QgsCoordinateSequence coordinateSequence() const override
Retrieves the sequence of geometries, rings and nodes.
std::unique_ptr< QgsAbstractGeometry > _qgis_lwgeom_make_valid(const QgsAbstractGeometry *lwgeom_in, QString &errorMessage)
Implementation of QgsGeometry::makeValid(). Not a public API.
static bool deletePart(QgsAbstractGeometry *geom, int partNum)
Deletes a part from a geometry.
bool is3D() const SIP_HOLDGIL
Returns true if the geometry is 3D and contains a z-value.
QgsPoint vertexAt(int atVertex) const
Returns coordinates of a vertex.
QgsPoint * pointN(int index)
Returns the point with the specified index.
QgsPointSequence QgsPolyline
Polyline as represented as a vector of points.
A class to represent a 2D point.
QgsGeometry() SIP_HOLDGIL
Constructor.
bool dropMValue() override
Drops any measure values which exist in the geometry.
double hausdorffDistance(const QgsGeometry &geom) const
Returns the Hausdorff distance between this geometry and geom.
virtual QgsRectangle boundingBox() const =0
Returns the minimal bounding box for the geometry.
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
QgsGeometry densifyByDistance(double distance) const
Densifies the geometry by adding regularly placed extra nodes inside each segment so that the maximum...
static double distanceToVertex(const QgsAbstractGeometry &geom, QgsVertexId id)
Returns the distance along a geometry from its first vertex to the specified vertex.
QgsGeometry convertToCurves(double distanceTolerance=1e-8, double angleTolerance=1e-8) const
Attempts to convert a non-curved geometry into a curved geometry type (e.g.
virtual json asJsonObject(int precision=17) const
Exports the geometry to a json object.
bool isValid() const SIP_HOLDGIL
Returns true if the vertex id is valid.
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...
@ NothingHappened
Nothing happened, without any error.
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.
static bool isCurvedType(Type type) SIP_HOLDGIL
Returns true if the WKB type is a curved type or can contain curved geometries.
QString asWkt(int precision=17) const
Exports the geometry to WKT.
double interpolateAngle(double distance) const
Returns the angle parallel to the linestring or polygon boundary at the specified distance along the ...
@ SplitCannotSplitPoint
Points cannot be split.
static QgsGeometry fromPolygonXY(const QgsPolygonXY &polygon)
Creates a new geometry from a QgsPolygon.
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
QgsGeometry makeValid() const
Attempts to make an invalid geometry valid without losing vertices.
BufferSide
Side of line to buffer.
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.
The vertex_iterator class provides STL-style iterator for vertices.
QgsGeometry shortestLine(const QgsGeometry &other) const
Returns the shortest line joining this geometry to another geometry.
QVector< QgsPoint > QgsPointSequence
double length(QString *errorMsg=nullptr) const override
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
A geometry is the spatial representation of a feature.
Perform transforms between map coordinates and device coordinates.
Java-style iterator for traversal of parts of a geometry.
Represents a vector layer which manages a vector based data sets.
@ InvalidBaseGeometry
The base geometry on which the operation is done is invalid or empty.
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.
QgsLineString * lineStringN(int index)
Returns the line string with the specified index.
static QgsGeometry::OperationResult addPart(QgsAbstractGeometry *geometry, std::unique_ptr< QgsAbstractGeometry > part)
Add a part to multi type geometry.
QgsGeometry singleSidedBuffer(double distance, int segments, BufferSide side, JoinStyle joinStyle=JoinStyleRound, double miterLimit=2.0) const
Returns a single sided buffer for a (multi)line geometry.
bool convertToMultiType()
Converts single type geometry into multitype geometry e.g.
@ Success
Operation succeeded.
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 fromRect(const QgsRectangle &rect) SIP_HOLDGIL
Creates a new geometry from a QgsRectangle.
Utility class for identifying a unique vertex within a geometry.
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...
QgsGeometry forceRHR() const
Forces geometries to respect the Right-Hand-Rule, in which the area that is bounded by a polygon is t...
QgsGeometry convertToType(QgsWkbTypes::GeometryType destType, bool destMultipart=false) const
Try to convert the geometry to the requested type.
double closestVertexWithContext(const QgsPointXY &point, int &atVertex) const
Searches for the closest vertex in this geometry to the given point.
int vertexNrFromVertexId(QgsVertexId id) const
Returns the vertex number corresponding to a vertex id.
void mapToPixel(const QgsMapToPixel &mtp)
Transforms the geometry from map units to pixels in place.
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.
QgsVertexIterator vertices() const
Returns a read-only, Java-style iterator for traversal of vertices of all the geometry,...
static GeometryType geometryType(Type type) SIP_HOLDGIL
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
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.
QgsMultiPointXY asMultiPoint() const
Returns the contents of the geometry as a multi-point.
bool isSimple() const
Determines whether the geometry is simple (according to OGC definition), i.e.
virtual QgsAbstractGeometry * boundary() const =0
Returns the closure of the combinatorial boundary of the geometry (ie the topological boundary of the...
static QgsGeometry createWedgeBuffer(const QgsPoint ¢er, double azimuth, double angularWidth, double outerRadius, double innerRadius=0)
Creates a wedge shaped buffer from a center point.
EngineOperationResult
Success or failure of a geometry operation.
ValidationMethod
Available methods for validating geometries.
Java-style iterator for traversal of vertices of a geometry.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
static bool hasZ(Type type) SIP_HOLDGIL
Tests whether a WKB type contains the z-dimension.
virtual QgsPolygon * toPolygon(unsigned int segments=36) const
Returns a segmented polygon.
bool vertexIdFromVertexNr(int number, QgsVertexId &id) const
Calculates the vertex ID from a vertex number.
JoinStyle
Join styles for buffers.
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
QgsGeometry symDifference(const QgsGeometry &geometry) const
Returns a geometry representing the points making up this geometry that do not make up other.
bool contains(const QgsPointXY *p) const
Returns true if the geometry contains the point p.
virtual int numPoints() const =0
Returns the number of points in the curve.
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.
bool isGeosValid(QgsGeometry::ValidityFlags flags=QgsGeometry::ValidityFlags()) const
Checks validity of the geometry using GEOS.
static double angleBetweenThreePoints(double x1, double y1, double x2, double y2, double x3, double y3) SIP_HOLDGIL
Calculates the angle between the lines AB and BC, where AB and BC described by points a,...
void adjacentVertices(int atVertex, int &beforeVertex, int &afterVertex) const
Returns the indexes of the vertices before and after the given vertex index.
QgsCurve * segmentize(double tolerance=M_PI_2/90, SegmentationToleranceType toleranceType=MaximumAngle) const override
Returns a geometry without curves.
QgsAbstractGeometry::vertex_iterator vertices_begin() const
Returns STL-style iterator pointing to the first vertex of the geometry.
int numPoints() const override SIP_HOLDGIL
Returns the number of points in the curve.
Orientation
Curve orientation.
static bool isMultiType(Type type) SIP_HOLDGIL
Returns true if the WKB type is a multi type.
QgsWkbTypes::GeometryType type
#define Q_NOWARN_DEPRECATED_PUSH
static void validateGeometry(const QgsGeometry &geometry, QVector< QgsGeometry::Error > &errors, QgsGeometry::ValidationMethod method=QgsGeometry::ValidatorQgisInternal)
Validate geometry and produce a list of geometry errors.
static std::unique_ptr< QgsAbstractGeometry > geomFromWkbType(QgsWkbTypes::Type t)
Returns empty geometry from wkb type.
Contains geometry relation and modification algorithms.
bool isEmpty() const
Returns true if the rectangle is empty.
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)
double area() const
Returns the planar, 2-dimensional area of the 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 int ringCount(int part=0) const =0
Returns the number of rings 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.
bool isNull() const
Test if the rectangle is null (all coordinates zero or after call to setMinimal()).
void set(QgsAbstractGeometry *geometry)
Sets the underlying geometry store.
QgsGeometry difference(const QgsGeometry &geometry) const
Returns a geometry representing the points making up this geometry that do not make up other.
static QgsPointXY interpolatePointOnLine(double x1, double y1, double x2, double y2, double fraction) SIP_HOLDGIL
Interpolates the position of a point a fraction of the way along the line from (x1,...
bool boundingBoxIntersects(const QgsRectangle &rectangle) const
Returns true if the bounding box of this geometry intersects with a rectangle.
QgsPolygon * polygonN(int index)
Returns the polygon with the specified index.
static std::unique_ptr< QgsAbstractGeometry > fromPolylineXY(const QgsPolylineXY &polyline)
Construct geometry from a polyline.
QgsWkbTypes::Type wkbType() const SIP_HOLDGIL
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
QgsGeometry delaunayTriangulation(double tolerance=0.0, bool edgesOnly=false) const
Returns the Delaunay triangulation for the vertices of the geometry.
static QgsGeometry fromMultiPolygonXY(const QgsMultiPolygonXY &multipoly)
Creates a new geometry from a QgsMultiPolygon.
QgsGeometry taperedBuffer(double startWidth, double endWidth, int segments) const
Calculates a tapered width buffer for a (multi)curve geometry.
static QgsGeometry unaryUnion(const QVector< QgsGeometry > &geometries)
Compute the unary union on a list of geometries.
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.
static QgsGeometry collectGeometry(const QVector< QgsGeometry > &geometries)
Creates a new multipart geometry from a list of QgsGeometry objects.
QgsGeometry orientedMinimumBoundingBox() const
Returns the oriented minimum bounding box for the geometry, which is the smallest (by area) rotated r...
QgsMultiPolygonXY asMultiPolygon() const
Returns the contents of the geometry as a multi-polygon.
@ GeometryEngineError
Geometry engine misses a method implemented or an error occurred in the geometry engine.
QgsAbstractGeometry::part_iterator parts_end()
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry.
static std::unique_ptr< QgsAbstractGeometry > fromPointXY(const QgsPointXY &point)
Construct geometry from a point.
double lineLocatePoint(const QgsGeometry &point) const
Returns a distance representing the location along this linestring of the closest point on this lines...
bool disjoint(const QgsGeometry &geometry) const
Returns true if the geometry is disjoint of another geometry.
bool dropZValue() override
Drops any z-dimensions which exist in the geometry.