Skip to content

Commit 41a9631

Browse files
committed
Make QgsGeometry::interpolate handle polygon geometries
(cherry-picked from 9a9a49c)
1 parent a2d4bbe commit 41a9631

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

src/core/geometry/qgsgeometry.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -1382,7 +1382,12 @@ QgsGeometry* QgsGeometry::interpolate( double distance ) const
13821382
{
13831383
return nullptr;
13841384
}
1385-
QgsGeos geos( d->geometry );
1385+
1386+
QgsGeometry line = *this;
1387+
if ( type() == QGis::Polygon )
1388+
line = QgsGeometry( d->geometry->boundary() );
1389+
1390+
QgsGeos geos( line.geometry() );
13861391
QgsAbstractGeometryV2* result = geos.interpolate( distance );
13871392
if ( !result )
13881393
{

tests/src/python/test_qgsgeometry.py

+26
Original file line numberDiff line numberDiff line change
@@ -3456,5 +3456,31 @@ def testInterpolateAngle(self):
34563456
geom = QgsGeometry.fromWkt('CircularString (1 5, 6 2, 7 3)')
34573457
self.assertAlmostEqual(geom.interpolateAngle(5), 1.69120, places=3)
34583458

3459+
def testInterpolate(self):
3460+
""" test QgsGeometry.interpolate() """
3461+
3462+
empty = QgsGeometry()
3463+
# just test no crash
3464+
self.assertFalse(empty.interpolate(5))
3465+
3466+
# not a linestring
3467+
point = QgsGeometry.fromWkt('Point(1 2)')
3468+
# no meaning, just test no crash!
3469+
self.assertFalse(empty.interpolate(5))
3470+
3471+
# linestring
3472+
linestring = QgsGeometry.fromWkt('LineString(0 0, 10 0, 10 10)')
3473+
exp = 'Point(5 0)'
3474+
result = linestring.interpolate(5).exportToWkt()
3475+
self.assertTrue(compareWkt(result, exp, 0.00001), "Interpolate: mismatch Expected:\n{}\nGot:\n{}\n".format(exp, result))
3476+
3477+
# polygon
3478+
polygon = QgsGeometry.fromWkt('Polygon((0 0, 10 0, 10 10, 20 20, 10 20, 0 0))')
3479+
exp = 'Point(10 5)'
3480+
result = linestring.interpolate(15).exportToWkt()
3481+
self.assertTrue(compareWkt(result, exp, 0.00001),
3482+
"Interpolate: mismatch Expected:\n{}\nGot:\n{}\n".format(exp, result))
3483+
3484+
34593485
if __name__ == '__main__':
34603486
unittest.main()

0 commit comments

Comments
 (0)