Home | Docs | Issue Tracker | FAQ | Download | |
Author: | Jeff McKenna |
---|---|
Contact: | jmckenna at gatewaygeomatics.com |
Author: | Yewondwossen Assefa |
Contact: | assefa at dmsolutions.ca |
Last Updated: | 2010-10-07 |
Date: | $Date$ |
Table of Contents
This document describes the procedures for taking advantage of the Filter Encoding (FE) support in WFS GetFeature requests, which was added to MapServer in version 4.2.
This document assumes that you are already familiar with the following aspects of MapServer:
The following table lists the currently supported features for FE.
Table 1. Currently Supported Features
Feature Set | Feature |
---|---|
Spatial Capabilities | |
Equals | |
Disjoint | |
Touches | |
Within | |
Overlaps | |
Crosses | |
Intersects | |
Contains | |
DWithin | |
BBOX | |
Scalar Capabilities | |
Logical Operators | |
And | |
Or | |
Not | |
Comparison Operators | |
PropertyIsEqualTo (=) | |
PropertyIsNotEqualTo (<>) | |
PropertyIsLessThan (<) | |
PropertyIsGreaterThan (>) | |
PropertyIsLessThanOrEqualTo (<=) | |
PropertyIsGreaterThanOrEqualTo (>=) | |
PropertyIsLike | |
PropertyIsBetween (range) |
The following units of measure are supported:
m or meters | meters |
km or kilometers | kilometers |
NM | nauticalmiles |
mi or miles | miles |
in or inches | inches |
ft or feet | feet |
deg or dd | degree |
px | pixels |
MapServer already has the capability to receive and parse Get requests and URL-encoded Post requests. The ability for MapServer to be able to receive Post requests with XML-encoded information sent in the body of the request has been added. Also, the ability to generate XML-encoded Post requests for WFS layers has been added.
Both Get and Post request are now supported for all WFS requests:
Supporting these WFS requests in Post was implemented to keep consistency between all supported WFS requests.
When sending requests, the default request method used is Post. To change this behavior, we have introduced a layer level meta data, wfs_request_method, which can be set to “GET”.
This section describes how to use FE on both the server and client sides.
To be able to use Filter Encoding, you need to create a valid WFS server using MapServer. Please refer to the WFS Server HOWTO for specifics.
There is nothing special that should be added to a WFS server for Filter Encoding, but you should note that, when requesting the capabilities of your WFS server, the document returned should contain the supported filters. Here is part of a Capabilities document (note the “Filter_Capabilities” section):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | <?xml version="1.0" encoding="ISO-8859-1"?>
<WFS_Capabilities version="1.0.0" updateSequence="0"
xmlns="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wfs
http://schemas.opengis.net/wfs/1.0.0/WFS-capabilities.xsd">
<!-- MapServer version 5.6.5 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP
OUTPUT=SWF OUTPUT=SVG SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE
SUPPORTS=ICONV SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT
SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER
SUPPORTS=GEOS SUPPORTS=RGBA_PNG INPUT=EPPL7 INPUT=POSTGIS INPUT=OGR
INPUT=GDAL INPUT=SHAPEFILE -->
<Service>
<Name>MapServer WFS</Name>
<Title>WMS Demo Server for MapServer</Title>
<Abstract>This demonstration server showcases MapServer (www.mapserver.org)
and its OGC support</Abstract>
<OnlineResource>http://demo.mapserver.org/cgi-bin/wfs?</OnlineResource>
</Service>
<Capability>
<Request>
<GetCapabilities>
<DCPType>
<HTTP>
<Get onlineResource="http://demo.mapserver.org/cgi-bin/wfs?"/>
</HTTP>
</DCPType>
<DCPType>
<HTTP>
<Post onlineResource="http://demo.mapserver.org/cgi-bin/wfs?"/>
</HTTP>
</DCPType>
</GetCapabilities>
...
</Request>
</Capability>
...
<ogc:Filter_Capabilities>
<ogc:Spatial_Capabilities>
<ogc:Spatial_Operators>
<ogc:Equals/>
<ogc:Disjoint/>
<ogc:Touches/>
<ogc:Within/>
<ogc:Overlaps/>
<ogc:Crosses/>
<ogc:Intersects/>
<ogc:Contains/>
<ogc:DWithin/>
<ogc:BBOX/>
</ogc:Spatial_Operators>
</ogc:Spatial_Capabilities>
<ogc:Scalar_Capabilities>
<ogc:Logical_Operators/>
<ogc:Comparison_Operators>
<ogc:Simple_Comparisons/>
<ogc:Like/>
<ogc:Between/>
</ogc:Comparison_Operators>
</ogc:Scalar_Capabilities>
</ogc:Filter_Capabilities>
</WFS_Capabilities>
|
To be able to generate a Filter to a WFS server, a layer level metadata called wfs_filter has been added, which should contain the filter to be sent to the server. Following is an example of a valid WFS client layer with a filter:
LAYER
NAME "cities"
TYPE POINT
STATUS ON
CONNECTION "http://demo.mapserver.org/cgi-bin/wfs?"
CONNECTIONTYPE WFS
METADATA
"wfs_typename" "cities"
"wfs_version" "1.0.0"
"wfs_connectiontimeout" "60"
"wfs_maxfeatures" "100"
"wfs_filter" "<PropertyIsGreaterThan><PropertyName>POPULATION</PropertyName>
<Literal>10000000</Literal></PropertyIsGreaterThan>"
END
PROJECTION
"init=epsg:4326"
END
LABELITEM 'NAME'
CLASS
NAME 'World Cities'
STYLE
COLOR 255 128 128
OUTLINECOLOR 128 0 0
SYMBOL 'circle'
SIZE 9
END
LABEL
COLOR 0 0 0
OUTLINECOLOR 255 255 255
TYPE TRUETYPE
FONT sans
SIZE 7
POSITION UC
PARTIALS FALSE
END
END
END
Note:
Here are some test URLs for the different supported filters:
http://demo.mapserver.org/cgi-bin/wfs?&VERSION=1.0.0&SERVICE=WFS
&REQUEST=GetFeature&TYPENAME=cities&Filter=<Filter>
<PropertyIsEqualTo><PropertyName>NAME</PropertyName>
<Literal>Halifax</Literal></PropertyIsEqualTo></Filter>
http://demo.mapserver.org/cgi-bin/wfs?&VERSION=1.0.0&SERVICE=WFS
&REQUEST=GetFeature&TYPENAME=cities&Filter=<Filter>
<PropertyIsNotEqualTo><PropertyName>NAME</PropertyName>
<Literal>Halifax</Literal></PropertyIsNotEqualTo></Filter>
http://demo.mapserver.org/cgi-bin/wfs?&VERSION=1.0.0&SERVICE=WFS
&REQUEST=GetFeature&TYPENAME=cities&Filter=<Filter>
<PropertyIsLessThan><PropertyName>POPULATION</PropertyName>
<Literal>1000</Literal></PropertyIsLessThan></Filter>
http://demo.mapserver.org/cgi-bin/wfs?&VERSION=1.0.0&SERVICE=WFS
&REQUEST=GetFeature&TYPENAME=cities&Filter=<Filter>
<PropertyIsGreaterThan><PropertyName>POPULATION</PropertyName>
<Literal>10000000</Literal></PropertyIsGreaterThan></Filter>
http://demo.mapserver.org/cgi-bin/wfs?&VERSION=1.0.0&SERVICE=WFS
&REQUEST=GetFeature&TYPENAME=cities&Filter=<Filter>
<PropertyIsLessThanOrEqualTo><PropertyName>POPULATION</PropertyName>
<Literal>499</Literal></PropertyIsLessThanOrEqualTo></Filter>
http://demo.mapserver.org/cgi-bin/wfs?&VERSION=1.0.0&SERVICE=WFS
&REQUEST=GetFeature&TYPENAME=cities&Filter=<Filter>
<PropertyIsGreaterThanOrEqualTo><PropertyName>POPULATION</PropertyName>
<Literal>10194978</Literal></PropertyIsGreaterThanOrEqualTo></Filter>
http://demo.mapserver.org/cgi-bin/wfs?&VERSION=1.0.0&SERVICE=WFS
&REQUEST=GetFeature&TYPENAME=cities&Filter=<Filter>
<PropertyIsBetween><PropertyName>POPULATION</PropertyName>
<LowerBoundary>10194978</LowerBoundary>
<UpperBoundary>12116379</UpperBoundary></PropertyIsBetween></Filter>
http://demo.mapserver.org/cgi-bin/wfs?&VERSION=1.0.0&SERVICE=WFS
&REQUEST=GetFeature&TYPENAME=cities&Filter=<Filter>
<PropertyIsLike wildcard='*' singleChar='.' escape='!'>
<PropertyName>NAME</PropertyName><Literal>Syd*</Literal></PropertyIsLike>
</Filter>
http://demo.mapserver.org/cgi-bin/wfs?&VERSION=1.0.0&SERVICE=WFS
&REQUEST=GetFeature&TYPENAME=cities&Filter=<Filter>
<OR><PropertyIsEqualTo><PropertyName>NAME</PropertyName>
<Literal>Sydney</Literal></PropertyIsEqualTo><PropertyIsEqualTo>
<PropertyName>NAME</PropertyName><Literal>Halifax</Literal>
</PropertyIsEqualTo></OR></Filter>
http://demo.mapserver.org/cgi-bin/wfs?&VERSION=1.0.0&SERVICE=WFS
&REQUEST=GetFeature&TYPENAME=cities&Filter=<Filter>
<AND><PropertyIsLike wildcard='*' singleChar='.' escape='!'>
<PropertyName>NAME</PropertyName><Literal>Syd*</Literal></PropertyIsLike>
<PropertyIsEqualTo><PropertyName>POPULATION</PropertyName>
<Literal>4250065</Literal></PropertyIsEqualTo></AND></Filter>
http://demo.mapserver.org/cgi-bin/wfs?&VERSION=1.0.0&SERVICE=WFS
&REQUEST=GetFeature&TYPENAME=cities&Filter=<Filter>
<AND><NOT><PropertyIsEqualTo><PropertyName>POPULATION</PropertyName>
<Literal>0</Literal></PropertyIsEqualTo></NOT><NOT><PropertyIsEqualTo>
<PropertyName>POPULATION</PropertyName><Literal>12116379</Literal>
</PropertyIsEqualTo></NOT></AND></Filter>
http://demo.mapserver.org/cgi-bin/wfs?&VERSION=1.0.0&SERVICE=WFS
&REQUEST=GetFeature&TYPENAME=cities&Filter=<Filter>
<BBOX><PropertyName>Name>NAME</PropertyName><Box%20srsName='EPSG:42304'>
<coordinates>135.2239,34.4879 135.8578,34.8471</coordinates></Box></BBOX>
</Filter>
http://demo.mapserver.org/cgi-bin/wfs?&VERSION=1.0.0&SERVICE=WFS
&REQUEST=GetFeature&TYPENAME=cities&Filter=<Filter>
<DWithin><PropertyName>Geometry</PropertyName><gml:Point>
<gml:coordinates>135.500000,34.666667</gml:coordinates>
</gml:Point><Distance units='m'>10000</Distance></DWithin></Filter>
http://demo.mapserver.org/cgi-bin/wfs?&VERSION=1.0.0&SERVICE=WFS
&REQUEST=GetFeature&TYPENAME=cities&Filter=<Filter>
<Intersects><PropertyName>Geometry</PropertyName>
<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing>
<gml:coordinates>135.5329,34.6624 135.4921,34.8153 135.3673,34.7815
135.3800,34.6216 135.5361,34.6210 135.5329,34.6624</gml:coordinates>
</gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></Intersects></Filter>
Table 2. WFS OGC test suite (over the HTTP Get and Post method)
Test # | Description | # of Tests | # of Failed Tests |
---|---|---|---|
1 | Basic WFS tests over the HTTP Get and Post method | 402 | 281 |
1.1 | GetCapabilities | 16 | 0 |
1.2 | DescribeFeatureType | 18 | 0 |
1.3 | GetFeature | 368 | 281 |
1.3.1 | Basic WFS tests | 20 | 1 |
1.3.2 | Complex WFS tests | 18 | 18 |
1.3.3 | Arithmetic filter WFS tests | 8 | 8 |
1.3.4 | Comparison WFS tests | 50 | 26 |
1.3.4.1 | GetFeature PropertyIsGreaterThanOrEqualTo filter | 2 | 0 |
1.3.4.2 | GetFeature PropertyIsBetween filter | 6 | 2 |
1.3.4.3 | GetFeature PropertyIsEqualTo filter | 4 | 0 |
1.3.4.4 | GetFeature PropertyIsGreaterThan filter | 4 | 2 |
1.3.4.5 | GetFeature PropertyIsGreaterThanOrEqualTo filter | 6 | 6 |
1.3.4.6 | GetFeature PropertyIsLessThan filter | 6 | 4 |
1.3.4.7 | GetFeature PropertyIsLessThanOrEqualTo filter | 6 | 4 |
1.3.4.8 | GetFeature PropertyIsLike filter | 2 | 0 |
1.3.4.9 | GetFeature PropertyIsNotEqualTo filter | 6 | 0 |
1.3.4.10 | GetFeature PropertyIsNull filter | 8 | 8 |
1.3.5 | Logical WFS test | 20 | 0 |
1.3.5.1 | GetFeature AND PropertyIsEqualTo PropertyIsEqualTo filter | 8 | 0 |
1.3.5.2 | GetFeature OR PropertyIsEqualTo PropertyIsEqualTo filter | 8 | 0 |
1.3.5.3 | GetFeature NOT PropertyIsNotEqualTo filter | 4 | 0 |
1.3.6 | Spatial operator WFS test | 252 | 228 |
1.3.6.1 | GetFeature BBOX filter | 36 | 12 |
1.3.6.2 | GetFeature with other filter types | 216 | 216 |
2 | Transactional WFS test | 69 | 69 |
The OGC Cite WFS test suite can be found on the OGC Cite portal.
Following are some MapServer specific notes on this test suite:
Test number 1.3.1:
Tests number 1.3.2 and 1.3.3:
Tests number 1.3.4.2, 1.3.4.4 to 1.3.4.7:
See also
Test number 1.3.4.10:
Test number 1.3.6.1:
See also
Test number 2: