Skip to content

Commit 36b0c3c

Browse files
committed
[BUGFIX][QGIS Server] WFS DescribeFeatureType Geometry element type
In the OGR provider, we can read: ``` Some ogr drivers (e.g. GML) are not able to determine the geometry type of a layer like this. In such cases, we use virtual sublayers for each geometry if the layer contains multiple geometries (see subLayers) otherwise we guess geometry type from first feature ``` It means that in DescribeFeatureType Geometry element can be describe as simple and the GML contains simple and multi. It's not XML valid. To fix it, for OGR provider Geometry element type is set to `gml:GeometryPropertyType` For the next release, it will be interesting to allow users to specify whether the geometries are multi.
1 parent 8fc5381 commit 36b0c3c

File tree

2 files changed

+54
-44
lines changed

2 files changed

+54
-44
lines changed

src/server/qgswfsprojectparser.cpp

Lines changed: 53 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -400,40 +400,50 @@ void QgsWFSProjectParser::describeFeatureType( const QString& aTypeName, QDomEle
400400
extensionElem.appendChild( sequenceElem );
401401

402402
//xsd:element
403-
QDomElement geomElem = doc.createElement( "element"/*xsd:element*/ );
404-
geomElem.setAttribute( "name", "geometry" );
405-
QGis::WkbType wkbType = layer->wkbType();
406-
if ( wkbType != QGis::WKBNoGeometry )
403+
if ( layer->hasGeometryType() )
407404
{
408-
switch ( wkbType )
405+
QDomElement geomElem = doc.createElement( "element"/*xsd:element*/ );
406+
geomElem.setAttribute( "name", "geometry" );
407+
if ( provider->name() == "ogr" )
408+
{
409+
// because some ogr drivers (e.g. ESRI ShapeFile, GML)
410+
// are not able to determine the geometry type of a layer.
411+
// we set to GeometryType
412+
geomElem.setAttribute( "type", "gml:GeometryPropertyType" );
413+
}
414+
else
409415
{
410-
case QGis::WKBPoint25D:
411-
case QGis::WKBPoint:
412-
geomElem.setAttribute( "type", "gml:PointPropertyType" );
413-
break;
414-
case QGis::WKBLineString25D:
415-
case QGis::WKBLineString:
416-
geomElem.setAttribute( "type", "gml:LineStringPropertyType" );
417-
break;
418-
case QGis::WKBPolygon25D:
419-
case QGis::WKBPolygon:
420-
geomElem.setAttribute( "type", "gml:PolygonPropertyType" );
421-
break;
422-
case QGis::WKBMultiPoint25D:
423-
case QGis::WKBMultiPoint:
424-
geomElem.setAttribute( "type", "gml:MultiPointPropertyType" );
425-
break;
426-
case QGis::WKBMultiLineString25D:
427-
case QGis::WKBMultiLineString:
428-
geomElem.setAttribute( "type", "gml:MultiLineStringPropertyType" );
429-
break;
430-
case QGis::WKBMultiPolygon25D:
431-
case QGis::WKBMultiPolygon:
432-
geomElem.setAttribute( "type", "gml:MultiPolygonPropertyType" );
433-
break;
434-
default:
435-
geomElem.setAttribute( "type", "gml:GeometryPropertyType" );
436-
break;
416+
QGis::WkbType wkbType = layer->wkbType();
417+
switch ( wkbType )
418+
{
419+
case QGis::WKBPoint25D:
420+
case QGis::WKBPoint:
421+
geomElem.setAttribute( "type", "gml:PointPropertyType" );
422+
break;
423+
case QGis::WKBLineString25D:
424+
case QGis::WKBLineString:
425+
geomElem.setAttribute( "type", "gml:LineStringPropertyType" );
426+
break;
427+
case QGis::WKBPolygon25D:
428+
case QGis::WKBPolygon:
429+
geomElem.setAttribute( "type", "gml:PolygonPropertyType" );
430+
break;
431+
case QGis::WKBMultiPoint25D:
432+
case QGis::WKBMultiPoint:
433+
geomElem.setAttribute( "type", "gml:MultiPointPropertyType" );
434+
break;
435+
case QGis::WKBMultiLineString25D:
436+
case QGis::WKBMultiLineString:
437+
geomElem.setAttribute( "type", "gml:MultiLineStringPropertyType" );
438+
break;
439+
case QGis::WKBMultiPolygon25D:
440+
case QGis::WKBMultiPolygon:
441+
geomElem.setAttribute( "type", "gml:MultiPolygonPropertyType" );
442+
break;
443+
default:
444+
geomElem.setAttribute( "type", "gml:GeometryPropertyType" );
445+
break;
446+
}
437447
}
438448
geomElem.setAttribute( "minOccurs", "0" );
439449
geomElem.setAttribute( "maxOccurs", "1" );
@@ -453,30 +463,30 @@ void QgsWFSProjectParser::describeFeatureType( const QString& aTypeName, QDomEle
453463
}
454464

455465
//xsd:element
456-
QDomElement geomElem = doc.createElement( "element"/*xsd:element*/ );
457-
geomElem.setAttribute( "name", attributeName );
466+
QDomElement attElem = doc.createElement( "element"/*xsd:element*/ );
467+
attElem.setAttribute( "name", attributeName );
458468
QVariant::Type attributeType = fields[idx].type();
459469
if ( attributeType == QVariant::Int )
460-
geomElem.setAttribute( "type", "integer" );
470+
attElem.setAttribute( "type", "integer" );
461471
else if ( attributeType == QVariant::Double )
462-
geomElem.setAttribute( "type", "double" );
472+
attElem.setAttribute( "type", "double" );
463473
else if ( attributeType == QVariant::Bool )
464-
geomElem.setAttribute( "type", "boolean" );
474+
attElem.setAttribute( "type", "boolean" );
465475
else if ( attributeType == QVariant::Date )
466-
geomElem.setAttribute( "type", "date" );
476+
attElem.setAttribute( "type", "date" );
467477
else if ( attributeType == QVariant::Time )
468-
geomElem.setAttribute( "type", "time" );
478+
attElem.setAttribute( "type", "time" );
469479
else if ( attributeType == QVariant::DateTime )
470-
geomElem.setAttribute( "type", "dateTime" );
480+
attElem.setAttribute( "type", "dateTime" );
471481
else
472-
geomElem.setAttribute( "type", "string" );
482+
attElem.setAttribute( "type", "string" );
473483

474-
sequenceElem.appendChild( geomElem );
484+
sequenceElem.appendChild( attElem );
475485

476486
QString alias = layer->attributeAlias( idx );
477487
if ( !alias.isEmpty() )
478488
{
479-
geomElem.setAttribute( "alias", alias );
489+
attElem.setAttribute( "alias", alias );
480490
}
481491
}
482492
}

tests/testdata/qgis_server/wfs_describefeaturetype.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Content-Type: text/xml; charset=utf-8
88
<complexContent>
99
<extension base="gml:AbstractFeatureType">
1010
<sequence>
11-
<element minOccurs="0" maxOccurs="1" type="gml:PointPropertyType" name="geometry"/>
11+
<element minOccurs="0" maxOccurs="1" type="gml:GeometryPropertyType" name="geometry"/>
1212
<element type="integer" name="id"/>
1313
<element type="string" name="name"/>
1414
<element type="string" name="utf8nameè"/>

0 commit comments

Comments
 (0)