Skip to content

Commit e7b08d5

Browse files
committedSep 21, 2017
Expand geometry test coverage
1 parent c77afed commit e7b08d5

File tree

3 files changed

+227
-13
lines changed

3 files changed

+227
-13
lines changed
 

‎python/core/geometry/qgspolygon.sip

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,10 @@ class QgsPolygonV2: QgsCurvePolygon
2828

2929
virtual void clear();
3030

31-
3231
virtual bool fromWkb( QgsConstWkbPtr &wkb );
3332

34-
35-
3633
virtual QByteArray asWkb() const;
3734

38-
3935
virtual QgsPolygonV2 *surfaceToPolygon() const /Factory/;
4036

4137

‎src/core/geometry/qgspolygon.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,8 @@ class CORE_EXPORT QgsPolygonV2: public QgsCurvePolygon
3535
QString geometryType() const override;
3636
QgsPolygonV2 *clone() const override SIP_FACTORY;
3737
void clear() override;
38-
3938
bool fromWkb( QgsConstWkbPtr &wkb ) override;
40-
41-
// inherited: bool fromWkt( const QString &wkt );
42-
4339
QByteArray asWkb() const override;
44-
// inherited: QString asWkt( int precision = 17 ) const;
45-
// inherited: QDomElement asGML2( QDomDocument& doc, int precision = 17, const QString& ns = "gml" ) const;
46-
// inherited: QDomElement asGML3( QDomDocument& doc, int precision = 17, const QString& ns = "gml" ) const;
47-
// inherited: QString asJSON( int precision = 17 ) const;
48-
4940
QgsPolygonV2 *surfaceToPolygon() const override SIP_FACTORY;
5041

5142
/** Returns the geometry converted to the more generic curve type QgsCurvePolygon

‎tests/src/core/testqgsgeometry.cpp

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4436,6 +4436,9 @@ void TestQgsGeometry::polygon()
44364436
//surfaceToPolygon - should be identical given polygon has no curves
44374437
std::unique_ptr< QgsPolygonV2 > surface( p12.surfaceToPolygon() );
44384438
QCOMPARE( *surface, p12 );
4439+
//toPolygon - should be identical given polygon has no curves
4440+
std::unique_ptr< QgsPolygonV2 > toP( p12.toPolygon() );
4441+
QCOMPARE( *toP, p12 );
44394442

44404443
//toCurveType
44414444
std::unique_ptr< QgsCurvePolygon > curveType( p12.toCurveType() );
@@ -4788,6 +4791,230 @@ void TestQgsGeometry::polygon()
47884791
QVERIFY( QgsPolygonV2().cast( &pCast2 ) );
47894792
pCast2.fromWkt( QStringLiteral( "PolygonZM((0 0 0 1, 0 1 1 2, 1 0 2 3, 0 0 0 1))" ) );
47904793
QVERIFY( QgsPolygonV2().cast( &pCast2 ) );
4794+
4795+
//transform
4796+
//CRS transform
4797+
QgsCoordinateReferenceSystem sourceSrs;
4798+
sourceSrs.createFromSrid( 3994 );
4799+
QgsCoordinateReferenceSystem destSrs;
4800+
destSrs.createFromSrid( 4202 ); // want a transform with ellipsoid change
4801+
QgsCoordinateTransform tr( sourceSrs, destSrs );
4802+
4803+
// 2d CRS transform
4804+
QgsPolygonV2 pTransform;
4805+
QgsLineString l21;
4806+
l21.setPoints( QgsPointSequence() << QgsPoint( 6374985, -3626584 )
4807+
<< QgsPoint( 6274985, -3526584 )
4808+
<< QgsPoint( 6474985, -3526584 )
4809+
<< QgsPoint( 6374985, -3626584 ) );
4810+
pTransform.setExteriorRing( l21.clone() );
4811+
pTransform.addInteriorRing( l21.clone() );
4812+
pTransform.transform( tr, QgsCoordinateTransform::ForwardTransform );
4813+
const QgsLineString *extR = static_cast< const QgsLineString * >( pTransform.exteriorRing() );
4814+
QGSCOMPARENEAR( extR->pointN( 0 ).x(), 175.771, 0.001 );
4815+
QGSCOMPARENEAR( extR->pointN( 0 ).y(), -39.724, 0.001 );
4816+
QGSCOMPARENEAR( extR->pointN( 1 ).x(), 174.581448, 0.001 );
4817+
QGSCOMPARENEAR( extR->pointN( 1 ).y(), -38.7999, 0.001 );
4818+
QGSCOMPARENEAR( extR->pointN( 2 ).x(), 176.958633, 0.001 );
4819+
QGSCOMPARENEAR( extR->pointN( 2 ).y(), -38.7999, 0.001 );
4820+
QGSCOMPARENEAR( extR->pointN( 3 ).x(), 175.771, 0.001 );
4821+
QGSCOMPARENEAR( extR->pointN( 3 ).y(), -39.724, 0.001 );
4822+
QGSCOMPARENEAR( pTransform.exteriorRing()->boundingBox().xMinimum(), 174.581448, 0.001 );
4823+
QGSCOMPARENEAR( pTransform.exteriorRing()->boundingBox().yMinimum(), -39.724, 0.001 );
4824+
QGSCOMPARENEAR( pTransform.exteriorRing()->boundingBox().xMaximum(), 176.959, 0.001 );
4825+
QGSCOMPARENEAR( pTransform.exteriorRing()->boundingBox().yMaximum(), -38.7999, 0.001 );
4826+
const QgsLineString *intR = static_cast< const QgsLineString * >( pTransform.interiorRing( 0 ) );
4827+
QGSCOMPARENEAR( intR->pointN( 0 ).x(), 175.771, 0.001 );
4828+
QGSCOMPARENEAR( intR->pointN( 0 ).y(), -39.724, 0.001 );
4829+
QGSCOMPARENEAR( intR->pointN( 1 ).x(), 174.581448, 0.001 );
4830+
QGSCOMPARENEAR( intR->pointN( 1 ).y(), -38.7999, 0.001 );
4831+
QGSCOMPARENEAR( intR->pointN( 2 ).x(), 176.958633, 0.001 );
4832+
QGSCOMPARENEAR( intR->pointN( 2 ).y(), -38.7999, 0.001 );
4833+
QGSCOMPARENEAR( intR->pointN( 3 ).x(), 175.771, 0.001 );
4834+
QGSCOMPARENEAR( intR->pointN( 3 ).y(), -39.724, 0.001 );
4835+
QGSCOMPARENEAR( pTransform.interiorRing( 0 )->boundingBox().xMinimum(), 174.581448, 0.001 );
4836+
QGSCOMPARENEAR( pTransform.interiorRing( 0 )->boundingBox().yMinimum(), -39.724, 0.001 );
4837+
QGSCOMPARENEAR( pTransform.interiorRing( 0 )->boundingBox().xMaximum(), 176.959, 0.001 );
4838+
QGSCOMPARENEAR( pTransform.interiorRing( 0 )->boundingBox().yMaximum(), -38.7999, 0.001 );
4839+
4840+
//3d CRS transform
4841+
QgsLineString l22;
4842+
l22.setPoints( QgsPointSequence() << QgsPoint( QgsWkbTypes::PointZM, 6374985, -3626584, 1, 2 )
4843+
<< QgsPoint( QgsWkbTypes::PointZM, 6274985, -3526584, 3, 4 )
4844+
<< QgsPoint( QgsWkbTypes::PointZM, 6474985, -3526584, 5, 6 )
4845+
<< QgsPoint( QgsWkbTypes::PointZM, 6374985, -3626584, 1, 2 ) );
4846+
pTransform.clear();
4847+
pTransform.setExteriorRing( l22.clone() );
4848+
pTransform.addInteriorRing( l22.clone() );
4849+
pTransform.transform( tr, QgsCoordinateTransform::ForwardTransform );
4850+
extR = static_cast< const QgsLineString * >( pTransform.exteriorRing() );
4851+
QGSCOMPARENEAR( extR->pointN( 0 ).x(), 175.771, 0.001 );
4852+
QGSCOMPARENEAR( extR->pointN( 0 ).y(), -39.724, 0.001 );
4853+
QGSCOMPARENEAR( extR->pointN( 0 ).z(), 1.0, 0.001 );
4854+
QGSCOMPARENEAR( extR->pointN( 0 ).m(), 2.0, 0.001 );
4855+
QGSCOMPARENEAR( extR->pointN( 1 ).x(), 174.581448, 0.001 );
4856+
QGSCOMPARENEAR( extR->pointN( 1 ).y(), -38.7999, 0.001 );
4857+
QGSCOMPARENEAR( extR->pointN( 1 ).z(), 3.0, 0.001 );
4858+
QGSCOMPARENEAR( extR->pointN( 1 ).m(), 4.0, 0.001 );
4859+
QGSCOMPARENEAR( extR->pointN( 2 ).x(), 176.958633, 0.001 );
4860+
QGSCOMPARENEAR( extR->pointN( 2 ).y(), -38.7999, 0.001 );
4861+
QGSCOMPARENEAR( extR->pointN( 2 ).z(), 5.0, 0.001 );
4862+
QGSCOMPARENEAR( extR->pointN( 2 ).m(), 6.0, 0.001 );
4863+
QGSCOMPARENEAR( extR->pointN( 3 ).x(), 175.771, 0.001 );
4864+
QGSCOMPARENEAR( extR->pointN( 3 ).y(), -39.724, 0.001 );
4865+
QGSCOMPARENEAR( extR->pointN( 3 ).z(), 1.0, 0.001 );
4866+
QGSCOMPARENEAR( extR->pointN( 3 ).m(), 2.0, 0.001 );
4867+
QGSCOMPARENEAR( pTransform.exteriorRing()->boundingBox().xMinimum(), 174.581448, 0.001 );
4868+
QGSCOMPARENEAR( pTransform.exteriorRing()->boundingBox().yMinimum(), -39.724, 0.001 );
4869+
QGSCOMPARENEAR( pTransform.exteriorRing()->boundingBox().xMaximum(), 176.959, 0.001 );
4870+
QGSCOMPARENEAR( pTransform.exteriorRing()->boundingBox().yMaximum(), -38.7999, 0.001 );
4871+
intR = static_cast< const QgsLineString * >( pTransform.interiorRing( 0 ) );
4872+
QGSCOMPARENEAR( intR->pointN( 0 ).x(), 175.771, 0.001 );
4873+
QGSCOMPARENEAR( intR->pointN( 0 ).y(), -39.724, 0.001 );
4874+
QGSCOMPARENEAR( intR->pointN( 0 ).z(), 1.0, 0.001 );
4875+
QGSCOMPARENEAR( intR->pointN( 0 ).m(), 2.0, 0.001 );
4876+
QGSCOMPARENEAR( intR->pointN( 1 ).x(), 174.581448, 0.001 );
4877+
QGSCOMPARENEAR( intR->pointN( 1 ).y(), -38.7999, 0.001 );
4878+
QGSCOMPARENEAR( intR->pointN( 1 ).z(), 3.0, 0.001 );
4879+
QGSCOMPARENEAR( intR->pointN( 1 ).m(), 4.0, 0.001 );
4880+
QGSCOMPARENEAR( intR->pointN( 2 ).x(), 176.958633, 0.001 );
4881+
QGSCOMPARENEAR( intR->pointN( 2 ).y(), -38.7999, 0.001 );
4882+
QGSCOMPARENEAR( intR->pointN( 2 ).z(), 5.0, 0.001 );
4883+
QGSCOMPARENEAR( intR->pointN( 2 ).m(), 6.0, 0.001 );
4884+
QGSCOMPARENEAR( intR->pointN( 3 ).x(), 175.771, 0.001 );
4885+
QGSCOMPARENEAR( intR->pointN( 3 ).y(), -39.724, 0.001 );
4886+
QGSCOMPARENEAR( intR->pointN( 3 ).z(), 1.0, 0.001 );
4887+
QGSCOMPARENEAR( intR->pointN( 3 ).m(), 2.0, 0.001 );
4888+
QGSCOMPARENEAR( pTransform.interiorRing( 0 )->boundingBox().xMinimum(), 174.581448, 0.001 );
4889+
QGSCOMPARENEAR( pTransform.interiorRing( 0 )->boundingBox().yMinimum(), -39.724, 0.001 );
4890+
QGSCOMPARENEAR( pTransform.interiorRing( 0 )->boundingBox().xMaximum(), 176.959, 0.001 );
4891+
QGSCOMPARENEAR( pTransform.interiorRing( 0 )->boundingBox().yMaximum(), -38.7999, 0.001 );
4892+
4893+
//reverse transform
4894+
pTransform.transform( tr, QgsCoordinateTransform::ReverseTransform );
4895+
extR = static_cast< const QgsLineString * >( pTransform.exteriorRing() );
4896+
QGSCOMPARENEAR( extR->pointN( 0 ).x(), 6374984, 100 );
4897+
QGSCOMPARENEAR( extR->pointN( 0 ).y(), -3626584, 100 );
4898+
QGSCOMPARENEAR( extR->pointN( 0 ).z(), 1.0, 0.001 );
4899+
QGSCOMPARENEAR( extR->pointN( 0 ).m(), 2.0, 0.001 );
4900+
QGSCOMPARENEAR( extR->pointN( 1 ).x(), 6274984, 100 );
4901+
QGSCOMPARENEAR( extR->pointN( 1 ).y(), -3526584, 100 );
4902+
QGSCOMPARENEAR( extR->pointN( 1 ).z(), 3.0, 0.001 );
4903+
QGSCOMPARENEAR( extR->pointN( 1 ).m(), 4.0, 0.001 );
4904+
QGSCOMPARENEAR( extR->pointN( 2 ).x(), 6474984, 100 );
4905+
QGSCOMPARENEAR( extR->pointN( 2 ).y(), -3526584, 100 );
4906+
QGSCOMPARENEAR( extR->pointN( 2 ).z(), 5.0, 0.001 );
4907+
QGSCOMPARENEAR( extR->pointN( 2 ).m(), 6.0, 0.001 );
4908+
QGSCOMPARENEAR( extR->pointN( 3 ).x(), 6374984, 100 );
4909+
QGSCOMPARENEAR( extR->pointN( 3 ).y(), -3626584, 100 );
4910+
QGSCOMPARENEAR( extR->pointN( 3 ).z(), 1.0, 0.001 );
4911+
QGSCOMPARENEAR( extR->pointN( 3 ).m(), 2.0, 0.001 );
4912+
QGSCOMPARENEAR( pTransform.exteriorRing()->boundingBox().xMinimum(), 6274984, 100 );
4913+
QGSCOMPARENEAR( pTransform.exteriorRing()->boundingBox().yMinimum(), -3626584, 100 );
4914+
QGSCOMPARENEAR( pTransform.exteriorRing()->boundingBox().xMaximum(), 6474984, 100 );
4915+
QGSCOMPARENEAR( pTransform.exteriorRing()->boundingBox().yMaximum(), -3526584, 100 );
4916+
intR = static_cast< const QgsLineString * >( pTransform.interiorRing( 0 ) );
4917+
QGSCOMPARENEAR( intR->pointN( 0 ).x(), 6374984, 100 );
4918+
QGSCOMPARENEAR( intR->pointN( 0 ).y(), -3626584, 100 );
4919+
QGSCOMPARENEAR( intR->pointN( 0 ).z(), 1.0, 0.001 );
4920+
QGSCOMPARENEAR( intR->pointN( 0 ).m(), 2.0, 0.001 );
4921+
QGSCOMPARENEAR( intR->pointN( 1 ).x(), 6274984, 100 );
4922+
QGSCOMPARENEAR( intR->pointN( 1 ).y(), -3526584, 100 );
4923+
QGSCOMPARENEAR( intR->pointN( 1 ).z(), 3.0, 0.001 );
4924+
QGSCOMPARENEAR( intR->pointN( 1 ).m(), 4.0, 0.001 );
4925+
QGSCOMPARENEAR( intR->pointN( 2 ).x(), 6474984, 100 );
4926+
QGSCOMPARENEAR( intR->pointN( 2 ).y(), -3526584, 100 );
4927+
QGSCOMPARENEAR( intR->pointN( 2 ).z(), 5.0, 0.001 );
4928+
QGSCOMPARENEAR( intR->pointN( 2 ).m(), 6.0, 0.001 );
4929+
QGSCOMPARENEAR( intR->pointN( 3 ).x(), 6374984, 100 );
4930+
QGSCOMPARENEAR( intR->pointN( 3 ).y(), -3626584, 100 );
4931+
QGSCOMPARENEAR( intR->pointN( 3 ).z(), 1.0, 0.001 );
4932+
QGSCOMPARENEAR( intR->pointN( 3 ).m(), 2.0, 0.001 );
4933+
QGSCOMPARENEAR( intR->boundingBox().xMinimum(), 6274984, 100 );
4934+
QGSCOMPARENEAR( intR->boundingBox().yMinimum(), -3626584, 100 );
4935+
QGSCOMPARENEAR( intR->boundingBox().xMaximum(), 6474984, 100 );
4936+
QGSCOMPARENEAR( intR->boundingBox().yMaximum(), -3526584, 100 );
4937+
4938+
//z value transform
4939+
pTransform.transform( tr, QgsCoordinateTransform::ForwardTransform, true );
4940+
extR = static_cast< const QgsLineString * >( pTransform.exteriorRing() );
4941+
QGSCOMPARENEAR( extR->pointN( 0 ).z(), -19.249066, 0.001 );
4942+
QGSCOMPARENEAR( extR->pointN( 1 ).z(), -19.148357, 0.001 );
4943+
QGSCOMPARENEAR( extR->pointN( 2 ).z(), -19.092128, 0.001 );
4944+
QGSCOMPARENEAR( extR->pointN( 3 ).z(), -19.249066, 0.001 );
4945+
intR = static_cast< const QgsLineString * >( pTransform.interiorRing( 0 ) );
4946+
QGSCOMPARENEAR( intR->pointN( 0 ).z(), -19.249066, 0.001 );
4947+
QGSCOMPARENEAR( intR->pointN( 1 ).z(), -19.148357, 0.001 );
4948+
QGSCOMPARENEAR( intR->pointN( 2 ).z(), -19.092128, 0.001 );
4949+
QGSCOMPARENEAR( intR->pointN( 3 ).z(), -19.249066, 0.001 );
4950+
pTransform.transform( tr, QgsCoordinateTransform::ReverseTransform, true );
4951+
extR = static_cast< const QgsLineString * >( pTransform.exteriorRing() );
4952+
QGSCOMPARENEAR( extR->pointN( 0 ).z(), 1, 0.001 );
4953+
QGSCOMPARENEAR( extR->pointN( 1 ).z(), 3, 0.001 );
4954+
QGSCOMPARENEAR( extR->pointN( 2 ).z(), 5, 0.001 );
4955+
QGSCOMPARENEAR( extR->pointN( 3 ).z(), 1, 0.001 );
4956+
intR = static_cast< const QgsLineString * >( pTransform.interiorRing( 0 ) );
4957+
QGSCOMPARENEAR( intR->pointN( 0 ).z(), 1, 0.001 );
4958+
QGSCOMPARENEAR( intR->pointN( 1 ).z(), 3, 0.001 );
4959+
QGSCOMPARENEAR( intR->pointN( 2 ).z(), 5, 0.001 );
4960+
QGSCOMPARENEAR( intR->pointN( 3 ).z(), 1, 0.001 );
4961+
4962+
//QTransform transform
4963+
QTransform qtr = QTransform::fromScale( 2, 3 );
4964+
QgsLineString l23;
4965+
l23.setPoints( QgsPointSequence() << QgsPoint( QgsWkbTypes::PointZM, 1, 2, 3, 4 )
4966+
<< QgsPoint( QgsWkbTypes::PointZM, 11, 12, 13, 14 )
4967+
<< QgsPoint( QgsWkbTypes::PointZM, 1, 12, 23, 24 )
4968+
<< QgsPoint( QgsWkbTypes::PointZM, 1, 2, 3, 4 ) );
4969+
QgsPolygonV2 pTransform2;
4970+
pTransform2.setExteriorRing( l23.clone() );
4971+
pTransform2.addInteriorRing( l23.clone() );
4972+
pTransform2.transform( qtr );
4973+
4974+
extR = static_cast< const QgsLineString * >( pTransform2.exteriorRing() );
4975+
QGSCOMPARENEAR( extR->pointN( 0 ).x(), 2, 100 );
4976+
QGSCOMPARENEAR( extR->pointN( 0 ).y(), 6, 100 );
4977+
QGSCOMPARENEAR( extR->pointN( 0 ).z(), 3.0, 0.001 );
4978+
QGSCOMPARENEAR( extR->pointN( 0 ).m(), 4.0, 0.001 );
4979+
QGSCOMPARENEAR( extR->pointN( 1 ).x(), 22, 100 );
4980+
QGSCOMPARENEAR( extR->pointN( 1 ).y(), 36, 100 );
4981+
QGSCOMPARENEAR( extR->pointN( 1 ).z(), 13.0, 0.001 );
4982+
QGSCOMPARENEAR( extR->pointN( 1 ).m(), 14.0, 0.001 );
4983+
QGSCOMPARENEAR( extR->pointN( 2 ).x(), 2, 100 );
4984+
QGSCOMPARENEAR( extR->pointN( 2 ).y(), 36, 100 );
4985+
QGSCOMPARENEAR( extR->pointN( 2 ).z(), 23.0, 0.001 );
4986+
QGSCOMPARENEAR( extR->pointN( 2 ).m(), 24.0, 0.001 );
4987+
QGSCOMPARENEAR( extR->pointN( 3 ).x(), 2, 100 );
4988+
QGSCOMPARENEAR( extR->pointN( 3 ).y(), 6, 100 );
4989+
QGSCOMPARENEAR( extR->pointN( 3 ).z(), 3.0, 0.001 );
4990+
QGSCOMPARENEAR( extR->pointN( 3 ).m(), 4.0, 0.001 );
4991+
QGSCOMPARENEAR( pTransform2.exteriorRing()->boundingBox().xMinimum(), 2, 0.001 );
4992+
QGSCOMPARENEAR( pTransform2.exteriorRing()->boundingBox().yMinimum(), 6, 0.001 );
4993+
QGSCOMPARENEAR( pTransform2.exteriorRing()->boundingBox().xMaximum(), 22, 0.001 );
4994+
QGSCOMPARENEAR( pTransform2.exteriorRing()->boundingBox().yMaximum(), 36, 0.001 );
4995+
intR = static_cast< const QgsLineString * >( pTransform2.interiorRing( 0 ) );
4996+
QGSCOMPARENEAR( intR->pointN( 0 ).x(), 2, 100 );
4997+
QGSCOMPARENEAR( intR->pointN( 0 ).y(), 6, 100 );
4998+
QGSCOMPARENEAR( intR->pointN( 0 ).z(), 3.0, 0.001 );
4999+
QGSCOMPARENEAR( intR->pointN( 0 ).m(), 4.0, 0.001 );
5000+
QGSCOMPARENEAR( intR->pointN( 1 ).x(), 22, 100 );
5001+
QGSCOMPARENEAR( intR->pointN( 1 ).y(), 36, 100 );
5002+
QGSCOMPARENEAR( intR->pointN( 1 ).z(), 13.0, 0.001 );
5003+
QGSCOMPARENEAR( intR->pointN( 1 ).m(), 14.0, 0.001 );
5004+
QGSCOMPARENEAR( intR->pointN( 2 ).x(), 2, 100 );
5005+
QGSCOMPARENEAR( intR->pointN( 2 ).y(), 36, 100 );
5006+
QGSCOMPARENEAR( intR->pointN( 2 ).z(), 23.0, 0.001 );
5007+
QGSCOMPARENEAR( intR->pointN( 2 ).m(), 24.0, 0.001 );
5008+
QGSCOMPARENEAR( intR->pointN( 3 ).x(), 2, 100 );
5009+
QGSCOMPARENEAR( intR->pointN( 3 ).y(), 6, 100 );
5010+
QGSCOMPARENEAR( intR->pointN( 3 ).z(), 3.0, 0.001 );
5011+
QGSCOMPARENEAR( intR->pointN( 3 ).m(), 4.0, 0.001 );
5012+
QGSCOMPARENEAR( intR->boundingBox().xMinimum(), 2, 0.001 );
5013+
QGSCOMPARENEAR( intR->boundingBox().yMinimum(), 6, 0.001 );
5014+
QGSCOMPARENEAR( intR->boundingBox().xMaximum(), 22, 0.001 );
5015+
QGSCOMPARENEAR( intR->boundingBox().yMaximum(), 36, 0.001 );
5016+
5017+
47915018
}
47925019

47935020
void TestQgsGeometry::triangle()

0 commit comments

Comments
 (0)
Please sign in to comment.