Filter Encoding WFS

Author:Jeff McKenna
Contact:jmckenna at gatewaygeomatics.com
Author:Yewondwossen Assefa
Contact:assefa at dmsolutions.ca
Last Updated:

07-10-2010

Introduction

Ce document décrit les procédures pour tirer parti du support Filter Encoding (FE) dans les requêtes GetFeature WFS, qui a été ajouté dans MapServer avec la version 4.2.

Ce document assume que vous êtes déjà familier avec les aspects suivants de MapServer :

  • Développement d’application MapServer et configuration des fichiers .map.

  • La familiarité avec la spécification WFS est un avantage. Des liens vers les documents WFS MapServer sont inclus dans la section suivante.

As of MapServer 7.0, the OGC Filter Encoding 2.0 specification is also used to evaluate Filters of WFS 2.0 GetFeature requests.

Fonctionnalités supportées actuellement

Le tableau suivant liste les fonctionnalités supportées actuellement pour le standard FE.

Table 1. Fonctionnalités gérées actuellement

Groupe de fonctionnalités

Fonctionnalité

Capacités spatiales

 
  Equals
  Disjoint
  Touches
  Within
  Overlaps
  Crosses
  Intersects
  Contains
  DWithin
  BBOX

Capacités scalaires

 
   

Opérateurs logiques

 
  And
  Or
  Not

Opérateurs de comparaison

 
  PropertyIsEqualTo (=)
  PropertyIsNotEqualTo (<>)
  PropertyIsLessThan (<)
  PropertyIsGreaterThan (>)
  PropertyIsLessThanOrEqualTo (<=)
  PropertyIsGreaterThanOrEqualTo (>=)
  PropertyIsLike
  PropertyIsBetween (range)

Unités de mesures

Les unités de mesures suivantes sont gérées :

m ou mètres

mètres

km ou kilomètres

kilomètres

NM

miles nautiques

mi ou miles

miles

in or pouces

pouces

ft ou pied

pied

deg or dd

degré

px pixels

Requêtes Get et Post

MapServer a déjà la capacité de recevoir et parser les requêtes Get et les requêtes Post avec encodage des URL. La capacité de MapServer à recevoir des requêtes Post avec des informations avec encodage XML envoyé dans le corps de la requête a été ajoutée. Par ailleurs, la capacité à générérer des requêtes Post avec des informations avec encodage XML pour les couches WFS a aussi été ajoutée.

À la fois les requêtes Get et Post sont gérées pour toutes les requêtes WFS :

  • GetCapabilities
  • GetFeatures
  • DescribeFeatureType

La gestion de ces requêtes WFS dans Post a été implémenté pour garder une consistance entre toutes les requêtes WFS gérées.

Quand des requêtes sont envoyées, la méthode de requête par défaut utilisée est Post. Pour changer ce comportement, nous avons introduit une métadonnée au niveau de la couche, wfs_request_method, qui peut être définie à “GET”.

Utilisation de Filter Encoding dans MapServer

Cette section décrit comment utiliser le standard FE à la fois côtés client et côté serveur.

Côté serveur

Pour être capable d’utiliser Filter Encoding, vous devez créer un serveur WFS valide en utilisant MapServer. Merci de vous réfèrer au guide du serveur WFS pour des informations plus spécifiques.

Il n’y a riend e spécial qui doit être ajouté à un serveur WFS pour le Filter Encoding, mais vous devez noter que, quand vous demandez les “capabilities” de votre serveur WFS, le document retourné doit contenirles filtres supportés. Voici un extrait d’un document de “Capabilities” (notez la section “Filter_Capabilities”):

 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>

Côté client

Pour être capable de générer un filtre pour un serveur WFS, une métadonnée au niveau de la couche appelée wfs_filter doit être ajoutée et contenir le filtre à envoyer au serveur. Ce qui suit est un exemple de couche valide avec client WFS ayant un filtre:

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

Remarque :

  • Le filtre donné comme une valeur de la métadonnée wfs_filter ne doit pas contenir des tags <Filter> de début et de fin.

  • La CONNECTION pointe vers un serveur WFS valide gérant des filtres

  • Les formes retournées seront dessinées en utilisant la classe définie dans la couche.

Limitations

  • Un jeu limité d’opérateurs spatiaux est géré.

Tests

Voici quelques URLs de test pour les différents filtres gérés :

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. Suite de test OGC WFS (via les méthodes HTTP Get et Post)

Test numéro

Description

Nombre de tests

Nombre de tests échoués

1

Tests WFS basiques via les méthodes HTTP Get et Post

402 281
1.1 GetCapabilities 16 0
1.2 DescribeFeatureType 18 0
1.3 GetFeature 368 281
1.3.1

Tests WFS basiques

20 1
1.3.2

Tests WFS complexes

18 18
1.3.3

Tests WFS de filtres arithmétiques

8 8
1.3.4

Tests de comparaison WFS

50 26
1.3.4.1

Filtre GetFeature PropertyIsGreaterThanOrEqualTo

2 0
1.3.4.2

Filtre GetFeature PropertyIsBetween

6 2
1.3.4.3

Filtre GetFeature PropertyIsEqualTo

4 0
1.3.4.4

Filtre GetFeature PropertyIsGreaterThan

4 2
1.3.4.5

Filtre GetFeature PropertyIsGreaterThanOrEqualTo

6 6
1.3.4.6

Filtre GetFeature PropertyIsLessThan

6 4
1.3.4.7

Filtre GetFeature PropertyIsLessThanOrEqualTo

6 4
1.3.4.8

Filtre GetFeature PropertyIsLike

2 0
1.3.4.9

Filtre GetFeature PropertyIsNotEqualTo

6 0
1.3.4.10

Filtre GetFeature PropertyIsNull

8 8
1.3.5

Tests WFS logiques

20 0
1.3.5.1

Filtre GetFeature AND PropertyIsEqualTo PropertyIsEqualTo

8 0
1.3.5.2

Filtre GetFeature OR PropertyIsEqualTo PropertyIsEqualTo

8 0
1.3.5.3

Filtre sur GetFeature NOT PropertyIsNotEqualTo

4 0
1.3.6

Test des opérateurs spatiaux WFS

252 228
1.3.6.1

Filtre GetFeature BBOX

36 12
1.3.6.2

GetFeature avec d’autres types de filtres

216 216
2

Test WFS transactionnel

69 69

La suite de tests WFS OGC Cite peut être trouvée sur le portail Cite de l’OGC.

Les éléments suivants sont les notes spécifiques à MapServer à propos de la suite de tests :

  1. Test numéro 1.3.1 :

    • Il y a une contradiction entre l’assertion wfs/1.0.0/basic/getfeature/post/3 et la valeur attendue XPath du test. L’assertion dit: “Testez qu’une requête GetFeature avec aucun format de sortie défini retourne une wfs:FeatureCollection avec une donnée GML.” et la valeur attendue XPath pour cette requête: “boolean(/ogc:ServiceExceptionReport)” est supposée être true. Ainsi, l’assertion signifie que quand un serveur WFS reçoit une requête qui contient un format de sortie undéfini ou pas de format de sortie du tout, le serveur WFS doit retourner une collection WFS contenant une donnée GML. La valeur attendue XPath signifie que quand un serveur WFS reçoit une requête avec un format de sortie undéfini ou pas de format de sortie du tout, le serveur WFS doit retourner un rapport d’exception de service.

  2. Tests numéros 1.3.2 et 1.3.3 :

    • Non géré

  3. Tests numéros 1.3.4.2, 1.3.4.4 à 1.3.4.7 :

    • La comparaison de chaînes n’est pas gérée en utilisant >, <, >=, <=.

    • La date de comparaison n’est pas gérée.

    Voir aussi

    bug 461

  4. Test numéro 1.3.4.10 :

    • Cette propriété n’est pas gérée dans MapServer.

  5. Test numéro 1.3.6.1 :

    • L’objet xml renvoyé ne sera pas validé car la validation est faite vis à vis d’un xsd spécifique (geometry.xsd).

    • Les conversions de données sur les multipoints et les multicouches ne sont pas gérées à l’intérieur de GDAL.

    Voir aussi

    bug 461

  6. Test numéro 2 :

    • Les requêtes de transaction ne sont pas gérées.