Skip to content

Commit a2d00d5

Browse files
authoredJun 26, 2017
Merge pull request #4772 from mhugent/feature_info_filter_geometry
WMS Server: Feature info with geometry filter
2 parents 1730bc9 + e7ea972 commit a2d00d5

File tree

4 files changed

+46
-5
lines changed

4 files changed

+46
-5
lines changed
 

‎src/server/services/wms/qgswmsrenderer.cpp

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,13 @@ namespace QgsWms
715715
j = -1;
716716
}
717717

718+
//read FILTER_GEOM
719+
std::unique_ptr<QgsGeometry> filterGeom;
720+
if ( mParameters.contains( QStringLiteral( "FILTER_GEOM" ) ) )
721+
{
722+
filterGeom.reset( new QgsGeometry( QgsGeometry::fromWkt( mParameters.value( QStringLiteral( "FILTER_GEOM" ) ) ) ) );
723+
}
724+
718725
//In case the output image is distorted (WIDTH/HEIGHT ratio not equal to BBOX width/height), I and J need to be adapted as well
719726
int widthParam = mParameters.value( "WIDTH", "-1" ).toInt();
720727
int heightParam = mParameters.value( "HEIGHT", "-1" ).toInt();
@@ -736,7 +743,7 @@ namespace QgsWms
736743
{
737744
featuresRect.reset( new QgsRectangle() );
738745
}
739-
else
746+
else if ( !filterGeom.get() )
740747
{
741748
throw QgsBadRequestException( QStringLiteral( "ParameterMissing" ),
742749
QStringLiteral( "I/J parameters are required for GetFeatureInfo" ) );
@@ -871,7 +878,7 @@ namespace QgsWms
871878

872879
if ( vectorLayer )
873880
{
874-
if ( !featureInfoFromVectorLayer( vectorLayer, infoPoint.get(), featureCount, result, layerElement, mapSettings, renderContext, version, infoFormat, featuresRect.get() ) )
881+
if ( !featureInfoFromVectorLayer( vectorLayer, infoPoint.get(), featureCount, result, layerElement, mapSettings, renderContext, version, infoFormat, featuresRect.get(), filterGeom.get() ) )
875882
{
876883
continue;
877884
}
@@ -1246,7 +1253,8 @@ namespace QgsWms
12461253
QgsRenderContext &renderContext,
12471254
const QString &version,
12481255
const QString &infoFormat,
1249-
QgsRectangle *featureBBox ) const
1256+
QgsRectangle *featureBBox,
1257+
QgsGeometry *filterGeom ) const
12501258
{
12511259
if ( !layer )
12521260
{
@@ -1265,6 +1273,10 @@ namespace QgsWms
12651273
{
12661274
searchRect = featureInfoSearchRect( layer, mapSettings, renderContext, *infoPoint );
12671275
}
1276+
else if ( filterGeom )
1277+
{
1278+
searchRect = filterGeom->boundingBox();
1279+
}
12681280
else if ( mParameters.contains( QStringLiteral( "BBOX" ) ) )
12691281
{
12701282
searchRect = layerRect;
@@ -1282,7 +1294,7 @@ namespace QgsWms
12821294
const QSet<QString> &excludedAttributes = layer->excludeAttributesWms();
12831295

12841296
QgsFeatureRequest fReq;
1285-
bool hasGeometry = addWktGeometry || featureBBox;
1297+
bool hasGeometry = addWktGeometry || featureBBox || filterGeom;
12861298
fReq.setFlags( ( ( hasGeometry ) ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) | QgsFeatureRequest::ExactIntersect );
12871299

12881300
if ( ! searchRect.isEmpty() )
@@ -1294,6 +1306,11 @@ namespace QgsWms
12941306
fReq.setFlags( fReq.flags() & ~ QgsFeatureRequest::ExactIntersect );
12951307
}
12961308

1309+
if ( filterGeom )
1310+
{
1311+
fReq.setFilterExpression( QString( "intersects( $geometry, geom_from_wkt('%1') )" ).arg( filterGeom->exportToWkt() ) );
1312+
}
1313+
12971314
#ifdef HAVE_SERVER_PYTHON_PLUGINS
12981315
mAccessControl->filterFeatures( layer, fReq );
12991316

‎src/server/services/wms/qgswmsrenderer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,8 @@ namespace QgsWms
223223
QgsRenderContext &renderContext,
224224
const QString &version,
225225
const QString &infoFormat,
226-
QgsRectangle *featureBBox = nullptr ) const;
226+
QgsRectangle *featureBBox = nullptr,
227+
QgsGeometry *filterGeom = nullptr ) const;
227228
//! Appends feature info xml for the layer to the layer element of the dom document
228229
bool featureInfoFromRasterLayer( QgsRasterLayer *layer,
229230
const QgsMapSettings &mapSettings,

‎tests/src/python/test_qgsserver_wms.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,15 @@ def test_project_wms(self):
126126
'FEATURE_COUNT=10&FILTER=testlayer%20%C3%A8%C3%A9' + urllib.parse.quote(':"NAME" = \'two\' OR "utf8nameè" = \'three èé↓\''),
127127
'wms_getfeatureinfo_filter_or_utf8')
128128

129+
# Test feature info request with filter geometry
130+
self.wms_request_compare('GetFeatureInfo',
131+
'&layers=testlayer%20%C3%A8%C3%A9&' +
132+
'INFO_FORMAT=text%2Fxml&' +
133+
'width=600&height=400&srs=EPSG%3A3857&' +
134+
'query_layers=testlayer%20%C3%A8%C3%A9&' +
135+
'FEATURE_COUNT=10&FILTER_GEOM=POLYGON((8.2035381 44.901459,8.2035562 44.901459,8.2035562 44.901418,8.2035381 44.901418,8.2035381 44.901459))',
136+
'wms_getfeatureinfo_geometry_filter')
137+
129138
# Test DescribeLayer
130139
self.wms_request_compare('DescribeLayer',
131140
'&layers=testlayer%20%C3%A8%C3%A9&' +
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
Content-Length: 261
2+
Content-Type: text/xml; charset=utf-8
3+
4+
<GetFeatureInfoResponse>
5+
<Layer name="testlayer èé">
6+
<Feature id="1">
7+
<Attribute name="id" value="2"/>
8+
<Attribute name="name" value="two"/>
9+
<Attribute name="utf8nameè" value="two àò"/>
10+
<BoundingBox CRS="EPSG:3857" minx="913214.6741" maxx="913214.6741" miny="5606017.8743" maxy="5606017.8743"/>
11+
<Attribute name="geometry" value="Point (913214.6741 5606017.8743)" type="derived"/>
12+
</Feature>
13+
</Layer>
14+
</GetFeatureInfoResponse>

0 commit comments

Comments
 (0)
Please sign in to comment.