Spatial operators in QGIS expression
Par René-Luc D'Hont le mardi 6 novembre 2012, 17:14 - Système d'Information Géographique (SIG) - Lien permanent
To improve the implementation of the OGC WFS standard in QGIS-Server, I needed to evaluate filters including spatial operators. The Open Geospatial Consortium has defined in the Filter Encoding and Simple Feature Specification for SQL standard a list of spatial operators, who are :
- Equals,
- Disjoint,
- Touches,
- Within,
- Overlaps,
- Crosses,
- Intersects,
- et Contains.
To which must be added BBOX who corresponds to an intersection (Intersects) with the emprise (BoundingBox) of the geometry passed as a parameter.
All these operators require 2 arguments which are 2 geometries that can be:
- that of the geographic object (Feature) for which the expression is evaluated
- a GML2 geometry in the case of Filter Encoding standard, a WKT geometry in the expression case
After coding a QGIS-Server specific implemetation et getting feedback from QGIS contributors, I undertook the implementation of these operators in the QGIS expression système. These developments are currently on my QGIS github repository but already fonctional. And here are some examples.
QGIS Window Expression constructor. In the list of available operators, you will find in the geometry category the new spatial operators $geometry, geomFromWKT, geomFromGML2, bbox, disjoint, etc.
To achieve these examples, I chose a dataset form Montpellier OpenData :
- Sous-quartiers (Sub-districts), this data represents the administrative sub-division of the city of Montpellier.
In the layer metadata, we find the following extent :
- xMin,yMin 765145.88,6274561.22
- xMax,yMax 776031.67,6284189.52
We will first use it to select sub-districts on the diagonal xMin,yMin xMax,yMax, which gives the expression :
- intersects( $geometry, geomFromWKT( 'LINESTRING(765145.88 6274561.22, 776031.67 6284189.52)' ) )
If you want to select all elements, you can write:
- bbox( $geometry, geomFromWKT( 'LINESTRING(765145.88 6274561.22, 776031.67 6284189.52)' ) )
But it is also possible to use these expressions in set of style rules, with such expressions:
- intersects( $geometry, geomFromWKT( 'POLYGON
' ) )
- NOT intersects( $geometry, geomFromWKT( 'POLYGON
' ) )
Color is thus associated with each of these expressions which can easily styled Northwest and Southeast sub-districts of Montpellier.
You can also add the selection on the diagonal with a priority higher than the other:
- intersects( $geometry, geomFromWKT( 'LINESTRING(765145.88 6274561.22, 776031.67 6284189.52)' ) )
And get this:
This kind of thing was necessary to the WFS in QGIS-Server but now we can imagine extending these spatial operators by adding transformer like:
- exportToWKT
- buffer
- centroid
- convexhull
- distance
- simplify
To create content or complexify spatial queries.