Skip to content

Commit

Permalink
[WFS provider] Fix performance issue on initial GetFeature COUNT=1 re…
Browse files Browse the repository at this point in the history
…quest with a BBOX (fixes #50528)
  • Loading branch information
rouault authored and nyalldawson committed Nov 19, 2022
1 parent 76cf2d1 commit 906859b
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 14 deletions.
44 changes: 33 additions & 11 deletions src/providers/wfs/qgswfsprovider.cpp
Expand Up @@ -200,21 +200,43 @@ QgsWFSProvider::QgsWFSProvider( const QString &uri, const ProviderOptions &optio
const QgsFields fieldsBackup = mShared->mFields;
addGMLFields( true );

GetGeometryTypeFromOneFeature( mShared->mWKBType == QgsWkbTypes::Unknown );
const QgsWkbTypes::Type initialGeometryType = mShared->mWKBType;

// If we still didn't get the geometry type, and have a filter, temporarily
// disable the filter.
// See https://github.com/qgis/QGIS/issues/43950
if ( mShared->mWKBType == QgsWkbTypes::Unknown && !mSubsetString.isEmpty() )
// try first without a BBOX, because some servers exhibit very poor
// performance when being requested on a large extent
GetGeometryTypeFromOneFeature( false );
if ( initialGeometryType == QgsWkbTypes::Unknown )
{
const QString oldFilter = mShared->setWFSFilter( QString() );
GetGeometryTypeFromOneFeature( true );
if ( mShared->mWKBType == QgsWkbTypes::Unknown )
bool noGeometryFound = ( mShared->mWKBType == QgsWkbTypes::NoGeometry );
if ( noGeometryFound )
mShared->mWKBType = QgsWkbTypes::Unknown;

// If we still didn't get the geometry type, and have a filter, temporarily
// disable the filter.
// See https://github.com/qgis/QGIS/issues/43950
if ( mShared->mWKBType == QgsWkbTypes::Unknown && !mSubsetString.isEmpty() )
{
const QString oldFilter = mShared->setWFSFilter( QString() );
GetGeometryTypeFromOneFeature( false );
mShared->setWFSFilter( oldFilter );
if ( mShared->mWKBType == QgsWkbTypes::NoGeometry )
{
noGeometryFound = true;
mShared->mWKBType = QgsWkbTypes::Unknown;
}
if ( mShared->mWKBType == QgsWkbTypes::Unknown )
GetGeometryTypeFromOneFeature( true );
mShared->setWFSFilter( oldFilter );
}
else if ( mShared->mWKBType == QgsWkbTypes::Unknown )
GetGeometryTypeFromOneFeature( true );

if ( noGeometryFound && mShared->mWKBType == QgsWkbTypes::Unknown )
mShared->mWKBType = QgsWkbTypes::NoGeometry;
}
else
{
mShared->mWKBType = initialGeometryType;
}
else if ( mShared->mWKBType == QgsWkbTypes::Unknown )
GetGeometryTypeFromOneFeature( false );

// Edit the final mFields to add the description, identifier, name fields
// if they were actually found.
Expand Down
6 changes: 3 additions & 3 deletions tests/src/python/test_provider_wfs.py
Expand Up @@ -1179,7 +1179,7 @@ def testWFS20Paging(self):
""".encode('UTF-8'))

with open(sanitize(endpoint,
'?SERVICE=WFS&REQUEST=GetFeature&VERSION=2.0.0&TYPENAMES=my:typename&STARTINDEX=0&COUNT=1&SRSNAME=urn:ogc:def:crs:EPSG::4326&BBOX=-90,-180,90,180,urn:ogc:def:crs:EPSG::4326'),
'?SERVICE=WFS&REQUEST=GetFeature&VERSION=2.0.0&TYPENAMES=my:typename&STARTINDEX=0&COUNT=1&SRSNAME=urn:ogc:def:crs:EPSG::4326'),
'wb') as f:
f.write("""
<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs/2.0"
Expand Down Expand Up @@ -4374,7 +4374,7 @@ def testGeometryCollectionAsMultiLineString(self):
"""

with open(sanitize(endpoint,
"""?SERVICE=WFS&REQUEST=GetFeature&VERSION=1.1.0&TYPENAME=my:typename&MAXFEATURES=1&SRSNAME=urn:ogc:def:crs:EPSG::4326&BBOX=-90,-180,90,180,urn:ogc:def:crs:EPSG::4326"""),
"""?SERVICE=WFS&REQUEST=GetFeature&VERSION=1.1.0&TYPENAME=my:typename&MAXFEATURES=1&SRSNAME=urn:ogc:def:crs:EPSG::4326"""),
'wb') as f:
f.write(get_features.encode('UTF-8'))

Expand Down Expand Up @@ -5269,7 +5269,7 @@ def testSelectZeroFeature(self):
</wfs:FeatureCollection>""".encode('UTF-8'))

with open(sanitize(endpoint,
"""?SERVICE=WFS&REQUEST=GetFeature&VERSION=2.0.0&TYPENAMES=my:typename&COUNT=1&SRSNAME=urn:ogc:def:crs:EPSG::4326&BBOX=-90,-180,90,180,urn:ogc:def:crs:EPSG::4326"""),
"""?SERVICE=WFS&REQUEST=GetFeature&VERSION=2.0.0&TYPENAMES=my:typename&COUNT=1&SRSNAME=urn:ogc:def:crs:EPSG::4326"""),
'wb') as f:
f.write("""
<wfs:FeatureCollection
Expand Down

0 comments on commit 906859b

Please sign in to comment.