Skip to content

Commit ec5a8a4

Browse files
authoredMar 6, 2018
Merge pull request #6544 from manisandro/wms_filter_geom_crs_30
Ensure FILTER_GEOM is transformed to layer CRS in GetFeatureInfo
2 parents 350218d + 6108ed8 commit ec5a8a4

File tree

4 files changed

+40
-8
lines changed

4 files changed

+40
-8
lines changed
 

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

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,6 +1357,16 @@ namespace QgsWms
13571357
return false;
13581358
}
13591359

1360+
QgsFeatureRequest fReq;
1361+
1362+
// Transform filter geometry to layer CRS
1363+
std::unique_ptr<QgsGeometry> layerFilterGeom;
1364+
if ( filterGeom )
1365+
{
1366+
layerFilterGeom.reset( new QgsGeometry( *filterGeom ) );
1367+
layerFilterGeom->transform( QgsCoordinateTransform( mapSettings.destinationCrs(), layer->crs(), fReq.transformContext() ) );
1368+
}
1369+
13601370
//we need a selection rect (0.01 of map width)
13611371
QgsRectangle mapRect = mapSettings.extent();
13621372
QgsRectangle layerRect = mapSettings.mapToLayerCoordinates( layer, mapRect );
@@ -1369,9 +1379,9 @@ namespace QgsWms
13691379
{
13701380
searchRect = featureInfoSearchRect( layer, mapSettings, renderContext, *infoPoint );
13711381
}
1372-
else if ( filterGeom )
1382+
else if ( layerFilterGeom )
13731383
{
1374-
searchRect = filterGeom->boundingBox();
1384+
searchRect = layerFilterGeom->boundingBox();
13751385
}
13761386
else if ( mParameters.contains( QStringLiteral( "BBOX" ) ) )
13771387
{
@@ -1389,8 +1399,7 @@ namespace QgsWms
13891399
bool segmentizeWktGeometry = QgsServerProjectUtils::wmsFeatureInfoSegmentizeWktGeometry( *mProject );
13901400
const QSet<QString> &excludedAttributes = layer->excludeAttributesWms();
13911401

1392-
QgsFeatureRequest fReq;
1393-
bool hasGeometry = addWktGeometry || featureBBox || filterGeom;
1402+
bool hasGeometry = addWktGeometry || featureBBox || layerFilterGeom;
13941403
fReq.setFlags( ( ( hasGeometry ) ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) | QgsFeatureRequest::ExactIntersect );
13951404

13961405
if ( ! searchRect.isEmpty() )
@@ -1402,9 +1411,10 @@ namespace QgsWms
14021411
fReq.setFlags( fReq.flags() & ~ QgsFeatureRequest::ExactIntersect );
14031412
}
14041413

1405-
if ( filterGeom )
1414+
1415+
if ( layerFilterGeom )
14061416
{
1407-
fReq.setFilterExpression( QString( "intersects( $geometry, geom_from_wkt('%1') )" ).arg( filterGeom->asWkt() ) );
1417+
fReq.setFilterExpression( QString( "intersects( $geometry, geom_from_wkt('%1') )" ).arg( layerFilterGeom->asWkt() ) );
14081418
}
14091419

14101420
#ifdef HAVE_SERVER_PYTHON_PLUGINS

‎tests/src/python/test_qgsserver_wms.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,11 +193,20 @@ def test_getfeatureinfo(self):
193193
self.wms_request_compare('GetFeatureInfo',
194194
'&layers=testlayer%20%C3%A8%C3%A9&' +
195195
'INFO_FORMAT=text%2Fxml&' +
196-
'width=600&height=400&srs=EPSG%3A3857&' +
196+
'width=600&height=400&srs=EPSG%3A4326&' +
197197
'query_layers=testlayer%20%C3%A8%C3%A9&' +
198198
'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))',
199199
'wms_getfeatureinfo_geometry_filter')
200200

201+
# Test feature info request with filter geometry in non-layer CRS
202+
self.wms_request_compare('GetFeatureInfo',
203+
'&layers=testlayer%20%C3%A8%C3%A9&' +
204+
'INFO_FORMAT=text%2Fxml&' +
205+
'width=600&height=400&srs=EPSG%3A3857&' +
206+
'query_layers=testlayer%20%C3%A8%C3%A9&' +
207+
'FEATURE_COUNT=10&FILTER_GEOM=POLYGON ((913213.6839952 5606021.5399693, 913215.6988780 5606021.5399693, 913215.6988780 5606015.09643322, 913213.6839952 5606015.0964332, 913213.6839952 5606021.5399693))',
208+
'wms_getfeatureinfo_geometry_filter_3857')
209+
201210
# Test feature info request with invalid query_layer
202211
self.wms_request_compare('GetFeatureInfo',
203212
'&layers=testlayer%20%C3%A8%C3%A9&' +

‎tests/testdata/qgis_server/wms_getfeatureinfo_geometry_filter.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Content-Type: text/xml; charset=utf-8
77
<Attribute name="id" value="2"/>
88
<Attribute name="name" value="two"/>
99
<Attribute name="utf8nameè" value="two àò"/>
10-
<BoundingBox CRS="EPSG:3857" minx="913214.6741" maxx="913214.6741" miny="5606017.8743" maxy="5606017.8743"/>
10+
<BoundingBox CRS="EPSG:4326" minx="8.2035" maxx="8.2035" miny="44.9014" maxy="44.9014"/>
1111
</Feature>
1212
</Layer>
1313
</GetFeatureInfoResponse>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
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+
</Feature>
12+
</Layer>
13+
</GetFeatureInfoResponse>

0 commit comments

Comments
 (0)
Please sign in to comment.