Skip to content

Commit

Permalink
Merge pull request #32431 from qgis/backport-32216-to-release-3_10
Browse files Browse the repository at this point in the history
[Backport release-3_10] [Server] WFS Service: force Geometry to Multi in GML to be compliant with XML schema provided by DescribeFeatureType
  • Loading branch information
rldhont committed Oct 28, 2019
2 parents 672bfda + fb44a93 commit 7118919
Showing 1 changed file with 27 additions and 21 deletions.
48 changes: 27 additions & 21 deletions src/server/services/wfs/qgswfsgetfeature.cpp
Expand Up @@ -35,6 +35,7 @@
#include "qgsogcutils.h"
#include "qgsjsonutils.h"
#include "qgsexpressioncontextutils.h"
#include "qgswkbtypes.h"

#include "qgswfsgetfeature.h"

Expand All @@ -58,6 +59,8 @@ namespace QgsWfs
const QString &geometryName;

const QgsCoordinateReferenceSystem &outputCrs;

bool forceGeomToMulti;
};

QString createFeatureGeoJSON( const QgsFeature &feature, const createFeatureParams &params, const QgsAttributeList &pkAttributes );
Expand Down Expand Up @@ -364,6 +367,8 @@ namespace QgsWfs
outputCrs = QgsCoordinateReferenceSystem::fromOgcWmsCrs( query.srsName );
}

bool forceGeomToMulti = QgsWkbTypes::isMultiType( vlayer->wkbType() );

if ( !featureRequest.filterRect().isEmpty() )
{
QgsCoordinateTransform transform( outputCrs, vlayer->crs(), project );
Expand Down Expand Up @@ -403,7 +408,8 @@ namespace QgsWfs
typeName,
withGeom,
geometryName,
outputCrs
outputCrs,
forceGeomToMulti
};
while ( fit.nextFeature( feature ) && ( aRequest.maxFeatures == -1 || sentFeatures < aRequest.maxFeatures ) )
{
Expand Down Expand Up @@ -1301,23 +1307,23 @@ namespace QgsWfs

QDomElement geomElem = doc.createElement( QStringLiteral( "qgs:geometry" ) );
QDomElement gmlElem;
QgsGeometry cloneGeom( geom );
if ( params.geometryName == QLatin1String( "EXTENT" ) )
{
QgsGeometry bbox = QgsGeometry::fromRect( geom.boundingBox() );
gmlElem = QgsOgcUtils::geometryToGML( bbox, doc, prec );
cloneGeom = QgsGeometry::fromRect( geom.boundingBox() );
}
else if ( params.geometryName == QLatin1String( "CENTROID" ) )
{
QgsGeometry centroid = geom.centroid();
gmlElem = QgsOgcUtils::geometryToGML( centroid, doc, prec );
cloneGeom = geom.centroid();
}
else
else if ( params.forceGeomToMulti && ! QgsWkbTypes::isMultiType( geom.wkbType() ) )
{
const QgsAbstractGeometry *abstractGeom = geom.constGet();
if ( abstractGeom )
{
gmlElem = abstractGeom->asGml2( doc, prec, "http://www.opengis.net/gml" );
}
cloneGeom.convertToMultiType();
}
const QgsAbstractGeometry *abstractGeom = cloneGeom.constGet();
if ( abstractGeom )
{
gmlElem = abstractGeom->asGml2( doc, prec, "http://www.opengis.net/gml" );
}

if ( !gmlElem.isNull() )
Expand Down Expand Up @@ -1403,23 +1409,23 @@ namespace QgsWfs

QDomElement geomElem = doc.createElement( QStringLiteral( "qgs:geometry" ) );
QDomElement gmlElem;
QgsGeometry cloneGeom( geom );
if ( params.geometryName == QLatin1String( "EXTENT" ) )
{
QgsGeometry bbox = QgsGeometry::fromRect( geom.boundingBox() );
gmlElem = QgsOgcUtils::geometryToGML( bbox, doc, QStringLiteral( "GML3" ), prec );
cloneGeom = QgsGeometry::fromRect( geom.boundingBox() );
}
else if ( params.geometryName == QLatin1String( "CENTROID" ) )
{
QgsGeometry centroid = geom.centroid();
gmlElem = QgsOgcUtils::geometryToGML( centroid, doc, QStringLiteral( "GML3" ), prec );
cloneGeom = geom.centroid();
}
else
else if ( params.forceGeomToMulti && ! QgsWkbTypes::isMultiType( geom.wkbType() ) )
{
const QgsAbstractGeometry *abstractGeom = geom.constGet();
if ( abstractGeom )
{
gmlElem = abstractGeom->asGml3( doc, prec, "http://www.opengis.net/gml" );
}
cloneGeom.convertToMultiType();
}
const QgsAbstractGeometry *abstractGeom = cloneGeom.constGet();
if ( abstractGeom )
{
gmlElem = abstractGeom->asGml3( doc, prec, "http://www.opengis.net/gml" );
}

if ( !gmlElem.isNull() )
Expand Down

0 comments on commit 7118919

Please sign in to comment.