Skip to content

Commit a9f8e60

Browse files
authoredOct 25, 2017
Merge pull request #5428 from lbartoletti/triangleGML
ADD GML export to QgsTriangle
2 parents a89dfde + 650a122 commit a9f8e60

13 files changed

+173
-8
lines changed
 

‎python/core/geometry/qgstriangle.sip

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ class QgsTriangle : QgsPolygonV2
6868
virtual bool fromWkt( const QString &wkt );
6969

7070

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

7276
virtual QgsPolygonV2 *surfaceToPolygon() const /Factory/;
7377

‎src/core/geometry/qgscircularstring.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,10 @@ QDomElement QgsCircularString::asGML3( QDomDocument &doc, int precision, const Q
313313
points( pts );
314314

315315
QDomElement elemCurve = doc.createElementNS( ns, QStringLiteral( "Curve" ) );
316+
317+
if ( isEmpty() )
318+
return elemCurve;
319+
316320
QDomElement elemSegments = doc.createElementNS( ns, QStringLiteral( "segments" ) );
317321
QDomElement elemArcString = doc.createElementNS( ns, QStringLiteral( "ArcString" ) );
318322
elemArcString.appendChild( QgsGeometryUtils::pointsToGML3( pts, doc, precision, ns, is3D() ) );

‎src/core/geometry/qgscompoundcurve.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,10 @@ QDomElement QgsCompoundCurve::asGML2( QDomDocument &doc, int precision, const QS
271271
QDomElement QgsCompoundCurve::asGML3( QDomDocument &doc, int precision, const QString &ns ) const
272272
{
273273
QDomElement compoundCurveElem = doc.createElementNS( ns, QStringLiteral( "CompositeCurve" ) );
274+
275+
if ( isEmpty() )
276+
return compoundCurveElem;
277+
274278
for ( const QgsCurve *curve : mCurves )
275279
{
276280
QDomElement curveMemberElem = doc.createElementNS( ns, QStringLiteral( "curveMember" ) );

‎src/core/geometry/qgscurvepolygon.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,10 @@ QDomElement QgsCurvePolygon::asGML2( QDomDocument &doc, int precision, const QSt
332332
{
333333
// GML2 does not support curves
334334
QDomElement elemPolygon = doc.createElementNS( ns, QStringLiteral( "Polygon" ) );
335+
336+
if ( isEmpty() )
337+
return elemPolygon;
338+
335339
QDomElement elemOuterBoundaryIs = doc.createElementNS( ns, QStringLiteral( "outerBoundaryIs" ) );
336340
std::unique_ptr< QgsLineString > exteriorLineString( exteriorRing()->curveToLine() );
337341
QDomElement outerRing = exteriorLineString->asGML2( doc, precision, ns );
@@ -354,6 +358,10 @@ QDomElement QgsCurvePolygon::asGML2( QDomDocument &doc, int precision, const QSt
354358
QDomElement QgsCurvePolygon::asGML3( QDomDocument &doc, int precision, const QString &ns ) const
355359
{
356360
QDomElement elemCurvePolygon = doc.createElementNS( ns, QStringLiteral( "Polygon" ) );
361+
362+
if ( isEmpty() )
363+
return elemCurvePolygon;
364+
357365
QDomElement elemExterior = doc.createElementNS( ns, QStringLiteral( "exterior" ) );
358366
QDomElement curveElem = exteriorRing()->asGML3( doc, precision, ns );
359367
if ( curveElem.tagName() == QLatin1String( "LineString" ) )

‎src/core/geometry/qgslinestring.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,10 @@ QDomElement QgsLineString::asGML2( QDomDocument &doc, int precision, const QStri
291291
points( pts );
292292

293293
QDomElement elemLineString = doc.createElementNS( ns, QStringLiteral( "LineString" ) );
294+
295+
if ( isEmpty() )
296+
return elemLineString;
297+
294298
elemLineString.appendChild( QgsGeometryUtils::pointsToGML2( pts, doc, precision, ns ) );
295299

296300
return elemLineString;
@@ -302,6 +306,10 @@ QDomElement QgsLineString::asGML3( QDomDocument &doc, int precision, const QStri
302306
points( pts );
303307

304308
QDomElement elemLineString = doc.createElementNS( ns, QStringLiteral( "LineString" ) );
309+
310+
if ( isEmpty() )
311+
return elemLineString;
312+
305313
elemLineString.appendChild( QgsGeometryUtils::pointsToGML3( pts, doc, precision, ns, is3D() ) );
306314
return elemLineString;
307315
}

‎src/core/geometry/qgsmulticurve.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ QDomElement QgsMultiCurve::asGML2( QDomDocument &doc, int precision, const QStri
6060
{
6161
// GML2 does not support curves
6262
QDomElement elemMultiLineString = doc.createElementNS( ns, QStringLiteral( "MultiLineString" ) );
63+
64+
if ( isEmpty() )
65+
return elemMultiLineString;
66+
6367
for ( const QgsAbstractGeometry *geom : mGeometries )
6468
{
6569
if ( qgsgeometry_cast<const QgsCurve *>( geom ) )
@@ -78,6 +82,10 @@ QDomElement QgsMultiCurve::asGML2( QDomDocument &doc, int precision, const QStri
7882
QDomElement QgsMultiCurve::asGML3( QDomDocument &doc, int precision, const QString &ns ) const
7983
{
8084
QDomElement elemMultiCurve = doc.createElementNS( ns, QStringLiteral( "MultiCurve" ) );
85+
86+
if ( isEmpty() )
87+
return elemMultiCurve;
88+
8189
for ( const QgsAbstractGeometry *geom : mGeometries )
8290
{
8391
if ( qgsgeometry_cast<const QgsCurve *>( geom ) )

‎src/core/geometry/qgsmultilinestring.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ bool QgsMultiLineString::fromWkt( const QString &wkt )
5151
QDomElement QgsMultiLineString::asGML2( QDomDocument &doc, int precision, const QString &ns ) const
5252
{
5353
QDomElement elemMultiLineString = doc.createElementNS( ns, QStringLiteral( "MultiLineString" ) );
54+
55+
if ( isEmpty() )
56+
return elemMultiLineString;
57+
5458
for ( const QgsAbstractGeometry *geom : mGeometries )
5559
{
5660
if ( const QgsLineString *lineString = qgsgeometry_cast<const QgsLineString *>( geom ) )
@@ -67,6 +71,10 @@ QDomElement QgsMultiLineString::asGML2( QDomDocument &doc, int precision, const
6771
QDomElement QgsMultiLineString::asGML3( QDomDocument &doc, int precision, const QString &ns ) const
6872
{
6973
QDomElement elemMultiCurve = doc.createElementNS( ns, QStringLiteral( "MultiCurve" ) );
74+
75+
if ( isEmpty() )
76+
return elemMultiCurve;
77+
7078
for ( const QgsAbstractGeometry *geom : mGeometries )
7179
{
7280
if ( const QgsLineString *lineString = qgsgeometry_cast<const QgsLineString *>( geom ) )

‎src/core/geometry/qgsmultipoint.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ void QgsMultiPointV2::clear()
6363
QDomElement QgsMultiPointV2::asGML2( QDomDocument &doc, int precision, const QString &ns ) const
6464
{
6565
QDomElement elemMultiPoint = doc.createElementNS( ns, QStringLiteral( "MultiPoint" ) );
66+
67+
if ( isEmpty() )
68+
return elemMultiPoint;
69+
6670
for ( const QgsAbstractGeometry *geom : mGeometries )
6771
{
6872
if ( qgsgeometry_cast<const QgsPoint *>( geom ) )
@@ -79,6 +83,10 @@ QDomElement QgsMultiPointV2::asGML2( QDomDocument &doc, int precision, const QSt
7983
QDomElement QgsMultiPointV2::asGML3( QDomDocument &doc, int precision, const QString &ns ) const
8084
{
8185
QDomElement elemMultiPoint = doc.createElementNS( ns, QStringLiteral( "MultiPoint" ) );
86+
87+
if ( isEmpty() )
88+
return elemMultiPoint;
89+
8290
for ( const QgsAbstractGeometry *geom : mGeometries )
8391
{
8492
if ( qgsgeometry_cast<const QgsPoint *>( geom ) )

‎src/core/geometry/qgsmultipolygon.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ QDomElement QgsMultiPolygonV2::asGML2( QDomDocument &doc, int precision, const Q
5252
{
5353
// GML2 does not support curves
5454
QDomElement elemMultiPolygon = doc.createElementNS( ns, QStringLiteral( "MultiPolygon" ) );
55+
56+
if ( isEmpty() )
57+
return elemMultiPolygon;
58+
5559
for ( const QgsAbstractGeometry *geom : mGeometries )
5660
{
5761
if ( qgsgeometry_cast<const QgsPolygonV2 *>( geom ) )
@@ -68,6 +72,10 @@ QDomElement QgsMultiPolygonV2::asGML2( QDomDocument &doc, int precision, const Q
6872
QDomElement QgsMultiPolygonV2::asGML3( QDomDocument &doc, int precision, const QString &ns ) const
6973
{
7074
QDomElement elemMultiSurface = doc.createElementNS( ns, QStringLiteral( "MultiPolygon" ) );
75+
76+
if ( isEmpty() )
77+
return elemMultiSurface;
78+
7179
for ( const QgsAbstractGeometry *geom : mGeometries )
7280
{
7381
if ( qgsgeometry_cast<const QgsPolygonV2 *>( geom ) )

‎src/core/geometry/qgsmultisurface.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ QDomElement QgsMultiSurface::asGML2( QDomDocument &doc, int precision, const QSt
6060
{
6161
// GML2 does not support curves
6262
QDomElement elemMultiPolygon = doc.createElementNS( ns, QStringLiteral( "MultiPolygon" ) );
63+
64+
if ( isEmpty() )
65+
return elemMultiPolygon;
66+
6367
for ( const QgsAbstractGeometry *geom : mGeometries )
6468
{
6569
if ( qgsgeometry_cast<const QgsSurface *>( geom ) )
@@ -78,6 +82,10 @@ QDomElement QgsMultiSurface::asGML2( QDomDocument &doc, int precision, const QSt
7882
QDomElement QgsMultiSurface::asGML3( QDomDocument &doc, int precision, const QString &ns ) const
7983
{
8084
QDomElement elemMultiSurface = doc.createElementNS( ns, QStringLiteral( "MultiSurface" ) );
85+
86+
if ( isEmpty() )
87+
return elemMultiSurface;
88+
8189
for ( const QgsAbstractGeometry *geom : mGeometries )
8290
{
8391
if ( qgsgeometry_cast<const QgsSurface *>( geom ) )

‎src/core/geometry/qgstriangle.cpp

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,12 @@ QgsTriangle::QgsTriangle( const QgsPoint &p1, const QgsPoint &p2, const QgsPoint
3535
{
3636
return;
3737
}
38-
QVector< double > x;
39-
x << p1.x() << p2.x() << p3.x();
40-
QVector< double > y;
41-
y << p1.y() << p2.y() << p3.y();
42-
QgsLineString *ext = new QgsLineString( x, y );
43-
setExteriorRing( ext );
4438

39+
std::unique_ptr<QgsLineString> ext( new QgsLineString() );
40+
41+
ext->setPoints( QgsPointSequence() << p1 << p2 << p3 );
42+
43+
setExteriorRing( ext.release() );
4544
}
4645

4746
QgsTriangle::QgsTriangle( const QgsPointXY &p1, const QgsPointXY &p2, const QgsPointXY &p3 )
@@ -224,6 +223,26 @@ bool QgsTriangle::fromWkt( const QString &wkt )
224223
return true;
225224
}
226225

226+
QDomElement QgsTriangle::asGML3( QDomDocument &doc, int precision, const QString &ns ) const
227+
{
228+
229+
QDomElement elemTriangle = doc.createElementNS( ns, QStringLiteral( "Triangle" ) );
230+
231+
if ( isEmpty() )
232+
return elemTriangle;
233+
234+
QDomElement elemExterior = doc.createElementNS( ns, QStringLiteral( "exterior" ) );
235+
QDomElement curveElem = exteriorRing()->asGML3( doc, precision, ns );
236+
if ( curveElem.tagName() == QLatin1String( "LineString" ) )
237+
{
238+
curveElem.setTagName( QStringLiteral( "LinearRing" ) );
239+
}
240+
elemExterior.appendChild( curveElem );
241+
elemTriangle.appendChild( elemExterior );
242+
243+
return elemTriangle;
244+
}
245+
227246
QgsPolygonV2 *QgsTriangle::surfaceToPolygon() const
228247
{
229248
return toPolygon();

‎src/core/geometry/qgstriangle.h

Lines changed: 2 additions & 2 deletions
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+
// inherited (as a polygon): 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

Lines changed: 78 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)
Please sign in to comment.