Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[Bugfix][Server][WFS] In GML geometry has all to be multi
If in the layer level, the geometry is defined as multi, in the GML all the geometry has to be converted to multi.
  • Loading branch information
rldhont committed Oct 22, 2018
1 parent c23c3d2 commit 55928c0
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 17 deletions.
45 changes: 31 additions & 14 deletions src/server/qgswfsserver.cpp
Expand Up @@ -39,6 +39,7 @@
#include "qgsogcutils.h"
#include "qgsaccesscontrol.h"
#include "qgsjsonutils.h"
#include "qgswkbtypes.h"

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

bool isMultiGeom = QgsWKBTypes::isMultiType( QGis::fromOldWkbType( layer->wkbType() ) );

QgsFeatureRequest fReq;
#ifdef HAVE_SERVER_PYTHON_PLUGINS
fReq.setFlags( QgsFeatureRequest::ExactIntersect | ( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) );
Expand Down Expand Up @@ -629,7 +632,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
if ( featureCounter == 0 )
startGetFeature( request, format, layerPrec, layerCrs, &searchRect );

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

fid = "";
++featCounter;
Expand Down Expand Up @@ -722,7 +725,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format

if ( featureCounter >= startIndex )
{
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
++featCounter;
}
++featureCounter;
Expand All @@ -740,7 +743,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format

if ( featureCounter >= startIndex )
{
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
++featCounter;
}
++featureCounter;
Expand Down Expand Up @@ -1007,6 +1010,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
searchRect.yMaximum() + 1. / pow( 10., layerPrec ) );
layerCrs = layer->crs();

bool isMultiGeom = QgsWKBTypes::isMultiType( QGis::fromOldWkbType( layer->wkbType() ) );

if ( featureIdOk )
{
Q_FOREACH ( const QString &fidStr, featureIdList )
Expand All @@ -1023,7 +1028,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
if ( featureCounter == 0 )
startGetFeature( request, format, layerPrec, layerCrs, &searchRect );

setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
++featCounter;
++featureCounter;
}
Expand Down Expand Up @@ -1072,7 +1077,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format

if ( featureCounter >= startIndex )
{
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
++featCounter;
}
++featureCounter;
Expand Down Expand Up @@ -1109,7 +1114,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
if ( featureCounter == 0 )
startGetFeature( request, format, layerPrec, layerCrs, &searchRect );

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

fid = "";
++featCounter;
Expand Down Expand Up @@ -1148,7 +1153,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format

if ( featureCounter >= startIndex )
{
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
++featCounter;
}
++featureCounter;
Expand Down Expand Up @@ -1197,7 +1202,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format

if ( featureCounter >= startIndex )
{
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
++featCounter;
}
++featureCounter;
Expand Down Expand Up @@ -1236,7 +1241,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format

if ( featureCounter >= startIndex )
{
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
++featCounter;
}
++featureCounter;
Expand Down Expand Up @@ -1413,7 +1418,7 @@ void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& f
}

void QgsWFSServer::setGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes,
const QgsAttributeList& pkAttributes ) /*const*/
const QgsAttributeList& pkAttributes, bool isMultiGeom ) /*const*/
{
if ( !feat->isValid() )
return;
Expand Down Expand Up @@ -1443,12 +1448,12 @@ void QgsWFSServer::setGetFeature( QgsRequestHandler& request, const QString& for
QDomElement featureElement;
if ( format == "GML3" )
{
featureElement = createFeatureGML3( feat, gmlDoc, prec, crs, attrIndexes, pkAttributes );
featureElement = createFeatureGML3( feat, gmlDoc, prec, crs, attrIndexes, pkAttributes, isMultiGeom );
gmlDoc.appendChild( featureElement );
}
else
{
featureElement = createFeatureGML2( feat, gmlDoc, prec, crs, attrIndexes, pkAttributes );
featureElement = createFeatureGML2( feat, gmlDoc, prec, crs, attrIndexes, pkAttributes, isMultiGeom );
gmlDoc.appendChild( featureElement );
}

Expand Down Expand Up @@ -2054,7 +2059,7 @@ QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, int prec, QgsCoord
}

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

const QgsGeometry* geom = feat->constGeometry();
if ( isMultiGeom && QgsWKBTypes::isSingleType( QGis::fromOldWkbType( geom->wkbType() ) ) )
{
QgsGeometry cloneGeom( *geom );
cloneGeom.convertToMultiType();
geom = &cloneGeom;
}
if ( geom && mWithGeom && mGeometryName != "NONE" )
{
QDomElement geomElem = doc.createElement( "qgs:geometry" );
Expand Down Expand Up @@ -2138,7 +2149,7 @@ QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc
}

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

const QgsGeometry* geom = feat->constGeometry();
if ( isMultiGeom && QgsWKBTypes::isSingleType( QGis::fromOldWkbType( geom->wkbType() ) ) )
{
QgsGeometry cloneGeom( *geom );
cloneGeom.convertToMultiType();
geom = &cloneGeom;
}
if ( geom && mWithGeom && mGeometryName != "NONE" )
{
QDomElement geomElem = doc.createElement( "qgs:geometry" );
Expand Down
6 changes: 3 additions & 3 deletions src/server/qgswfsserver.h
Expand Up @@ -118,7 +118,7 @@ class QgsWFSServer: public QgsOWSServer

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

//method for transaction
Expand All @@ -130,11 +130,11 @@ class QgsWFSServer: public QgsOWSServer

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

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

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

0 comments on commit 55928c0

Please sign in to comment.