@@ -1409,6 +1409,61 @@ double QgsGeometry::lineLocatePoint( const QgsGeometry& point ) const
1409
1409
return geos.lineLocatePoint ( *( static_cast < QgsPointV2* >( point.d ->geometry ) ) );
1410
1410
}
1411
1411
1412
+ double QgsGeometry::interpolateAngle ( double distance ) const
1413
+ {
1414
+ if ( !d->geometry )
1415
+ return 0.0 ;
1416
+
1417
+ // always operate on segmentized geometries
1418
+ QgsGeometry segmentized = *this ;
1419
+ if ( QgsWKBTypes::isCurvedType ( d->geometry ->wkbType () ) )
1420
+ {
1421
+ segmentized = QgsGeometry ( static_cast < QgsCurveV2* >( d->geometry )->segmentize () );
1422
+ }
1423
+
1424
+ QgsVertexId previous;
1425
+ QgsVertexId next;
1426
+ if ( !QgsGeometryUtils::verticesAtDistance ( *segmentized.geometry (), distance, previous, next ) )
1427
+ return 0.0 ;
1428
+
1429
+ if ( previous == next )
1430
+ {
1431
+ // distance coincided exactly with a vertex
1432
+ QgsVertexId v2 = previous;
1433
+ QgsVertexId v1;
1434
+ QgsVertexId v3;
1435
+ QgsGeometryUtils::adjacentVertices ( *segmentized.geometry (), v2, v1, v3 );
1436
+ if ( v1.isValid () && v3.isValid () )
1437
+ {
1438
+ QgsPointV2 p1 = segmentized.geometry ()->vertexAt ( v1 );
1439
+ QgsPointV2 p2 = segmentized.geometry ()->vertexAt ( v2 );
1440
+ QgsPointV2 p3 = segmentized.geometry ()->vertexAt ( v3 );
1441
+ double angle1 = QgsGeometryUtils::lineAngle ( p1.x (), p1.y (), p2.x (), p2.y () );
1442
+ double angle2 = QgsGeometryUtils::lineAngle ( p2.x (), p2.y (), p3.x (), p3.y () );
1443
+ return QgsGeometryUtils::averageAngle ( angle1, angle2 );
1444
+ }
1445
+ else if ( v3.isValid () )
1446
+ {
1447
+ QgsPointV2 p1 = segmentized.geometry ()->vertexAt ( v2 );
1448
+ QgsPointV2 p2 = segmentized.geometry ()->vertexAt ( v3 );
1449
+ return QgsGeometryUtils::lineAngle ( p1.x (), p1.y (), p2.x (), p2.y () );
1450
+ }
1451
+ else
1452
+ {
1453
+ QgsPointV2 p1 = segmentized.geometry ()->vertexAt ( v1 );
1454
+ QgsPointV2 p2 = segmentized.geometry ()->vertexAt ( v2 );
1455
+ return QgsGeometryUtils::lineAngle ( p1.x (), p1.y (), p2.x (), p2.y () );
1456
+ }
1457
+ }
1458
+ else
1459
+ {
1460
+ QgsPointV2 p1 = segmentized.geometry ()->vertexAt ( previous );
1461
+ QgsPointV2 p2 = segmentized.geometry ()->vertexAt ( next );
1462
+ return QgsGeometryUtils::lineAngle ( p1.x (), p1.y (), p2.x (), p2.y () );
1463
+ }
1464
+ }
1465
+
1466
+
1412
1467
QgsGeometry* QgsGeometry::intersection ( const QgsGeometry* geometry ) const
1413
1468
{
1414
1469
if ( !d->geometry || !geometry->d ->geometry )
0 commit comments