Skip to content

Commit 2f2ceed

Browse files
rouaultnyalldawson
authored andcommitted
QgsCurvePolygon::asGml3(): make output compliant when ring is not a LinearRing
that is when it is a ring made of a CircularString or a ring made of a CompoundCurve Fixes qgis#57355
1 parent 134e990 commit 2f2ceed

File tree

2 files changed

+40
-15
lines changed

2 files changed

+40
-15
lines changed

src/core/geometry/qgscurvepolygon.cpp

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -356,24 +356,36 @@ QDomElement QgsCurvePolygon::asGml3( QDomDocument &doc, int precision, const QSt
356356
if ( isEmpty() )
357357
return elemCurvePolygon;
358358

359-
QDomElement elemExterior = doc.createElementNS( ns, QStringLiteral( "exterior" ) );
360-
QDomElement curveElem = exteriorRing()->asGml3( doc, precision, ns, axisOrder );
361-
if ( curveElem.tagName() == QLatin1String( "LineString" ) )
359+
const auto exportRing = [&doc, precision, &ns, axisOrder]( const QgsCurve * ring )
362360
{
363-
curveElem.setTagName( QStringLiteral( "LinearRing" ) );
364-
}
365-
elemExterior.appendChild( curveElem );
361+
QDomElement ringElem = ring->asGml3( doc, precision, ns, axisOrder );
362+
if ( ringElem.tagName() == QLatin1String( "LineString" ) )
363+
{
364+
ringElem.setTagName( QStringLiteral( "LinearRing" ) );
365+
}
366+
else if ( ringElem.tagName() == QLatin1String( "CompositeCurve" ) )
367+
{
368+
ringElem.setTagName( QStringLiteral( "Ring" ) );
369+
}
370+
else if ( ringElem.tagName() == QLatin1String( "Curve" ) )
371+
{
372+
QDomElement ringElemNew = doc.createElementNS( ns, QStringLiteral( "Ring" ) );
373+
QDomElement curveMemberElem = doc.createElementNS( ns, QStringLiteral( "curveMember" ) );
374+
ringElemNew.appendChild( curveMemberElem );
375+
curveMemberElem.appendChild( ringElem );
376+
ringElem = std::move( ringElemNew );
377+
}
378+
return ringElem;
379+
};
380+
381+
QDomElement elemExterior = doc.createElementNS( ns, QStringLiteral( "exterior" ) );
382+
elemExterior.appendChild( exportRing( exteriorRing() ) );
366383
elemCurvePolygon.appendChild( elemExterior );
367384

368385
for ( int i = 0, n = numInteriorRings(); i < n; ++i )
369386
{
370387
QDomElement elemInterior = doc.createElementNS( ns, QStringLiteral( "interior" ) );
371-
QDomElement innerRing = interiorRing( i )->asGml3( doc, precision, ns, axisOrder );
372-
if ( innerRing.tagName() == QLatin1String( "LineString" ) )
373-
{
374-
innerRing.setTagName( QStringLiteral( "LinearRing" ) );
375-
}
376-
elemInterior.appendChild( innerRing );
388+
elemInterior.appendChild( exportRing( interiorRing( i ) ) );
377389
elemCurvePolygon.appendChild( elemInterior );
378390
}
379391
return elemCurvePolygon;

tests/src/core/geometry/testqgscurvepolygon.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ class TestQgsCurvePolygon: public QObject
6565
void testWKB();
6666
void testWKT();
6767
void testExport();
68+
void testExportOfCompoundCurveRing();
6869
void testCast();
6970
void removeInteriorRings_github_issue_49578();
7071
};
@@ -1738,7 +1739,7 @@ void TestQgsCurvePolygon::testExport()
17381739
QGSCOMPAREGML( elemToString( QgsCurvePolygon().asGml2( doc ) ), expectedGML2empty );
17391740

17401741
// as GML3
1741-
QString expectedSimpleGML3( QStringLiteral( "<Polygon xmlns=\"gml\"><exterior xmlns=\"gml\"><Curve xmlns=\"gml\"><segments xmlns=\"gml\"><ArcString xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"3\">0 0 10 1 0 11 2 0 12 1 0.5 13 0 0 10</posList></ArcString></segments></Curve></exterior></Polygon>" ) );
1742+
QString expectedSimpleGML3( QStringLiteral( "<Polygon xmlns=\"gml\"><exterior xmlns=\"gml\"><Ring xmlns=\"gml\"><curveMember xmlns=\"gml\"><Curve xmlns=\"gml\"><segments xmlns=\"gml\"><ArcString xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"3\">0 0 10 1 0 11 2 0 12 1 0.5 13 0 0 10</posList></ArcString></segments></Curve></curveMember></Ring></exterior></Polygon>" ) );
17421743
res = elemToString( exportPolygon.asGml3( doc, 2 ) );
17431744
QCOMPARE( elemToString( exportPolygon.asGml3( doc ) ), expectedSimpleGML3 );
17441745

@@ -1793,15 +1794,27 @@ void TestQgsCurvePolygon::testExport()
17931794
QGSCOMPAREGML( res, expectedGML2prec2 );
17941795

17951796
// as GML3
1796-
QString expectedGML3( QStringLiteral( "<Polygon xmlns=\"gml\"><exterior xmlns=\"gml\"><Curve xmlns=\"gml\"><segments xmlns=\"gml\"><ArcString xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"3\">0 0 10 1 0 11 2 0 12 1 0.5 13 0 0 10</posList></ArcString></segments></Curve></exterior><interior xmlns=\"gml\"><Curve xmlns=\"gml\"><segments xmlns=\"gml\"><ArcString xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"3\">0 0 10 0.10000000000000001 0 11 0.20000000000000001 0 12 0.10000000000000001 0.05 13 0 0 10</posList></ArcString></segments></Curve></interior></Polygon>" ) );
1797+
QString expectedGML3( QStringLiteral( "<Polygon xmlns=\"gml\"><exterior xmlns=\"gml\"><Ring xmlns=\"gml\"><curveMember xmlns=\"gml\"><Curve xmlns=\"gml\"><segments xmlns=\"gml\"><ArcString xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"3\">0 0 10 1 0 11 2 0 12 1 0.5 13 0 0 10</posList></ArcString></segments></Curve></curveMember></Ring></exterior><interior xmlns=\"gml\"><Ring xmlns=\"gml\"><curveMember xmlns=\"gml\"><Curve xmlns=\"gml\"><segments xmlns=\"gml\"><ArcString xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"3\">0 0 10 0.10000000000000001 0 11 0.20000000000000001 0 12 0.10000000000000001 0.05 13 0 0 10</posList></ArcString></segments></Curve></curveMember></Ring></interior></Polygon>" ) );
17971798
res = elemToString( exportPolygon.asGml3( doc ) );
17981799
QCOMPARE( res, expectedGML3 );
17991800

1800-
QString expectedGML3prec3( QStringLiteral( "<Polygon xmlns=\"gml\"><exterior xmlns=\"gml\"><Curve xmlns=\"gml\"><segments xmlns=\"gml\"><ArcString xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"3\">0 0 10 1 0 11 2 0 12 1 0.5 13 0 0 10</posList></ArcString></segments></Curve></exterior><interior xmlns=\"gml\"><Curve xmlns=\"gml\"><segments xmlns=\"gml\"><ArcString xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"3\">0 0 10 0.1 0 11 0.2 0 12 0.1 0.05 13 0 0 10</posList></ArcString></segments></Curve></interior></Polygon>" ) );
1801+
QString expectedGML3prec3( QStringLiteral( "<Polygon xmlns=\"gml\"><exterior xmlns=\"gml\"><Ring xmlns=\"gml\"><curveMember xmlns=\"gml\"><Curve xmlns=\"gml\"><segments xmlns=\"gml\"><ArcString xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"3\">0 0 10 1 0 11 2 0 12 1 0.5 13 0 0 10</posList></ArcString></segments></Curve></curveMember></Ring></exterior><interior xmlns=\"gml\"><Ring xmlns=\"gml\"><curveMember xmlns=\"gml\"><Curve xmlns=\"gml\"><segments xmlns=\"gml\"><ArcString xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"3\">0 0 10 0.1 0 11 0.2 0 12 0.1 0.05 13 0 0 10</posList></ArcString></segments></Curve></curveMember></Ring></interior></Polygon>" ) );
18011802
res = elemToString( exportPolygon.asGml3( doc, 3 ) );
18021803
QCOMPARE( res, expectedGML3prec3 );
18031804
}
18041805

1806+
void TestQgsCurvePolygon::testExportOfCompoundCurveRing()
1807+
{
1808+
QgsCurvePolygon curvePoly;
1809+
curvePoly.fromWkt( QStringLiteral( "CURVEPOLYGON (COMPOUNDCURVE ((0 -1,0 1),CIRCULARSTRING (0 1,1 0,0 -1)))" ) );
1810+
1811+
// as GML3
1812+
QString expectedGML3( QStringLiteral( "<Polygon xmlns=\"gml\"><exterior xmlns=\"gml\"><Ring xmlns=\"gml\"><curveMember xmlns=\"gml\"><LineString xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"2\">0 -1 0 1</posList></LineString></curveMember><curveMember xmlns=\"gml\"><Curve xmlns=\"gml\"><segments xmlns=\"gml\"><ArcString xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"2\">0 1 1 0 0 -1</posList></ArcString></segments></Curve></curveMember></Ring></exterior></Polygon>" ) );
1813+
QDomDocument doc( QStringLiteral( "gml" ) );
1814+
QString res = elemToString( curvePoly.asGml3( doc ) );
1815+
QCOMPARE( res, expectedGML3 );
1816+
}
1817+
18051818
void TestQgsCurvePolygon::testCast()
18061819
{
18071820
QVERIFY( !QgsCurvePolygon().cast( nullptr ) );

0 commit comments

Comments
 (0)