Skip to content

Commit

Permalink
ADD GML export to QgsTriangle
Browse files Browse the repository at this point in the history
  • Loading branch information
lbartoletti committed Oct 23, 2017
1 parent a48c2e8 commit 0d89504
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 2 deletions.
8 changes: 8 additions & 0 deletions python/core/geometry/qgstriangle.sip
Expand Up @@ -68,6 +68,14 @@ class QgsTriangle : QgsPolygonV2
virtual bool fromWkt( const QString &wkt );


QDomElement asGML2( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
%Docstring
:rtype: QDomElement
%End
QDomElement asGML3( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
%Docstring
:rtype: QDomElement
%End

virtual QgsPolygonV2 *surfaceToPolygon() const /Factory/;

Expand Down
38 changes: 38 additions & 0 deletions src/core/geometry/qgstriangle.cpp
Expand Up @@ -224,6 +224,44 @@ bool QgsTriangle::fromWkt( const QString &wkt )
return true;
}

QDomElement QgsTriangle::asGML2( QDomDocument &doc, int precision, const QString &ns ) const
{
if ( !isEmpty() ) /* else crash */
return QgsPolygonV2::asGML2( doc, precision, ns );

return QDomElement(); /* Crash: "QgsPolygonV2().asGML2( doc, precision, ns )"*/
}

QDomElement QgsTriangle::asGML3( QDomDocument &doc, int precision, const QString &ns ) const
{
if ( isEmpty() ) /* else crash */
return QDomElement();

QDomElement elemCurveTriangle = doc.createElementNS( ns, QStringLiteral( "Triangle" ) );
QDomElement elemExterior = doc.createElementNS( ns, QStringLiteral( "exterior" ) );
QDomElement curveElem = exteriorRing()->asGML3( doc, precision, ns );
if ( curveElem.tagName() == QLatin1String( "LineString" ) )
{
curveElem.setTagName( QStringLiteral( "LinearRing" ) );
}
elemExterior.appendChild( curveElem );
elemCurveTriangle.appendChild( elemExterior );

/* No interior ring for triangle
for ( int i = 0, n = numInteriorRings(); i < n; ++i )
{
QDomElement elemInterior = doc.createElementNS( ns, QStringLiteral( "interior" ) );
QDomElement innerRing = interiorRing( i )->asGML3( doc, precision, ns );
if ( innerRing.tagName() == QLatin1String( "LineString" ) )
{
innerRing.setTagName( QStringLiteral( "LinearRing" ) );
}
elemInterior.appendChild( innerRing );
elemCurveTriangle.appendChild( elemInterior );
}*/
return elemCurveTriangle;
}

QgsPolygonV2 *QgsTriangle::surfaceToPolygon() const
{
return toPolygon();
Expand Down
4 changes: 2 additions & 2 deletions src/core/geometry/qgstriangle.h
Expand Up @@ -74,8 +74,8 @@ class CORE_EXPORT QgsTriangle : public QgsPolygonV2
bool fromWkt( const QString &wkt ) override;

// inherited: QString asWkt( int precision = 17 ) const;
// inherited: QDomElement asGML2( QDomDocument& doc, int precision = 17, const QString& ns = "gml" ) const;
// inherited: QDomElement asGML3( QDomDocument& doc, int precision = 17, const QString& ns = "gml" ) const;
QDomElement asGML2( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
QDomElement asGML3( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const;
// inherited: QString asJSON( int precision = 17 ) const;

QgsPolygonV2 *surfaceToPolygon() const override SIP_FACTORY;
Expand Down
26 changes: 26 additions & 0 deletions tests/src/core/testqgsgeometry.cpp
Expand Up @@ -5959,6 +5959,32 @@ void TestQgsGeometry::triangle()
QVERIFY( !t6.fromWkb( wkbPointPtr ) );
QCOMPARE( t6.wkbType(), QgsWkbTypes::Triangle );

//asGML2
QgsTriangle exportEmptyTriangle( QgsPoint( 1, 2 ),
QgsPoint( 3, 4 ),
QgsPoint( 5, 6 ) );
QgsTriangle exportTriangle( QgsPoint( 1, 2 ),
QgsPoint( 3, 4 ),
QgsPoint( 6, 5 ) );
QgsTriangle exportTriangleFloat( QgsPoint( 1 + 1 / 3.0, 2 + 2 / 3.0 ),
QgsPoint( 3 + 1 / 3.0, 4 + 2 / 3.0 ),
QgsPoint( 6 + 1 / 3.0, 5 + 2 / 3.0 ) );
QDomDocument doc( QStringLiteral( "gml" ) );
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>" ) );
QGSCOMPAREGML( elemToString( exportTriangle.asGML2( doc ) ), expectedGML2 );
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>" ) );
QGSCOMPAREGML( elemToString( exportTriangleFloat.asGML2( doc, 3 ) ), expectedGML2prec3 );
QString expectedGML2empty( QStringLiteral( "" ) ); // TODO: FIXME?
QGSCOMPAREGML( elemToString( exportEmptyTriangle.asGML2( doc ) ), expectedGML2empty );

//asGML3
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>" ) );
QCOMPARE( elemToString( exportTriangle.asGML3( doc ) ), expectedGML3 );
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>" ) );
QCOMPARE( elemToString( exportTriangleFloat.asGML3( doc, 3 ) ), expectedGML3prec3 );
QString expectedGML3empty( QStringLiteral( "" ) ); // TODO: FIXME?
QGSCOMPAREGML( elemToString( exportEmptyTriangle.asGML3( doc ) ), expectedGML3empty );

// lengths and angles
QgsTriangle t7( QgsPoint( 0, 0 ), QgsPoint( 0, 5 ), QgsPoint( 5, 5 ) );

Expand Down

0 comments on commit 0d89504

Please sign in to comment.