Skip to content

Commit 0d89504

Browse files
committed
ADD GML export to QgsTriangle
1 parent a48c2e8 commit 0d89504

File tree

4 files changed

+74
-2
lines changed

4 files changed

+74
-2
lines changed

python/core/geometry/qgstriangle.sip

+8
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,14 @@ class QgsTriangle : QgsPolygonV2
6868
virtual bool fromWkt( const QString &wkt );
6969

7070

71+
QDomElement asGML2( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
72+
%Docstring
73+
:rtype: QDomElement
74+
%End
75+
QDomElement asGML3( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
76+
%Docstring
77+
:rtype: QDomElement
78+
%End
7179

7280
virtual QgsPolygonV2 *surfaceToPolygon() const /Factory/;
7381

src/core/geometry/qgstriangle.cpp

+38
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,44 @@ bool QgsTriangle::fromWkt( const QString &wkt )
224224
return true;
225225
}
226226

227+
QDomElement QgsTriangle::asGML2( QDomDocument &doc, int precision, const QString &ns ) const
228+
{
229+
if ( !isEmpty() ) /* else crash */
230+
return QgsPolygonV2::asGML2( doc, precision, ns );
231+
232+
return QDomElement(); /* Crash: "QgsPolygonV2().asGML2( doc, precision, ns )"*/
233+
}
234+
235+
QDomElement QgsTriangle::asGML3( QDomDocument &doc, int precision, const QString &ns ) const
236+
{
237+
if ( isEmpty() ) /* else crash */
238+
return QDomElement();
239+
240+
QDomElement elemCurveTriangle = doc.createElementNS( ns, QStringLiteral( "Triangle" ) );
241+
QDomElement elemExterior = doc.createElementNS( ns, QStringLiteral( "exterior" ) );
242+
QDomElement curveElem = exteriorRing()->asGML3( doc, precision, ns );
243+
if ( curveElem.tagName() == QLatin1String( "LineString" ) )
244+
{
245+
curveElem.setTagName( QStringLiteral( "LinearRing" ) );
246+
}
247+
elemExterior.appendChild( curveElem );
248+
elemCurveTriangle.appendChild( elemExterior );
249+
250+
/* No interior ring for triangle
251+
for ( int i = 0, n = numInteriorRings(); i < n; ++i )
252+
{
253+
QDomElement elemInterior = doc.createElementNS( ns, QStringLiteral( "interior" ) );
254+
QDomElement innerRing = interiorRing( i )->asGML3( doc, precision, ns );
255+
if ( innerRing.tagName() == QLatin1String( "LineString" ) )
256+
{
257+
innerRing.setTagName( QStringLiteral( "LinearRing" ) );
258+
}
259+
elemInterior.appendChild( innerRing );
260+
elemCurveTriangle.appendChild( elemInterior );
261+
}*/
262+
return elemCurveTriangle;
263+
}
264+
227265
QgsPolygonV2 *QgsTriangle::surfaceToPolygon() const
228266
{
229267
return toPolygon();

src/core/geometry/qgstriangle.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ class CORE_EXPORT QgsTriangle : public QgsPolygonV2
7474
bool fromWkt( const QString &wkt ) override;
7575

7676
// inherited: QString asWkt( int precision = 17 ) const;
77-
// inherited: QDomElement asGML2( QDomDocument& doc, int precision = 17, const QString& ns = "gml" ) const;
78-
// inherited: QDomElement asGML3( QDomDocument& doc, int precision = 17, const QString& ns = "gml" ) const;
77+
QDomElement asGML2( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
78+
QDomElement asGML3( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
7979
// inherited: QString asJSON( int precision = 17 ) const;
8080

8181
QgsPolygonV2 *surfaceToPolygon() const override SIP_FACTORY;

tests/src/core/testqgsgeometry.cpp

+26
Original file line numberDiff line numberDiff line change
@@ -5959,6 +5959,32 @@ void TestQgsGeometry::triangle()
59595959
QVERIFY( !t6.fromWkb( wkbPointPtr ) );
59605960
QCOMPARE( t6.wkbType(), QgsWkbTypes::Triangle );
59615961

5962+
//asGML2
5963+
QgsTriangle exportEmptyTriangle( QgsPoint( 1, 2 ),
5964+
QgsPoint( 3, 4 ),
5965+
QgsPoint( 5, 6 ) );
5966+
QgsTriangle exportTriangle( QgsPoint( 1, 2 ),
5967+
QgsPoint( 3, 4 ),
5968+
QgsPoint( 6, 5 ) );
5969+
QgsTriangle exportTriangleFloat( QgsPoint( 1 + 1 / 3.0, 2 + 2 / 3.0 ),
5970+
QgsPoint( 3 + 1 / 3.0, 4 + 2 / 3.0 ),
5971+
QgsPoint( 6 + 1 / 3.0, 5 + 2 / 3.0 ) );
5972+
QDomDocument doc( QStringLiteral( "gml" ) );
5973+
QString expectedGML2( QStringLiteral( "<Polygon xmlns=\"gml\"><outerBoundaryIs xmlns=\"gml\"><LinearRing xmlns=\"gml\"><coordinates xmlns=\"gml\" cs=\",\" ts=\" \">1,2 3,4 6,5 1,2</coordinates></LinearRing></outerBoundaryIs></Polygon>" ) );
5974+
QGSCOMPAREGML( elemToString( exportTriangle.asGML2( doc ) ), expectedGML2 );
5975+
QString expectedGML2prec3( QStringLiteral( "<Polygon xmlns=\"gml\"><outerBoundaryIs xmlns=\"gml\"><LinearRing xmlns=\"gml\"><coordinates xmlns=\"gml\" cs=\",\" ts=\" \">1.333,2.667 3.333,4.667 6.333,5.667 1.333,2.667</coordinates></LinearRing></outerBoundaryIs></Polygon>" ) );
5976+
QGSCOMPAREGML( elemToString( exportTriangleFloat.asGML2( doc, 3 ) ), expectedGML2prec3 );
5977+
QString expectedGML2empty( QStringLiteral( "" ) ); // TODO: FIXME?
5978+
QGSCOMPAREGML( elemToString( exportEmptyTriangle.asGML2( doc ) ), expectedGML2empty );
5979+
5980+
//asGML3
5981+
QString expectedGML3( QStringLiteral( "<Triangle xmlns=\"gml\"><exterior xmlns=\"gml\"><LinearRing xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"2\">1 2 3 4 6 5 1 2</posList></LinearRing></exterior></Triangle>" ) );
5982+
QCOMPARE( elemToString( exportTriangle.asGML3( doc ) ), expectedGML3 );
5983+
QString expectedGML3prec3( QStringLiteral( "<Triangle xmlns=\"gml\"><exterior xmlns=\"gml\"><LinearRing xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"2\">1.333 2.667 3.333 4.667 6.333 5.667 1.333 2.667</posList></LinearRing></exterior></Triangle>" ) );
5984+
QCOMPARE( elemToString( exportTriangleFloat.asGML3( doc, 3 ) ), expectedGML3prec3 );
5985+
QString expectedGML3empty( QStringLiteral( "" ) ); // TODO: FIXME?
5986+
QGSCOMPAREGML( elemToString( exportEmptyTriangle.asGML3( doc ) ), expectedGML3empty );
5987+
59625988
// lengths and angles
59635989
QgsTriangle t7( QgsPoint( 0, 0 ), QgsPoint( 0, 5 ), QgsPoint( 5, 5 ) );
59645990

0 commit comments

Comments
 (0)