26 #include <QStringList>    28 #include <QRegularExpression>    32   QVector< QgsLineString * > linestrings;
    36   QVector< const QgsAbstractGeometry * > geometries;
    38   while ( ! geometries.isEmpty() )
    41     if ( 
const QgsCurve *curve = qgsgeometry_cast< const QgsCurve * >( g ) )
    43       linestrings << static_cast< QgsLineString * >( curve->segmentize() );
    45     else if ( 
const QgsGeometryCollection *collection = qgsgeometry_cast< const QgsGeometryCollection * >( g ) )
    47       for ( 
int i = 0; i < collection->numGeometries(); ++i )
    49         geometries.append( collection->geometryN( i ) );
    52     else if ( 
const QgsCurvePolygon *curvePolygon = qgsgeometry_cast< const QgsCurvePolygon * >( g ) )
    54       if ( curvePolygon->exteriorRing() )
    55         linestrings << static_cast< QgsLineString * >( curvePolygon->exteriorRing()->segmentize() );
    57       for ( 
int i = 0; i < curvePolygon->numInteriorRings(); ++i )
    59         linestrings << static_cast< QgsLineString * >( curvePolygon->interiorRing( i )->segmentize() );
    68   double minDist = std::numeric_limits<double>::max();
    69   double currentDist = 0;
    83     if ( currentDist <= minDist )
    85       minDist = currentDist;
    86       minDistPoint = vertex;
    87       id.part = vertexId.
part;
    88       id.ring = vertexId.
ring;
    89       id.vertex = vertexId.
vertex;
    90       id.type = vertexId.
type;
   105     if ( vertexAfter.
vertex > 0 )
   111       double distance = pointBefore.
distance( closestPoint );
   114         closestPoint = pointBefore;
   116         closestPoint = pointAfter;
   120           closestPoint.
addZValue( pointBefore.
z() + ( pointAfter.
z() - pointBefore.
z() ) * distance / length );
   122           closestPoint.
addMValue( pointBefore.
m() + ( pointAfter.
m() - pointBefore.
m() ) * distance / length );
   132   double currentDist = 0;
   137     if ( vertexId == 
id )
   151   double currentDist = 0;
   161     nextVertex = previousVertex;
   166   while ( currentDist < distance && geometry.
nextVertex( nextVertex, point ) )
   180     if ( currentDist > distance )
   186     previousPoint = point;
   196   return ( pt1.
x() - pt2.
x() ) * ( pt1.
x() - pt2.
x() ) + ( pt1.
y() - pt2.
y() ) * ( pt1.
y() - pt2.
y() );
   209     double t = ( ( ptX - x1 ) * dx + ( ptY - y1 ) * dy ) / ( dx * dx + dy * dy );
   225   double dist = dx * dx + dy * dy;
   240   double d = v1.
y() * v2.
x() - v1.
x() * v2.
y();
   245   double dx = p2.
x() - p1.
x();
   246   double dy = p2.
y() - p1.
y();
   247   double k = ( dy * v2.
x() - dx * v2.
y() ) / d;
   249   intersection = 
QgsPoint( p1.
x() + v1.
x() * k, p1.
y() + v1.
y() * k );
   259   isIntersection = 
false;
   264   double wl = w.length();
   278   isIntersection = 
true;
   279   if ( acceptImproperIntersection )
   281     if ( ( p1 == q1 ) || ( p1 == q2 ) )
   283       intersectionPoint = p1;
   286     else if ( ( p2 == q1 ) || ( p2 == q2 ) )
   288       intersectionPoint = p2;
   295       qgsDoubleNear( 
QgsGeometryUtils::sqrDistToLine( p1.
x(), p1.
y(), q1.
x(), q1.
y(), q2.
x(), q2.
y(), x, y, tolerance ), 0.0, tolerance ) ||
   297       qgsDoubleNear( 
QgsGeometryUtils::sqrDistToLine( p2.
x(), p2.
y(), q1.
x(), q1.
y(), q2.
x(), q2.
y(), x, y, tolerance ), 0.0, tolerance ) ||
   299       qgsDoubleNear( 
QgsGeometryUtils::sqrDistToLine( q1.
x(), q1.
y(), p1.
x(), p1.
y(), p2.
x(), p2.
y(), x, y, tolerance ), 0.0, tolerance ) ||
   301       qgsDoubleNear( 
QgsGeometryUtils::sqrDistToLine( q2.
x(), q2.
y(), p1.
x(), p1.
y(), p2.
x(), p2.
y(), x, y, tolerance ), 0.0, tolerance )
   308   double lambdav = 
QgsVector( intersectionPoint.
x() - p1.
x(), intersectionPoint.
y() - p1.
y() ) *  v;
   309   if ( lambdav < 0. + tolerance || lambdav > vl - tolerance )
   312   double lambdaw = 
QgsVector( intersectionPoint.
x() - q1.
x(), intersectionPoint.
y() - q1.
y() ) * w;
   313   return !( lambdaw < 0. + tolerance || lambdaw >= wl - tolerance );
   323   const double x1 = linePoint1.
x() - center.
x();
   324   const double y1 = linePoint1.
y() - center.
y();
   325   const double x2 = linePoint2.
x() - center.
x();
   326   const double y2 = linePoint2.
y() - center.
y();
   327   const double dx = x2 - x1;
   328   const double dy = y2 - y1;
   330   const double dr2 = std::pow( dx, 2 ) + std::pow( dy, 2 );
   331   const double d = x1 * y2 - x2 * y1;
   333   const double disc = std::pow( radius, 2 ) * dr2 - std::pow( d, 2 );
   343     const int sgnDy = dy < 0 ? -1 : 1;
   345     const double sqrDisc = std::sqrt( disc );
   347     const double ax = center.
x() + ( d * dy + sgnDy * dx * sqrDisc ) / dr2;
   348     const double ay = center.
y() + ( -d * dx + std::fabs( dy ) * sqrDisc ) / dr2;
   351     const double bx = center.
x() + ( d * dy - sgnDy * dx * sqrDisc ) / dr2;
   352     const double by = center.
y() + ( -d * dx - std::fabs( dy ) * sqrDisc ) / dr2;
   359       intersection.
set( p1.
x(), p1.
y() );
   363       intersection.
set( p2.
x(), p2.
y() );
   374   const double d = center0.
distance( center1 );
   377   if ( d > ( r0 + r1 ) )
   382   else if ( d < std::fabs( r0 - r1 ) )
   399   const double a = ( ( r0 * r0 ) - ( r1 * r1 ) + ( d * d ) ) / ( 2.0 * d ) ;
   404   const double dx = center1.
x() - center0.
x();
   405   const double dy = center1.
y() - center0.
y();
   408   const double x2 = center0.
x() + ( dx * a / d );
   409   const double y2 = center0.
y() + ( dy * a / d );
   414   const double h = std::sqrt( ( r0 * r0 ) - ( a * a ) );
   419   const double rx = dy * ( h / d );
   420   const double ry = dx * ( h / d );
   423   intersection1 = 
QgsPointXY( x2 + rx, y2 - ry );
   424   intersection2 = 
QgsPointXY( x2 - rx, y2 +  ry );
   438   const double dx = center.
x() - p.
x();
   439   const double dy = center.
y() - p.
y();
   440   const double distanceSquared = dx * dx + dy * dy;
   441   const double radiusSquared = radius * radius;
   442   if ( distanceSquared < radiusSquared )
   449   const double distanceToTangent = std::sqrt( distanceSquared - radiusSquared );
   461   if ( radius1 > radius2 )
   464   const double radius2a = radius2 - radius1;
   473   QgsVector v1( -( line1P2.
y() - center1.
y() ), line1P2.
x() - center1.
x() );
   474   const double v1Length = v1.
length();
   475   v1 = v1 * ( radius1 / v1Length );
   478   line1P1 = center1 + v1;
   479   line1P2 = line1P2 + v1;
   483   QgsVector v2( line2P2.
y() - center1.
y(), -( line2P2.
x() - center1.
x() ) );
   484   const double v2Length = v2.
length();
   485   v2 = v2 * ( radius1 / v2Length );
   488   line2P1 = center1 + v2;
   489   line2P2 = line2P2 + v2;
   496   QVector<SelfIntersection> intersections;
   502   for ( 
int i = 0, j = 1; j < n; i = j++ )
   510     int end = i == 0 && isClosed ? n - 1 : n;
   511     for ( 
int k = start, l = start + 1; l < end; k = l++ )
   517       bool intersection = 
false;
   528       intersections.append( s );
   531   return intersections;
   540   double test = ( f1 * f2 - f3 * f4 );
   542   return qgsDoubleNear( test, 0.0 ) ? 0 : ( test < 0 ? -1 : 1 );
   552 void QgsGeometryUtils::pointOnLineWithDistance( 
double x1, 
double y1, 
double x2, 
double y2, 
double distance, 
double &x, 
double &y, 
double *z1, 
double *z2, 
double *z, 
double *m1, 
double *m2, 
double *m )
   554   const double dx = x2 - x1;
   555   const double dy = y2 - y1;
   556   const double length = std::sqrt( dx * dx + dy * dy );
   569     const double scaleFactor = distance / 
length;
   570     x = x1 + dx * scaleFactor;
   571     y = y1 + dy * scaleFactor;
   573       *z = *z1 + ( *z2 - *z1 ) * scaleFactor;
   575       *m = *m1 + ( *m2 - *m1 ) * scaleFactor;
   581   double centerX, centerY, radius;
   584   const double theta = distance / radius; 
   585   const double anglePt1 = std::atan2( pt1.
y() - centerY, pt1.
x() - centerX );
   586   const double anglePt2 = std::atan2( pt2.
y() - centerY, pt2.
x() - centerX );
   587   const double anglePt3 = std::atan2( pt3.
y() - centerY, pt3.
x() - centerX );
   588   const bool isClockwise = 
circleClockwise( anglePt1, anglePt2, anglePt3 );
   589   const double angleDest = anglePt1 + ( isClockwise ? -theta : theta );
   591   const double x = centerX + radius * ( std::cos( angleDest ) );
   592   const double y = centerY + radius * ( std::sin( angleDest ) );
   594   const double z = pt1.
is3D() ?
   606   double angle = std::atan2( dy, dx ) * 180 / M_PI;
   611   else if ( angle > 360 )
   620   double dx21, dy21, dx31, dy31, h21, h31, d;
   625     centerX = ( pt1.
x() + pt2.
x() ) / 2.0;
   626     centerY = ( pt1.
y() + pt2.
y() ) / 2.0;
   627     radius = std::sqrt( std::pow( centerX - pt1.
x(), 2.0 ) + std::pow( centerY - pt1.
y(), 2.0 ) );
   632   dx21 = pt2.
x() - pt1.
x();
   633   dy21 = pt2.
y() - pt1.
y();
   634   dx31 = pt3.
x() - pt1.
x();
   635   dy31 = pt3.
y() - pt1.
y();
   637   h21 = std::pow( dx21, 2.0 ) + std::pow( dy21, 2.0 );
   638   h31 = std::pow( dx31, 2.0 ) + std::pow( dy31, 2.0 );
   641   d = 2 * ( dx21 * dy31 - dx31 * dy21 );
   651   centerX = pt1.
x() + ( h21 * dy31 - h31 * dy21 ) / d;
   652   centerY = pt1.
y() - ( h21 * dx31 - h31 * dx21 ) / d;
   653   radius = std::sqrt( std::pow( centerX - pt1.
x(), 2.0 ) + std::pow( centerY - pt1.
y(), 2.0 ) );
   658   if ( angle3 >= angle1 )
   660     return !( angle2 > angle1 && angle2 < angle3 );
   664     return !( angle2 > angle1 || angle2 < angle3 );
   672     if ( angle2 < angle1 )
   674       return ( angle <= angle1 && angle >= angle2 );
   678       return ( angle <= angle1 || angle >= angle2 );
   683     if ( angle2 > angle1 )
   685       return ( angle >= angle1 && angle <= angle2 );
   689       return ( angle >= angle1 || angle <= angle2 );
   702   double centerX, centerY, radius;
   704   double length = M_PI / 180.0 * radius * 
sweepAngle( centerX, centerY, x1, y1, x2, y2, x3, y3 );
   718   if ( p3Angle >= p1Angle )
   720     if ( p2Angle > p1Angle && p2Angle < p3Angle )
   722       return ( p3Angle - p1Angle );
   726       return ( - ( p1Angle + ( 360 - p3Angle ) ) );
   731     if ( p2Angle < p1Angle && p2Angle > p3Angle )
   733       return ( -( p1Angle - p3Angle ) );
   737       return ( p3Angle + ( 360 - p1Angle ) );
   744   QgsPoint midPoint( ( p1.
x() + p2.
x() ) / 2.0, ( p1.
y() + p2.
y() ) / 2.0 );
   746   if ( radius < midDist )
   750   double centerMidDist = std::sqrt( radius * radius - midDist * midDist );
   751   double dist = radius - centerMidDist;
   753   double midDx = midPoint.
x() - p1.
x();
   754   double midDy = midPoint.
y() - p1.
y();
   757   QVector<QgsPoint> possibleMidPoints;
   764   double minDist = std::numeric_limits<double>::max();
   765   int minDistIndex = -1;
   766   for ( 
int i = 0; i < possibleMidPoints.size(); ++i )
   768     double currentDist = 
sqrDistance2D( mousePos, possibleMidPoints.at( i ) );
   769     if ( currentDist < minDist )
   772       minDist = currentDist;
   776   if ( minDistIndex == -1 )
   781   result = possibleMidPoints.at( minDistIndex );
   793   if ( !useShortestArc )
   794     midPointAngle += M_PI;
   795   return center.
project( center.
distance( p1 ), midPointAngle * 180 / M_PI );
   802   double mX, mY, radius;
   811     angle = 
lineAngle( tangentPoint.
x(), tangentPoint.
y(), mX, mY ) - M_PI_2;
   815     angle = 
lineAngle( mX, mY, tangentPoint.
x(), tangentPoint.
y() ) - M_PI_2;
   824   bool reversed = 
false;
   848   circleCenterRadius( circlePoint1, circlePoint2, circlePoint3, radius, centerX, centerY );
   850   if ( circlePoint1 != circlePoint3 && ( radius < 0 || 
qgsDoubleNear( segSide, 0.0 ) ) ) 
   858   double increment = tolerance; 
   862     tolerance = std::min( tolerance, radius * 2 );
   863     double halfAngle = std::acos( -tolerance / radius + 1 );
   864     increment = 2 * halfAngle;
   868   double a1 = std::atan2( circlePoint1.
y() - centerY, circlePoint1.
x() - centerX );
   869   double a2 = std::atan2( circlePoint2.
y() - centerY, circlePoint2.
x() - centerX );
   870   double a3 = std::atan2( circlePoint3.
y() - centerY, circlePoint3.
x() - centerX );
   873   const bool symmetric = 
true;
   876     double angle = a3 - a1;
   878     if ( angle <= 0 ) angle += M_PI * 2;
   881     int segs = ceil( angle / increment );
   883     increment = angle / segs;
   897   QVector<QgsPoint> stringPoints;
   898   stringPoints.insert( 0, circlePoint1 );
   899   if ( circlePoint2 != circlePoint3 && circlePoint1 != circlePoint2 ) 
   913     double tolError = increment / 100;
   914     double stopAngle = a3 - tolError;
   915     for ( 
double angle = a1 + increment; 
angle < stopAngle; 
angle += increment )
   917       x = centerX + radius * std::cos( 
angle );
   918       y = centerY + radius * std::sin( 
angle );
   929       stringPoints.insert( stringPoints.size(), 
QgsPoint( pointWkbType, x, y, z, m ) );
   932   stringPoints.insert( stringPoints.size(), circlePoint3 );
   937     std::reverse( stringPoints.begin(), stringPoints.end() );
   939   if ( ! points.empty() && stringPoints.front() == points.back() ) stringPoints.pop_front();
   940   points.append( stringPoints );
   945   double side = ( ( pt2.
x() - pt1.
x() ) * ( pt3.
y() - pt1.
y() ) - ( pt3.
x() - pt1.
x() ) * ( pt2.
y() - pt1.
y() ) );
   970       return zm1 + ( zm2 - zm1 ) * ( angle - a1 ) / ( a2 - a1 );
   972       return zm2 + ( zm3 - zm2 ) * ( angle - a2 ) / ( a3 - a2 );
   978       return zm1 + ( zm2 - zm1 ) * ( a1 - angle ) / ( a1 - a2 );
   980       return zm2 + ( zm3 - zm2 ) * ( a2 - angle ) / ( a2 - a3 );
   988   const QStringList coordList = wktCoordinateList.split( 
',', QString::SkipEmptyParts );
   993   QRegularExpression rx( QStringLiteral( 
"\\s" ) );
   994   for ( 
const QString &pointCoordinates : coordList )
   996     QStringList coordinates = pointCoordinates.split( rx, QString::SkipEmptyParts );
   997     if ( coordinates.size() == 3 && !foundZ && !foundM && !is3D && !
isMeasure )
  1003     else if ( coordinates.size() >= 4 && ( !( is3D || foundZ ) || !( isMeasure || foundM ) ) )
  1012   for ( 
const QString &pointCoordinates : coordList )
  1014     QStringList coordinates = pointCoordinates.split( rx, QString::SkipEmptyParts );
  1015     if ( coordinates.size() < dim )
  1019     double x = coordinates[idx++].toDouble();
  1020     double y = coordinates[idx++].toDouble();
  1023     if ( ( is3D || foundZ ) && coordinates.length() > idx )
  1024       z = coordinates[idx++].toDouble();
  1027     if ( ( isMeasure || foundM ) && coordinates.length() > idx )
  1028       m = coordinates[idx++].toDouble();
  1031     if ( is3D || foundZ )
  1033       if ( isMeasure || foundM )
  1040       if ( isMeasure || foundM )
  1046     points.append( 
QgsPoint( t, x, y, z, m ) );
  1054   wkb << static_cast<quint32>( points.size() );
  1055   for ( 
const QgsPoint &point : points )
  1057     wkb << point.x() << point.y();
  1071   QString wkt = QStringLiteral( 
"(" );
  1080     wkt += QLatin1String( 
", " );
  1082   if ( wkt.endsWith( QLatin1String( 
", " ) ) )
  1090   QDomElement elemCoordinates = doc.createElementNS( ns, QStringLiteral( 
"coordinates" ) );
  1093   QString cs = QStringLiteral( 
"," );
  1095   QString ts = QStringLiteral( 
" " );
  1097   elemCoordinates.setAttribute( QStringLiteral( 
"cs" ), cs );
  1098   elemCoordinates.setAttribute( QStringLiteral( 
"ts" ), ts );
  1100   QString strCoordinates;
  1103     if ( axisOrder == QgsAbstractGeometry::AxisOrder::XY )
  1108   if ( strCoordinates.endsWith( ts ) )
  1109     strCoordinates.chop( 1 ); 
  1111   elemCoordinates.appendChild( doc.createTextNode( strCoordinates ) );
  1112   return elemCoordinates;
  1117   QDomElement elemPosList = doc.createElementNS( ns, QStringLiteral( 
"posList" ) );
  1118   elemPosList.setAttribute( QStringLiteral( 
"srsDimension" ), is3D ? 3 : 2 );
  1120   QString strCoordinates;
  1123     if ( axisOrder == QgsAbstractGeometry::AxisOrder::XY )
  1130   if ( strCoordinates.endsWith( 
' ' ) )
  1131     strCoordinates.chop( 1 ); 
  1133   elemPosList.appendChild( doc.createTextNode( strCoordinates ) );
  1139   QString json = QStringLiteral( 
"[ " );
  1144   if ( json.endsWith( QLatin1String( 
", " ) ) )
  1154   double clippedAngle = 
angle;
  1155   if ( clippedAngle >= M_PI * 2 || clippedAngle <= -2 * M_PI )
  1157     clippedAngle = std::fmod( clippedAngle, 2 * M_PI );
  1159   if ( clippedAngle < 0.0 )
  1161     clippedAngle += 2 * M_PI;
  1163   return clippedAngle;
  1170   QRegularExpression cooRegEx( QStringLiteral( 
"^[^\\(]*\\((.*)\\)[^\\)]*$" ) );
  1171   cooRegEx.setPatternOptions( QRegularExpression::DotMatchesEverythingOption );
  1172   QRegularExpressionMatch match = cooRegEx.match( wkt );
  1173   QString contents = match.hasMatch() ? match.captured( 1 ) : QString();
  1174   return qMakePair( wkbType, contents );
  1182   for ( 
int i = 0, n = wkt.length(); i < n; ++i )
  1184     if ( ( wkt[i].isSpace() || wkt[i] == 
'\n' || wkt[i] == 
'\t' ) && level == 0 )
  1187     if ( wkt[i] == 
',' && level == 0 )
  1189       if ( !block.isEmpty() )
  1191         if ( block.startsWith( 
'(' ) && !defaultType.isEmpty() )
  1192           block.prepend( defaultType + 
' ' );
  1193         blocks.append( block );
  1198     if ( wkt[i] == 
'(' )
  1200     else if ( wkt[i] == 
')' )
  1204   if ( !block.isEmpty() )
  1206     if ( block.startsWith( 
'(' ) && !defaultType.isEmpty() )
  1207       block.prepend( defaultType + 
' ' );
  1208     blocks.append( block );
  1218   double x = ( pt1.
x() + pt2.
x() ) / 2.0;
  1219   double y = ( pt1.
y() + pt2.
y() ) / 2.0;
  1220   double z = std::numeric_limits<double>::quiet_NaN();
  1221   double m = std::numeric_limits<double>::quiet_NaN();
  1226     z = ( pt1.
z() + pt2.
z() ) / 2.0;
  1232     m = ( pt1.
m() + pt2.
m() ) / 2.0;
  1235   return QgsPoint( pType, x, y, z, m );
  1240   const double _fraction = 1 - fraction;
  1242                    p1.
x() * _fraction + p2.
x() * fraction,
  1243                    p1.
y() * _fraction + p2.
y() * fraction,
  1244                    p1.
is3D() ? p1.
z() * _fraction + p2.
z() * fraction : std::numeric_limits<double>::quiet_NaN(),
  1245                    p1.
isMeasure() ? p1.
m() * _fraction + p2.
m() * fraction : std::numeric_limits<double>::quiet_NaN() );
  1250   const double deltaX = ( x2 - x1 ) * fraction;
  1251   const double deltaY = ( y2 - y1 ) * fraction;
  1252   return QgsPointXY( x1 + deltaX, y1 + deltaY );
  1260   const double fraction = ( value - v1 ) / ( v2 - v1 );
  1266   double delta_x = pt2.
x() - pt1.
x();
  1267   double delta_y = pt2.
y() - pt1.
y();
  1273   return delta_y / delta_x;
  1292     a = pt1.
y() - pt2.
y();
  1293     b = pt2.
x() - pt1.
x();
  1294     c = pt1.
x() * pt2.
y() - pt1.
y() * pt2.
x();
  1304   if ( ( p == s1 ) || ( p == s2 ) )
  1322     double y = ( -c - a * p.
x() ) / b;
  1324     double d2 = 1 + m * m;
  1325     double H = p.
y() - y;
  1326     double dx = m * H / d2;
  1339   double at = std::atan2( y2 - y1, x2 - x1 );
  1340   double a = -at + M_PI_2;
  1346   double angle1 = std::atan2( y1 - y2, x1 - x2 );
  1347   double angle2 = std::atan2( y3 - y2, x3 - x2 );
  1361   double a1 = 
lineAngle( x1, y1, x2, y2 );
  1362   double a2 = 
lineAngle( x2, y2, x3, y3 );
  1370   double clockwiseDiff = 0.0;
  1373     clockwiseDiff = a2 - a1;
  1377     clockwiseDiff = a2 + ( 2 * M_PI - a1 );
  1379   double counterClockwiseDiff = 2 * M_PI - clockwiseDiff;
  1381   double resultAngle = 0;
  1382   if ( clockwiseDiff <= counterClockwiseDiff )
  1384     resultAngle = a1 + clockwiseDiff / 2.0;
  1388     resultAngle = a1 - counterClockwiseDiff / 2.0;
  1399   if ( u3.
length() == 0 ) 
return 1;
  1416   if ( std::fabs( u3.
x() ) <= epsilon &&
  1417        std::fabs( u3.
y() ) <= epsilon &&
  1418        std::fabs( u3.
z() ) <= epsilon )
  1430   if ( !( std::fabs( b1 ) > epsilon ) )
  1435   if ( !( a2 != -1 && a2 != 1 ) )
  1441   double r1 = ( c2 - b2 * c1 / b1 ) / ( a2 - b2 * a1 / b1 );
  1457     bool isIntersection;
  1466     intersection.
set( ptInter.
x(), ptInter.
y(), La1.
z() );
  1506   if ( !firstIsDone || !secondIsDone )
  1512   intersection = ( X1 + X2 ) / 2.0;
  1520   for ( 
const QgsPoint &pt : points )
  1525       point.
setZ( pt.z() );
 Maximum distance between an arbitrary point on the original curve and closest point on its approximat...
 
static bool lineCircleIntersection(const QgsPointXY ¢er, double radius, const QgsPointXY &linePoint1, const QgsPointXY &linePoint2, QgsPointXY &intersection)
Compute the intersection of a line and a circle. 
 
3 Class for storage of 3D vectors similar to QVector3D, with the difference that it uses double preci...
 
static double skewLinesDistance(const QgsVector3D &P1, const QgsVector3D &P12, const QgsVector3D &P2, const QgsVector3D &P22)
An algorithm to calculate the shortest distance between two skew lines. 
 
static QString pointsToJSON(const QgsPointSequence &points, int precision)
Returns a geoJSON coordinates string. 
 
void set(double x, double y)
Sets the x and y value of the point. 
 
double distance(double x, double y) const 
Returns the distance between this point and a specified x, y coordinate. 
 
static bool circleAngleBetween(double angle, double angle1, double angle2, bool clockwise)
Returns true if, in a circle, angle is between angle1 and angle2. 
 
static double interpolateArcValue(double angle, double a1, double a2, double a3, double zm1, double zm2, double zm3)
Interpolate a value at given angle on circular arc given values (zm1, zm2, zm3) at three different an...
 
static double ccwAngle(double dy, double dx)
Returns the counter clockwise angle between a line with components dx, dy and the line with dx > 0 an...
 
static bool verticesAtDistance(const QgsAbstractGeometry &geometry, double distance, QgsVertexId &previousVertex, QgsVertexId &nextVertex)
Retrieves the vertices which are before and after the interpolated point at a specified distance alon...
 
static bool segmentIntersection(const QgsPoint &p1, const QgsPoint &p2, const QgsPoint &q1, const QgsPoint &q2, QgsPoint &intersectionPoint, bool &isIntersection, double tolerance=1e-8, bool acceptImproperIntersection=false)
Compute the intersection between two segments. 
 
static QVector< SelfIntersection > selfIntersections(const QgsAbstractGeometry *geom, int part, int ring, double tolerance)
Find self intersections in a polyline. 
 
static int segmentSide(const QgsPoint &pt1, const QgsPoint &pt3, const QgsPoint &pt2)
For line defined by points pt1 and pt3, find out on which side of the line is point pt3...
 
bool addZValue(double zValue=0) override
Adds a z-dimension to the geometry, initialized to a preset value. 
 
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...
 
void setZ(double z)
Sets the point's z-coordinate. 
 
static QPair< QgsWkbTypes::Type, QString > wktReadBlock(const QString &wkt)
Parses a WKT block of the format "TYPE( contents )" and returns a pair of geometry type to contents (...
 
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). 
 
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 double gradient(const QgsPoint &pt1, const QgsPoint &pt2)
Returns the gradient of a line defined by points pt1 and pt2. 
 
A class to represent a 2D point. 
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference) 
 
QgsWkbTypes::Type wkbType() const 
Returns the WKB type of the geometry. 
 
double sqrDist(double x, double y) const 
Returns the squared distance between this point a specified x, y coordinate. 
 
static QgsPoint segmentMidPointFromCenter(const QgsPoint &p1, const QgsPoint &p2, const QgsPoint ¢er, bool useShortestArc=true)
Calculates the midpoint on the circle passing through p1 and p2, with the specified center coordinate...
 
static QDomElement pointsToGML3(const QgsPointSequence &points, QDomDocument &doc, int precision, const QString &ns, bool is3D, QgsAbstractGeometry::AxisOrder axisOrder=QgsAbstractGeometry::AxisOrder::XY)
Returns a gml::posList DOM element. 
 
Curve polygon geometry type. 
 
static double linePerpendicularAngle(double x1, double y1, double x2, double y2)
Calculates the perpendicular angle to a line joining two points. 
 
double y() const 
Returns the vector's y-component. 
 
double length() const 
Returns the length of the vector. 
 
double z() const 
Returns Z coordinate. 
 
static Type parseType(const QString &wktStr)
Attempts to extract the WKB type from a WKT string. 
 
static bool segmentMidPoint(const QgsPoint &p1, const QgsPoint &p2, QgsPoint &result, double radius, const QgsPoint &mousePos)
Calculates midpoint on circle passing through p1 and p2, closest to the given coordinate mousePos...
 
static double circleLength(double x1, double y1, double x2, double y2, double x3, double y3)
Length of a circular string segment defined by pt1, pt2, pt3. 
 
SegmentationToleranceType
Segmentation tolerance as maximum angle or maximum difference between approximation and circle...
 
static QgsPoint closestVertex(const QgsAbstractGeometry &geom, const QgsPoint &pt, QgsVertexId &id)
Returns the closest vertex to a geometry for a specified point. 
 
virtual bool nextVertex(QgsVertexId &id, QgsPoint &vertex) const =0
Returns next vertex id and coordinates. 
 
static bool hasZ(Type type)
Tests whether a WKB type contains the z-dimension. 
 
static int circleCircleOuterTangents(const QgsPointXY ¢er1, double radius1, const QgsPointXY ¢er2, double radius2, QgsPointXY &line1P1, QgsPointXY &line1P2, QgsPointXY &line2P1, QgsPointXY &line2P2)
Calculates the outer tangent points for two circles, centered at center1 and center2 and with radii o...
 
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) 
 
static QStringList wktGetChildBlocks(const QString &wkt, const QString &defaultType=QString())
Parses a WKT string and returns of list of blocks contained in the WKT. 
 
void set(double x, double y, double z)
Sets vector coordinates. 
 
static double dotProduct(const QgsVector3D &v1, const QgsVector3D &v2)
Returns the dot product of two vectors. 
 
static QgsVector3D crossProduct(const QgsVector3D &v1, const QgsVector3D &v2)
Returns the cross product of two vectors. 
 
static QDomElement pointsToGML2(const QgsPointSequence &points, QDomDocument &doc, int precision, const QString &ns, QgsAbstractGeometry::AxisOrder axisOrder=QgsAbstractGeometry::AxisOrder::XY)
Returns a gml::coordinates DOM element. 
 
void normalize()
Normalizes the current vector in place. 
 
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
 
static bool circleClockwise(double angle1, double angle2, double angle3)
Returns true if the circle defined by three angles is ordered clockwise. 
 
static QString pointsToWKT(const QgsPointSequence &points, int precision, bool is3D, bool isMeasure)
Returns a WKT coordinate list. 
 
Type
The WKB type describes the number of dimensions a geometry has. 
 
bool isMeasure() const 
Returns true if the geometry contains m values. 
 
double x() const 
Returns X coordinate. 
 
virtual double closestSegment(const QgsPoint &pt, QgsPoint &segmentPt, QgsVertexId &vertexAfter, int *leftOf=nullptr, double epsilon=4 *std::numeric_limits< double >::epsilon()) const =0
Searches for the closest segment of the geometry to a given point. 
 
static bool setZValueFromPoints(const QgsPointSequence &points, QgsPoint &point)
A Z dimension is added to point if one of the point in the list points is in 3D. 
 
virtual double segmentLength(QgsVertexId startVertex) const =0
Returns the length of the segment of the geometry which begins at startVertex. 
 
static Type addM(Type type)
Adds the m dimension to a WKB type and returns the new type. 
 
void addVertex(const QgsPoint &pt)
Adds a new vertex to the end of the line string. 
 
Utility class for identifying a unique vertex within a geometry. 
 
const double DEFAULT_SEGMENT_EPSILON
Default snapping tolerance for segments. 
 
static QgsPoint midpoint(const QgsPoint &pt1, const QgsPoint &pt2)
Returns a middle point between points pt1 and pt2. 
 
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double. 
 
static Type addZ(Type type)
Adds the z dimension to a WKB type and returns the new type. 
 
static double circleTangentDirection(const QgsPoint &tangentPoint, const QgsPoint &cp1, const QgsPoint &cp2, const QgsPoint &cp3)
Calculates the direction angle of a circle tangent (clockwise from north in radians) ...
 
static bool angleOnCircle(double angle, double angle1, double angle2, double angle3)
Returns true if an angle is between angle1 and angle3 on a circle described by angle1, angle2 and angle3. 
 
Abstract base class for curved geometry type. 
 
static bool linesIntersection3D(const QgsVector3D &La1, const QgsVector3D &La2, const QgsVector3D &Lb1, const QgsVector3D &Lb2, QgsVector3D &intersection)
An algorithm to calculate an (approximate) intersection of two lines in 3D. 
 
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). 
 
Abstract base class for all geometries. 
 
static QVector< QgsLineString * > extractLineStrings(const QgsAbstractGeometry *geom)
Returns list of linestrings extracted from the passed geometry. 
 
static double normalizedAngle(double angle)
Ensures that an angle is in the range 0 <= angle < 2 pi. 
 
Point geometry type, with support for z-dimension and m-values. 
 
double y() const 
Returns Y coordinate. 
 
AxisOrder
Axis order for GML generation. 
 
static bool lineIntersection(const QgsPoint &p1, QgsVector v1, const QgsPoint &p2, QgsVector v2, QgsPoint &intersection)
Computes the intersection between two lines. 
 
A class to represent a vector. 
 
double length() const 
Returns the length of the vector. 
 
static bool skewLinesProjection(const QgsVector3D &P1, const QgsVector3D &P12, const QgsVector3D &P2, const QgsVector3D &P22, QgsVector3D &X1, double epsilon=0.0001)
A method to project one skew line onto another. 
 
double distance(double x, double y) const 
Returns the distance between this point and a specified x, y coordinate. 
 
virtual double length() const 
Returns the length of the geometry. 
 
QVector< QgsPoint > QgsPointSequence
 
static QgsPoint pointOnLineWithDistance(const QgsPoint &startPoint, const QgsPoint &directionPoint, double distance)
Returns a point a specified distance toward a second point. 
 
static double sqrDistance2D(const QgsPoint &pt1, const QgsPoint &pt2)
Returns the squared 2D distance between two points. 
 
static double sweepAngle(double centerX, double centerY, double x1, double y1, double x2, double y2, double x3, double y3)
Calculates angle of a circular string part defined by pt1, pt2, pt3. 
 
static QgsLineString perpendicularSegment(const QgsPoint &p, const QgsPoint &s1, const QgsPoint &s2)
Create a perpendicular line segment from p to segment [s1, s2]. 
 
static QgsPointSequence pointsFromWKT(const QString &wktCoordinateList, bool is3D, bool isMeasure)
Returns a list of points contained in a WKT string. 
 
Line string geometry type, with support for z-dimension and m-values. 
 
static QgsPoint interpolatePointOnArc(const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3, double distance)
Interpolates a point on an arc defined by three points, pt1, pt2 and pt3. 
 
virtual int vertexCount(int part=0, int ring=0) const =0
Returns the number of vertices of which this geometry is built. 
 
static int leftOfLine(double x, double y, double x1, double y1, double x2, double y2)
Returns a value < 0 if the point (x, y) is left of the line from (x1, y1) -> ( x2, y2). 
 
static bool tangentPointAndCircle(const QgsPointXY ¢er, double radius, const QgsPointXY &p, QgsPointXY &pt1, QgsPointXY &pt2)
Calculates the tangent points between the circle with the specified center and radius and the point p...
 
static void circleCenterRadius(const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3, double &radius, double ¢erX, double ¢erY)
Returns radius and center of the circle through pt1, pt2, pt3. 
 
bool is3D() const 
Returns true if the geometry is 3D and contains a z-value. 
 
bool convertTo(QgsWkbTypes::Type type) override
Converts the geometry to a specified type. 
 
bool addMValue(double mValue=0) override
Adds a measure to the geometry, initialized to a preset value. 
 
static void pointsToWKB(QgsWkbPtr &wkb, const QgsPointSequence &points, bool is3D, bool isMeasure)
Returns a LinearRing { uint32 numPoints; Point points[numPoints]; }. 
 
static int circleCircleIntersections(QgsPointXY center1, double radius1, QgsPointXY center2, double radius2, QgsPointXY &intersection1, QgsPointXY &intersection2)
Calculates the intersections points between the circle with center center1 and radius radius1 and the...
 
static double sqrDistToLine(double ptX, double ptY, double x1, double y1, double x2, double y2, double &minDistX, double &minDistY, double epsilon)
Returns the squared distance between a point and a line. 
 
static bool hasM(Type type)
Tests whether a WKB type contains m values. 
 
bool isValid() const 
Returns true if the vertex id is valid. 
 
static QgsPoint closestPoint(const QgsAbstractGeometry &geometry, const QgsPoint &point)
Returns the nearest point on a segment of a geometry for the specified point. 
 
double x() const 
Returns the vector's x-component. 
 
virtual QgsPoint vertexAt(QgsVertexId id) const =0
Returns the point corresponding to a specified vertex id. 
 
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...
 
static double distanceToVertex(const QgsAbstractGeometry &geom, QgsVertexId id)
Returns the distance along a geometry from its first vertex to the specified vertex. 
 
static QgsPointXY interpolatePointOnLineByValue(double x1, double y1, double v1, double x2, double y2, double v2, double value)
Interpolates the position of a point along the line from (x1, y1) to (x2, y2). 
 
static void segmentizeArc(const QgsPoint &p1, const QgsPoint &p2, const QgsPoint &p3, QgsPointSequence &points, double tolerance=M_PI_2/90, QgsAbstractGeometry::SegmentationToleranceType toleranceType=QgsAbstractGeometry::MaximumAngle, bool hasZ=false, bool hasM=false)
Convert circular arc defined by p1, p2, p3 (p1/p3 being start resp. 
 
static void coefficients(const QgsPoint &pt1, const QgsPoint &pt2, double &a, double &b, double &c)
Returns the coefficients (a, b, c for equation "ax + by + c = 0") of a line defined by points pt1 and...