Skip to content

Commit 4327790

Browse files
authored
Merge pull request #4130 from mhugent/wfs_gml_from_geometry
Take wfs gml directly from geometry
2 parents f66b0ba + 04475f8 commit 4327790

File tree

10 files changed

+70
-69
lines changed

10 files changed

+70
-69
lines changed

src/core/geometry/qgscompoundcurve.cpp

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -248,33 +248,16 @@ QDomElement QgsCompoundCurve::asGML2( QDomDocument& doc, int precision, const QS
248248

249249
QDomElement QgsCompoundCurve::asGML3( QDomDocument& doc, int precision, const QString& ns ) const
250250
{
251-
QDomElement elemCurve = doc.createElementNS( ns, QStringLiteral( "Curve" ) );
252-
253-
QDomElement elemSegments = doc.createElementNS( ns, QStringLiteral( "segments" ) );
254-
251+
QDomElement compoundCurveElem = doc.createElementNS( ns, QStringLiteral( "CompositeCurve" ) );
255252
Q_FOREACH ( const QgsCurve* curve, mCurves )
256253
{
257-
if ( dynamic_cast<const QgsLineString*>( curve ) )
258-
{
259-
QgsPointSequence pts;
260-
curve->points( pts );
261-
262-
QDomElement elemLineStringSegment = doc.createElementNS( ns, QStringLiteral( "LineStringSegment" ) );
263-
elemLineStringSegment.appendChild( QgsGeometryUtils::pointsToGML3( pts, doc, precision, ns, is3D() ) );
264-
elemSegments.appendChild( elemLineStringSegment );
265-
}
266-
else if ( dynamic_cast<const QgsCircularString*>( curve ) )
267-
{
268-
QgsPointSequence pts;
269-
curve->points( pts );
270-
271-
QDomElement elemArcString = doc.createElementNS( ns, QStringLiteral( "ArcString" ) );
272-
elemArcString.appendChild( QgsGeometryUtils::pointsToGML3( pts, doc, precision, ns, is3D() ) );
273-
elemSegments.appendChild( elemArcString );
274-
}
254+
QDomElement curveMemberElem = doc.createElementNS( ns, QStringLiteral( "curveMember" ) );
255+
QDomElement curveElem = curve->asGML3( doc, precision, ns );
256+
curveMemberElem.appendChild( curveElem );
257+
compoundCurveElem.appendChild( curveMemberElem );
275258
}
276-
elemCurve.appendChild( elemSegments );
277-
return elemCurve;
259+
260+
return compoundCurveElem;
278261
}
279262

280263
QString QgsCompoundCurve::asJSON( int precision ) const

src/core/geometry/qgscurvepolygon.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -308,18 +308,26 @@ QDomElement QgsCurvePolygon::asGML3( QDomDocument& doc, int precision, const QSt
308308
{
309309
QDomElement elemCurvePolygon = doc.createElementNS( ns, QStringLiteral( "Polygon" ) );
310310
QDomElement elemExterior = doc.createElementNS( ns, QStringLiteral( "exterior" ) );
311-
QDomElement outerRing = exteriorRing()->asGML2( doc, precision, ns );
312-
outerRing.toElement().setTagName( QStringLiteral( "LinearRing" ) );
313-
elemExterior.appendChild( outerRing );
311+
QDomElement curveElem = exteriorRing()->asGML3( doc, precision, ns );
312+
if ( curveElem.tagName() == "LineString" )
313+
{
314+
curveElem.setTagName( QStringLiteral( "LinearRing" ) );
315+
}
316+
elemExterior.appendChild( curveElem );
317+
elemCurvePolygon.appendChild( elemExterior );
318+
314319
elemCurvePolygon.appendChild( elemExterior );
315-
QDomElement elemInterior = doc.createElementNS( ns, QStringLiteral( "interior" ) );
316320
for ( int i = 0, n = numInteriorRings(); i < n; ++i )
317321
{
318-
QDomElement innerRing = interiorRing( i )->asGML2( doc, precision, ns );
319-
innerRing.toElement().setTagName( QStringLiteral( "LinearRing" ) );
322+
QDomElement elemInterior = doc.createElementNS( ns, QStringLiteral( "interior" ) );
323+
QDomElement innerRing = interiorRing( i )->asGML3( doc, precision, ns );
324+
if ( innerRing.tagName() == "LineString" )
325+
{
326+
innerRing.setTagName( QStringLiteral( "LinearRing" ) );
327+
}
320328
elemInterior.appendChild( innerRing );
329+
elemCurvePolygon.appendChild( elemInterior );
321330
}
322-
elemCurvePolygon.appendChild( elemInterior );
323331
return elemCurvePolygon;
324332
}
325333

src/core/geometry/qgslinestring.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -207,14 +207,9 @@ QDomElement QgsLineString::asGML3( QDomDocument& doc, int precision, const QStri
207207
QgsPointSequence pts;
208208
points( pts );
209209

210-
QDomElement elemCurve = doc.createElementNS( ns, QStringLiteral( "Curve" ) );
211-
QDomElement elemSegments = doc.createElementNS( ns, QStringLiteral( "segments" ) );
212-
QDomElement elemArcString = doc.createElementNS( ns, QStringLiteral( "LineStringSegment" ) );
213-
elemArcString.appendChild( QgsGeometryUtils::pointsToGML3( pts, doc, precision, ns, is3D() ) );
214-
elemSegments.appendChild( elemArcString );
215-
elemCurve.appendChild( elemSegments );
216-
217-
return elemCurve;
210+
QDomElement elemLineString = doc.createElementNS( ns, QStringLiteral( "LineString" ) );
211+
elemLineString.appendChild( QgsGeometryUtils::pointsToGML3( pts, doc, precision, ns, is3D() ) );
212+
return elemLineString;
218213
}
219214

220215
QString QgsLineString::asJSON( int precision ) const

src/core/geometry/qgsmultilinestring.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ QDomElement QgsMultiLineString::asGML2( QDomDocument& doc, int precision, const
6060

6161
QDomElement QgsMultiLineString::asGML3( QDomDocument& doc, int precision, const QString& ns ) const
6262
{
63-
QDomElement elemMultiCurve = doc.createElementNS( ns, QStringLiteral( "MultiLineString" ) );
63+
QDomElement elemMultiCurve = doc.createElementNS( ns, QStringLiteral( "MultiCurve" ) );
6464
Q_FOREACH ( const QgsAbstractGeometry *geom, mGeometries )
6565
{
6666
if ( dynamic_cast<const QgsLineString*>( geom ) )

src/server/services/wfs/qgswfsgetfeature.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1165,7 +1165,14 @@ namespace QgsWfs
11651165
gmlElem = QgsOgcUtils::geometryToGML( &centroid, doc, prec );
11661166
}
11671167
else
1168-
gmlElem = QgsOgcUtils::geometryToGML( &geom, doc, prec );
1168+
{
1169+
QgsAbstractGeometry* abstractGeom = geom.geometry();
1170+
if ( abstractGeom )
1171+
{
1172+
gmlElem = abstractGeom->asGML2( doc, prec, "http://www.opengis.net/gml" );
1173+
}
1174+
}
1175+
11691176
if ( !gmlElem.isNull() )
11701177
{
11711178
QgsRectangle box = geom.boundingBox();
@@ -1240,7 +1247,14 @@ namespace QgsWfs
12401247
gmlElem = QgsOgcUtils::geometryToGML( &centroid, doc, QStringLiteral( "GML3" ), prec );
12411248
}
12421249
else
1243-
gmlElem = QgsOgcUtils::geometryToGML( &geom, doc, QStringLiteral( "GML3" ), prec );
1250+
{
1251+
QgsAbstractGeometry* abstractGeom = geom.geometry();
1252+
if ( abstractGeom )
1253+
{
1254+
gmlElem = abstractGeom->asGML3( doc, prec, "http://www.opengis.net/gml" );
1255+
}
1256+
}
1257+
12441258
if ( !gmlElem.isNull() )
12451259
{
12461260
QgsRectangle box = geom.boundingBox();

tests/src/core/testqgsgeometry.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1550,9 +1550,9 @@ void TestQgsGeometry::lineString()
15501550
QCOMPARE( elemToString( exportLineFloat.asGML2( doc, 3 ) ), expectedGML2prec3 );
15511551

15521552
//asGML3
1553-
QString expectedGML3( QStringLiteral( "<Curve xmlns=\"gml\"><segments xmlns=\"gml\"><LineStringSegment xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"2\">31 32 41 42 51 52</posList></LineStringSegment></segments></Curve>" ) );
1553+
QString expectedGML3( QStringLiteral( "<LineString xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"2\">31 32 41 42 51 52</posList></LineString>" ) );
15541554
QCOMPARE( elemToString( exportLine.asGML3( doc ) ), expectedGML3 );
1555-
QString expectedGML3prec3( QStringLiteral( "<Curve xmlns=\"gml\"><segments xmlns=\"gml\"><LineStringSegment xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"2\">0.333 0.667 1.333 1.667 2.333 2.667</posList></LineStringSegment></segments></Curve>" ) );
1555+
QString expectedGML3prec3( QStringLiteral( "<LineString xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"2\">0.333 0.667 1.333 1.667 2.333 2.667</posList></LineString>" ) );
15561556
QCOMPARE( elemToString( exportLineFloat.asGML3( doc, 3 ) ), expectedGML3prec3 );
15571557

15581558
//asJSON
@@ -3037,11 +3037,12 @@ void TestQgsGeometry::polygon()
30373037
QCOMPARE( elemToString( exportPolygonFloat.asGML2( doc, 3 ) ), expectedGML2prec3 );
30383038

30393039
//as GML3
3040-
QString expectedGML3( QStringLiteral( "<Polygon xmlns=\"gml\"><exterior xmlns=\"gml\"><LinearRing xmlns=\"gml\"><coordinates xmlns=\"gml\">0,0 0,10 10,10 10,0 0,0</coordinates></LinearRing></exterior>" ) );
3041-
expectedGML3 += QStringLiteral( "<interior xmlns=\"gml\"><LinearRing xmlns=\"gml\"><coordinates xmlns=\"gml\">1,1 1,9 9,9 9,1 1,1</coordinates></LinearRing></interior></Polygon>" );
3040+
QString expectedGML3( QStringLiteral( "<Polygon xmlns=\"gml\"><exterior xmlns=\"gml\"><LinearRing xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"2\">0 0 0 10 10 10 10 0 0 0</posList></LinearRing></exterior>" ) );
3041+
expectedGML3 += QStringLiteral( "<interior xmlns=\"gml\"><LinearRing xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"2\">1 1 1 9 9 9 9 1 1 1</posList></LinearRing></interior></Polygon>" );
3042+
30423043
QCOMPARE( elemToString( exportPolygon.asGML3( doc ) ), expectedGML3 );
3043-
QString expectedGML3prec3( QStringLiteral( "<Polygon xmlns=\"gml\"><exterior xmlns=\"gml\"><LinearRing xmlns=\"gml\"><coordinates xmlns=\"gml\">1.111,1.111 1.111,11.111 11.111,11.111 11.111,1.111 1.111,1.111</coordinates></LinearRing></exterior>" ) );
3044-
expectedGML3prec3 += QStringLiteral( "<interior xmlns=\"gml\"><LinearRing xmlns=\"gml\"><coordinates xmlns=\"gml\">0.667,0.667 0.667,1.333 1.333,1.333 1.333,0.667 0.667,0.667</coordinates></LinearRing></interior></Polygon>" );
3044+
QString expectedGML3prec3( QStringLiteral( "<Polygon xmlns=\"gml\"><exterior xmlns=\"gml\"><LinearRing xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"2\">1.111 1.111 1.111 11.111 11.111 11.111 11.111 1.111 1.111 1.111</posList></LinearRing></exterior>" ) );
3045+
expectedGML3prec3 += QStringLiteral( "<interior xmlns=\"gml\"><LinearRing xmlns=\"gml\"><posList xmlns=\"gml\" srsDimension=\"2\">0.667 0.667 0.667 1.333 1.333 1.333 1.333 0.667 0.667 0.667</posList></LinearRing></interior></Polygon>" );
30453046
QCOMPARE( elemToString( exportPolygonFloat.asGML3( doc, 3 ) ), expectedGML3prec3 );
30463047

30473048
//removing the fourth to last vertex removes the whole ring

tests/testdata/qgis_server/wfs_getfeature_limit2.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ Content-Type: text/xml; charset=utf-8
1313
</gml:Box>
1414
</gml:boundedBy>
1515
<qgs:geometry>
16-
<gml:Point srsName="EPSG:4326">
17-
<gml:coordinates cs="," ts=" ">8.20349634,44.90148253</gml:coordinates>
18-
</gml:Point>
16+
<Point xmlns="http://www.opengis.net/gml" srsName="EPSG:4326">
17+
<coordinates xmlns="http://www.opengis.net/gml" cs="," ts=" ">8.20349634,44.90148253</coordinates>
18+
</Point>
1919
</qgs:geometry>
2020
<qgs:id>1</qgs:id>
2121
<qgs:name>one</qgs:name>
@@ -30,9 +30,9 @@ Content-Type: text/xml; charset=utf-8
3030
</gml:Box>
3131
</gml:boundedBy>
3232
<qgs:geometry>
33-
<gml:Point srsName="EPSG:4326">
34-
<gml:coordinates cs="," ts=" ">8.20354699,44.90143568</gml:coordinates>
35-
</gml:Point>
33+
<Point xmlns="http://www.opengis.net/gml" srsName="EPSG:4326">
34+
<coordinates xmlns="http://www.opengis.net/gml" cs="," ts=" ">8.20354699,44.90143568</coordinates>
35+
</Point>
3636
</qgs:geometry>
3737
<qgs:id>2</qgs:id>
3838
<qgs:name>two</qgs:name>

tests/testdata/qgis_server/wfs_getfeature_nobbox.txt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ Content-Type: text/xml; charset=utf-8
1313
</gml:Box>
1414
</gml:boundedBy>
1515
<qgs:geometry>
16-
<gml:Point srsName="EPSG:4326">
17-
<gml:coordinates cs="," ts=" ">8.20349634,44.90148253</gml:coordinates>
18-
</gml:Point>
16+
<Point xmlns="http://www.opengis.net/gml" srsName="EPSG:4326">
17+
<coordinates xmlns="http://www.opengis.net/gml" cs="," ts=" ">8.20349634,44.90148253</coordinates>
18+
</Point>
1919
</qgs:geometry>
2020
<qgs:id>1</qgs:id>
2121
<qgs:name>one</qgs:name>
@@ -30,9 +30,9 @@ Content-Type: text/xml; charset=utf-8
3030
</gml:Box>
3131
</gml:boundedBy>
3232
<qgs:geometry>
33-
<gml:Point srsName="EPSG:4326">
34-
<gml:coordinates cs="," ts=" ">8.20354699,44.90143568</gml:coordinates>
35-
</gml:Point>
33+
<Point xmlns="http://www.opengis.net/gml" srsName="EPSG:4326">
34+
<coordinates xmlns="http://www.opengis.net/gml" cs="," ts=" ">8.20354699,44.90143568</coordinates>
35+
</Point>
3636
</qgs:geometry>
3737
<qgs:id>2</qgs:id>
3838
<qgs:name>two</qgs:name>
@@ -47,9 +47,9 @@ Content-Type: text/xml; charset=utf-8
4747
</gml:Box>
4848
</gml:boundedBy>
4949
<qgs:geometry>
50-
<gml:Point srsName="EPSG:4326">
51-
<gml:coordinates cs="," ts=" ">8.20345931,44.90139484</gml:coordinates>
52-
</gml:Point>
50+
<Point xmlns="http://www.opengis.net/gml" srsName="EPSG:4326">
51+
<coordinates xmlns="http://www.opengis.net/gml" cs="," ts=" ">8.20345931,44.90139484</coordinates>
52+
</Point>
5353
</qgs:geometry>
5454
<qgs:id>3</qgs:id>
5555
<qgs:name>three</qgs:name>

tests/testdata/qgis_server/wfs_getfeature_start1_limit1.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ Content-Type: text/xml; charset=utf-8
1313
</gml:Box>
1414
</gml:boundedBy>
1515
<qgs:geometry>
16-
<gml:Point srsName="EPSG:4326">
17-
<gml:coordinates cs="," ts=" ">8.20354699,44.90143568</gml:coordinates>
18-
</gml:Point>
16+
<Point xmlns="http://www.opengis.net/gml" srsName="EPSG:4326">
17+
<coordinates xmlns="http://www.opengis.net/gml" cs="," ts=" ">8.20354699,44.90143568</coordinates>
18+
</Point>
1919
</qgs:geometry>
2020
<qgs:id>2</qgs:id>
2121
<qgs:name>two</qgs:name>

tests/testdata/qgis_server/wfs_getfeature_startindex2.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ Content-Type: text/xml; charset=utf-8
1313
</gml:Box>
1414
</gml:boundedBy>
1515
<qgs:geometry>
16-
<gml:Point srsName="EPSG:4326">
17-
<gml:coordinates cs="," ts=" ">8.20345931,44.90139484</gml:coordinates>
18-
</gml:Point>
16+
<Point xmlns="http://www.opengis.net/gml" srsName="EPSG:4326">
17+
<coordinates xmlns="http://www.opengis.net/gml" cs="," ts=" ">8.20345931,44.90139484</coordinates>
18+
</Point>
1919
</qgs:geometry>
2020
<qgs:id>3</qgs:id>
2121
<qgs:name>three</qgs:name>

0 commit comments

Comments
 (0)