39
39
#include " qgsogcutils.h"
40
40
#include " qgsaccesscontrol.h"
41
41
#include " qgsjsonutils.h"
42
+ #include " qgswkbtypes.h"
42
43
43
44
#include < QImage>
44
45
#include < QPainter>
@@ -582,6 +583,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
582
583
}
583
584
layerCrs = layer->crs ();
584
585
586
+ bool isMultiGeom = QgsWKBTypes::isMultiType ( QGis::fromOldWkbType ( layer->wkbType () ) );
587
+
585
588
QgsFeatureRequest fReq ;
586
589
#ifdef HAVE_SERVER_PYTHON_PLUGINS
587
590
fReq .setFlags ( QgsFeatureRequest::ExactIntersect | ( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) );
@@ -629,7 +632,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
629
632
if ( featureCounter == 0 )
630
633
startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
631
634
632
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes () );
635
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes (), isMultiGeom );
633
636
634
637
fid = " " ;
635
638
++featCounter;
@@ -722,7 +725,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
722
725
723
726
if ( featureCounter >= startIndex )
724
727
{
725
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes () );
728
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes (), isMultiGeom );
726
729
++featCounter;
727
730
}
728
731
++featureCounter;
@@ -740,7 +743,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
740
743
741
744
if ( featureCounter >= startIndex )
742
745
{
743
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes () );
746
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes (), isMultiGeom );
744
747
++featCounter;
745
748
}
746
749
++featureCounter;
@@ -1007,6 +1010,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1007
1010
searchRect.yMaximum () + 1 . / pow ( 10 ., layerPrec ) );
1008
1011
layerCrs = layer->crs ();
1009
1012
1013
+ bool isMultiGeom = QgsWKBTypes::isMultiType ( QGis::fromOldWkbType ( layer->wkbType () ) );
1014
+
1010
1015
if ( featureIdOk )
1011
1016
{
1012
1017
Q_FOREACH ( const QString &fidStr, featureIdList )
@@ -1023,7 +1028,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1023
1028
if ( featureCounter == 0 )
1024
1029
startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
1025
1030
1026
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes () );
1031
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes (), isMultiGeom );
1027
1032
++featCounter;
1028
1033
++featureCounter;
1029
1034
}
@@ -1072,7 +1077,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1072
1077
1073
1078
if ( featureCounter >= startIndex )
1074
1079
{
1075
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes () );
1080
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes (), isMultiGeom );
1076
1081
++featCounter;
1077
1082
}
1078
1083
++featureCounter;
@@ -1109,7 +1114,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1109
1114
if ( featureCounter == 0 )
1110
1115
startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
1111
1116
1112
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes () );
1117
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes (), isMultiGeom );
1113
1118
1114
1119
fid = " " ;
1115
1120
++featCounter;
@@ -1148,7 +1153,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1148
1153
1149
1154
if ( featureCounter >= startIndex )
1150
1155
{
1151
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes () );
1156
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes (), isMultiGeom );
1152
1157
++featCounter;
1153
1158
}
1154
1159
++featureCounter;
@@ -1197,7 +1202,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1197
1202
1198
1203
if ( featureCounter >= startIndex )
1199
1204
{
1200
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes () );
1205
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes (), isMultiGeom );
1201
1206
++featCounter;
1202
1207
}
1203
1208
++featureCounter;
@@ -1236,7 +1241,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1236
1241
1237
1242
if ( featureCounter >= startIndex )
1238
1243
{
1239
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes () );
1244
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes (), isMultiGeom );
1240
1245
++featCounter;
1241
1246
}
1242
1247
++featureCounter;
@@ -1413,7 +1418,7 @@ void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& f
1413
1418
}
1414
1419
1415
1420
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*/
1417
1422
{
1418
1423
if ( !feat->isValid () )
1419
1424
return ;
@@ -1443,12 +1448,12 @@ void QgsWFSServer::setGetFeature( QgsRequestHandler& request, const QString& for
1443
1448
QDomElement featureElement;
1444
1449
if ( format == " GML3" )
1445
1450
{
1446
- featureElement = createFeatureGML3 ( feat, gmlDoc, prec, crs, attrIndexes, pkAttributes );
1451
+ featureElement = createFeatureGML3 ( feat, gmlDoc, prec, crs, attrIndexes, pkAttributes, isMultiGeom );
1447
1452
gmlDoc.appendChild ( featureElement );
1448
1453
}
1449
1454
else
1450
1455
{
1451
- featureElement = createFeatureGML2 ( feat, gmlDoc, prec, crs, attrIndexes, pkAttributes );
1456
+ featureElement = createFeatureGML2 ( feat, gmlDoc, prec, crs, attrIndexes, pkAttributes, isMultiGeom );
1452
1457
gmlDoc.appendChild ( featureElement );
1453
1458
}
1454
1459
@@ -2054,7 +2059,7 @@ QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, int prec, QgsCoord
2054
2059
}
2055
2060
2056
2061
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*/
2058
2063
{
2059
2064
// gml:FeatureMember
2060
2065
QDomElement featureElement = doc.createElement ( " gml:featureMember" /* wfs:FeatureMember*/ );
@@ -2066,6 +2071,12 @@ QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc
2066
2071
featureElement.appendChild ( typeNameElement );
2067
2072
2068
2073
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
+ }
2069
2080
if ( geom && mWithGeom && mGeometryName != " NONE" )
2070
2081
{
2071
2082
QDomElement geomElem = doc.createElement ( " qgs:geometry" );
@@ -2138,7 +2149,7 @@ QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc
2138
2149
}
2139
2150
2140
2151
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*/
2142
2153
{
2143
2154
// gml:FeatureMember
2144
2155
QDomElement featureElement = doc.createElement ( " gml:featureMember" /* wfs:FeatureMember*/ );
@@ -2150,6 +2161,12 @@ QDomElement QgsWFSServer::createFeatureGML3( QgsFeature* feat, QDomDocument& doc
2150
2161
featureElement.appendChild ( typeNameElement );
2151
2162
2152
2163
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
+ }
2153
2170
if ( geom && mWithGeom && mGeometryName != " NONE" )
2154
2171
{
2155
2172
QDomElement geomElem = doc.createElement ( " qgs:geometry" );
0 commit comments