Skip to content

Commit 72a7606

Browse files
authored
Merge pull request #8243 from rldhont/server-wfs-force-multi-geom-gml-218
[Bugfix][Server][WFS] In GML geometry has all to be multi
2 parents c23c3d2 + 55928c0 commit 72a7606

File tree

2 files changed

+34
-17
lines changed

2 files changed

+34
-17
lines changed

src/server/qgswfsserver.cpp

+31-14
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include "qgsogcutils.h"
4040
#include "qgsaccesscontrol.h"
4141
#include "qgsjsonutils.h"
42+
#include "qgswkbtypes.h"
4243

4344
#include <QImage>
4445
#include <QPainter>
@@ -582,6 +583,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
582583
}
583584
layerCrs = layer->crs();
584585

586+
bool isMultiGeom = QgsWKBTypes::isMultiType( QGis::fromOldWkbType( layer->wkbType() ) );
587+
585588
QgsFeatureRequest fReq;
586589
#ifdef HAVE_SERVER_PYTHON_PLUGINS
587590
fReq.setFlags( QgsFeatureRequest::ExactIntersect | ( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) );
@@ -629,7 +632,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
629632
if ( featureCounter == 0 )
630633
startGetFeature( request, format, layerPrec, layerCrs, &searchRect );
631634

632-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
635+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
633636

634637
fid = "";
635638
++featCounter;
@@ -722,7 +725,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
722725

723726
if ( featureCounter >= startIndex )
724727
{
725-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
728+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
726729
++featCounter;
727730
}
728731
++featureCounter;
@@ -740,7 +743,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
740743

741744
if ( featureCounter >= startIndex )
742745
{
743-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
746+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
744747
++featCounter;
745748
}
746749
++featureCounter;
@@ -1007,6 +1010,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
10071010
searchRect.yMaximum() + 1. / pow( 10., layerPrec ) );
10081011
layerCrs = layer->crs();
10091012

1013+
bool isMultiGeom = QgsWKBTypes::isMultiType( QGis::fromOldWkbType( layer->wkbType() ) );
1014+
10101015
if ( featureIdOk )
10111016
{
10121017
Q_FOREACH ( const QString &fidStr, featureIdList )
@@ -1023,7 +1028,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
10231028
if ( featureCounter == 0 )
10241029
startGetFeature( request, format, layerPrec, layerCrs, &searchRect );
10251030

1026-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
1031+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
10271032
++featCounter;
10281033
++featureCounter;
10291034
}
@@ -1072,7 +1077,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
10721077

10731078
if ( featureCounter >= startIndex )
10741079
{
1075-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
1080+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
10761081
++featCounter;
10771082
}
10781083
++featureCounter;
@@ -1109,7 +1114,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
11091114
if ( featureCounter == 0 )
11101115
startGetFeature( request, format, layerPrec, layerCrs, &searchRect );
11111116

1112-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
1117+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
11131118

11141119
fid = "";
11151120
++featCounter;
@@ -1148,7 +1153,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
11481153

11491154
if ( featureCounter >= startIndex )
11501155
{
1151-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
1156+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
11521157
++featCounter;
11531158
}
11541159
++featureCounter;
@@ -1197,7 +1202,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
11971202

11981203
if ( featureCounter >= startIndex )
11991204
{
1200-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
1205+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
12011206
++featCounter;
12021207
}
12031208
++featureCounter;
@@ -1236,7 +1241,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
12361241

12371242
if ( featureCounter >= startIndex )
12381243
{
1239-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
1244+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
12401245
++featCounter;
12411246
}
12421247
++featureCounter;
@@ -1413,7 +1418,7 @@ void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& f
14131418
}
14141419

14151420
void QgsWFSServer::setGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes,
1416-
const QgsAttributeList& pkAttributes ) /*const*/
1421+
const QgsAttributeList& pkAttributes, bool isMultiGeom ) /*const*/
14171422
{
14181423
if ( !feat->isValid() )
14191424
return;
@@ -1443,12 +1448,12 @@ void QgsWFSServer::setGetFeature( QgsRequestHandler& request, const QString& for
14431448
QDomElement featureElement;
14441449
if ( format == "GML3" )
14451450
{
1446-
featureElement = createFeatureGML3( feat, gmlDoc, prec, crs, attrIndexes, pkAttributes );
1451+
featureElement = createFeatureGML3( feat, gmlDoc, prec, crs, attrIndexes, pkAttributes, isMultiGeom );
14471452
gmlDoc.appendChild( featureElement );
14481453
}
14491454
else
14501455
{
1451-
featureElement = createFeatureGML2( feat, gmlDoc, prec, crs, attrIndexes, pkAttributes );
1456+
featureElement = createFeatureGML2( feat, gmlDoc, prec, crs, attrIndexes, pkAttributes, isMultiGeom );
14521457
gmlDoc.appendChild( featureElement );
14531458
}
14541459

@@ -2054,7 +2059,7 @@ QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, int prec, QgsCoord
20542059
}
20552060

20562061
QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes,
2057-
const QgsAttributeList& pkAttributes ) /*const*/
2062+
const QgsAttributeList& pkAttributes, bool isMultiGeom ) /*const*/
20582063
{
20592064
//gml:FeatureMember
20602065
QDomElement featureElement = doc.createElement( "gml:featureMember"/*wfs:FeatureMember*/ );
@@ -2066,6 +2071,12 @@ QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc
20662071
featureElement.appendChild( typeNameElement );
20672072

20682073
const QgsGeometry* geom = feat->constGeometry();
2074+
if ( isMultiGeom && QgsWKBTypes::isSingleType( QGis::fromOldWkbType( geom->wkbType() ) ) )
2075+
{
2076+
QgsGeometry cloneGeom( *geom );
2077+
cloneGeom.convertToMultiType();
2078+
geom = &cloneGeom;
2079+
}
20692080
if ( geom && mWithGeom && mGeometryName != "NONE" )
20702081
{
20712082
QDomElement geomElem = doc.createElement( "qgs:geometry" );
@@ -2138,7 +2149,7 @@ QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc
21382149
}
21392150

21402151
QDomElement QgsWFSServer::createFeatureGML3( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes,
2141-
const QgsAttributeList& pkAttributes ) /*const*/
2152+
const QgsAttributeList& pkAttributes, bool isMultiGeom ) /*const*/
21422153
{
21432154
//gml:FeatureMember
21442155
QDomElement featureElement = doc.createElement( "gml:featureMember"/*wfs:FeatureMember*/ );
@@ -2150,6 +2161,12 @@ QDomElement QgsWFSServer::createFeatureGML3( QgsFeature* feat, QDomDocument& doc
21502161
featureElement.appendChild( typeNameElement );
21512162

21522163
const QgsGeometry* geom = feat->constGeometry();
2164+
if ( isMultiGeom && QgsWKBTypes::isSingleType( QGis::fromOldWkbType( geom->wkbType() ) ) )
2165+
{
2166+
QgsGeometry cloneGeom( *geom );
2167+
cloneGeom.convertToMultiType();
2168+
geom = &cloneGeom;
2169+
}
21532170
if ( geom && mWithGeom && mGeometryName != "NONE" )
21542171
{
21552172
QDomElement geomElem = doc.createElement( "qgs:geometry" );

src/server/qgswfsserver.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ class QgsWFSServer: public QgsOWSServer
118118

119119
void startGetFeature( QgsRequestHandler& request, const QString& format, int prec, QgsCoordinateReferenceSystem& crs, QgsRectangle* rect );
120120
void setGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes,
121-
const QgsAttributeList& pkAttributes = QgsAttributeList() );
121+
const QgsAttributeList& pkAttributes = QgsAttributeList(), bool isMultiGeom = false );
122122
void endGetFeature( QgsRequestHandler& request, const QString& format );
123123

124124
//method for transaction
@@ -130,11 +130,11 @@ class QgsWFSServer: public QgsOWSServer
130130

131131
//methods to write GML2
132132
QDomElement createFeatureGML2( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes,
133-
const QgsAttributeList& pkAttributes = QgsAttributeList() ) /*const*/;
133+
const QgsAttributeList& pkAttributes = QgsAttributeList(), bool isMultiGeom = false ) /*const*/;
134134

135135
//methods to write GML3
136136
QDomElement createFeatureGML3( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes,
137-
const QgsAttributeList& pkAttributes = QgsAttributeList() ) /*const*/;
137+
const QgsAttributeList& pkAttributes = QgsAttributeList(), bool isMultiGeom = false ) /*const*/;
138138

139139
//methods to encode value to string for text node
140140
QString encodeValueToText( const QVariant& value );

0 commit comments

Comments
 (0)