Skip To Content

Communication avec un service WFS dans un navigateur Web

La ressource en ligne de chaque opération prise en charge par un serveur WFS conforme est une adresse URL (Uniform Resource Locator) HTTP), donc un service WFS peut être considéré comme un service REST (Representational State Transfer)Representational State Transfer. Vous pouvez utiliser ces opérations par l'intermédiaire de paramètres URL afin d'obtenir des métadonnées de service, des informations sur le type d'entité et des entités codées à l'aide de GML depuis le service WFS. Ces opérations et paramètres sont décrits en détail dans les spécifications WMS de l'OGC.

Types de clients

Les services WFS peuvent être utilisés par tout client capable de lire des données WFS. Un navigateur Web constitue généralement le client de base d'un service WFS. Les demandes WFS peuvent être émises via HTTP ; les réponses ou exceptions sont renvoyées par l'intermédiaire du navigateur. Tous les services WFS prennent en charge trois opérations principales : GetCapabilities, DescribeFeatureType et GetFeature. L'implémentation de ArcGIS Server de WFS 2.0 définit des opérations complémentaires : GetFeatureByID, ListStoredQueries et DescribeStoredQueries.

De nombreux clients tiers permettent d'utiliser les services WFS. Pour utiliser les services WFS, le client doit prendre en charge la norme WFS 1.0.0, 1.1.0 ou 2.0 ainsi que le profil GML d'entités simples. En outre, ArcGIS Desktop peut fonctionner avec des WFS. Pour obtenir de l'aide concernant les services WFS dans ArcGIS, reportez-vous à la rubrique Ajout d'un service WFS à ArcMap

Structure des URL WFS

Pour établir une connexion au service, vous devez connaître son URL, qui présente le format suivant :

http://gisserver.domain.com:6080/arcgis/services/<nom du dossier (le cas échéant)>/<nom du service>/<type de service>/WFSServer?

  • le nom de serveur correspond au nom de votre serveur Web,
  • le numéro de port est le port utilisé par votre serveur Web pour communiquer avec d'autres ordinateurs,
  • le service peut être du type serveur de carte ou serveur de géodonnées, selon que vous avez créé le service WFS à partir d'une carte ou d'une géodatabase, respectivement.

Si, par exemple, vous avez activé la fonctionnalité WFS sur le service de carte WFSDemoService dans un dossier DemoFolder sur le serveur gisserver.domain.com au port 6080, l'URL serait la suivante :

http://gisserver.domain.com:6080/arcgis/services/DemoFolder/WFSDemoService/MapServer/WFSServer?service=WFS&request=GetCapabilities

De même, si vous avez activé la fonctionnalité WFS sur un service de géodonnées, l'URL serait la suivante :

http://gisserver.domain.com:6080/arcgis/services/DemoFolder/WFSDemoService/GeoDataServer/WFSServer?service=WFS&request=GetCapabilities

Utilisation de filtres

Vous pouvez utiliser le paramètre Filtre dans WFS afin d'obtenir des entités spécifiques dans un service WFS. Le paramètre Filtre présente l'avantage de faire partie du codage standard de la combinaison mot-clé/valeur défini dans la section 9.5 de WFS 1.1 Implementation Specification et de pouvoir ainsi être ajouté à la fin des requêtes HTTP. Les services WFS 1.0.0 et 1.1.0 se conforment à la spécification OpenGIS Filter Encoding Implementation (FE) version 1.1 de l'OGC. WFS 2.0 utilise la version 2.0 de la spécification des filtres.

Le tableau suivant dresse la liste des filtres que vous pouvez appliquer :

GéométrieSpatialLogiqueComparaisonTri

Enveloppe

BBOX

Et

EqualTo

SortBy*

point

Egal à

Ou

NotEqualTo

Multi-points

Disjoint

Non

LessThan

LineString

Intersection

GreaterThan

Polygone

Croise

LessThanOrEqualTo

Touche

GreaterThanOrEqualTo

Dans

Comme

Contient

Entre

Superpose

NullCheck

Remarque :

*Le filtre SortBy s'applique uniquement aux services WFS basés sur les données stockées dans une géodatabase d'entreprise.

Par exemple, si vous avez créé un FeatureType nommé BlockGroups dans un service WFS, vous pouvez demander les entités BlockGroup dans l'étendue -122.423192682619, 37.7877919206256, -122.421377806544, 37.7893634225143 en envoyant la requête GetFeature suivante :

http://gisserver.domain.com:6080/arcgis/services/playground/sanfrancisco_wfs/MapServer/WFSServer?service=WFS&request=GetFeature&version=1.1.0&typename=esri:blockgroups&Filter=<ogc:Filter><ogc:BBOX><ogc:PropertyName>Shape</ogc:PropertyName><gml:Box srsName="urn:x-ogc:def:crs:EPSG:4326"><gml:coordinates>37.7877919206256,-122.423192682619 37.7893634225143,-122.421377806544</gml:coordinates></gml:Box></ogc:BBOX></ogc:Filter>

Pour demander une entité BlockGroup contenant dans une entité ponctuelle particulière, telle que 122.431577, 37.749936, vous pouvez envoyer la requête GetFeature suivante :

http://gisserver.domain.com:6080/arcgis/services/playground/sanfrancisco_wfs/MapServer/WFSServer?service=WFS&request=GetFeature&version=1.1.0&typename=esri:blockgroups&Filter=<ogc:Filter><ogc:Contains><ogc:PropertyName>Shape</ogc:PropertyName><gml:Point srsName="urn:x-ogc:def:crs:EPSG:4326"><gml:pos srsName="urn:x-ogc:def:crs:EPSG:4326">37.749936 -122.431577</gml:pos></gml:Point></ogc:Contains></ogc:Filter>

Remarque :

WFS requiert la présence des préfixes des espaces de noms concernés dans la chaîne XML de filtrage. En outre, pour éviter des conversions incorrectes par les navigateurs ou les serveurs Web, l'URL encode la chaîne XML de filtrage avant de l'envoyer au serveur.

Utilisation du service WFS 1.0.0 ou 1.1.0 dans un navigateur Web

Dans les exemples suivants, des paramètres URL sont utilisés pour communiquer avec des services WFS et WFS-T 1.0.0 et 1.1.0 dans un navigateur Web. Pour savoir comment utiliser les opérations WFS 2.0 dans un navigateur Web, reportez-vous à la section Utilisation du service WFS 2.0 dans un navigateur Web ci-dessous.

GetCapabilities

Cette requête renvoie tous les types d'entités et les fonctionnalités disponibles via le service au format GML. Pour utiliser l'opération GetCapabilities, copiez et collez l'URL du service WFS dans la barre d'adresse et ajoutez ?service=WFS&request=getcapabilities à la fin de l'URL.

Exemple d'URL : http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/MapServer/WFSServer?service=WFS&request=GetCapabilities

Le graphique suivant est un exemple des fonctionnalités renvoyées par l'opération GetCapabilities :

Fonctionnalité renvoyée par l'opération GetCapabilities

L'opération GetCapabilities renvoie également une liste de toutes les classes d'entités et des tables disponibles :

Classes d'entités et tables disponibles renvoyées par l'opération GetCapabilities

DescribeFeatureType

Cette demande décrit les informations de champ concernant une ou plusieurs entités du service WFS. Cela inclut les noms de champs, les types de champs, les valeurs minimales et maximales autorisées dans les champs et toute autre contrainte définie dans un champ des classes d'entités ou tables.

Pour utiliser l'opération DescribeFeatureType, copiez et collez l'URL WFS dans la barre d'adresse et ajoutez ?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&VERSION=1.1.0 à la fin de l'URL. Cette requête renvoie toutes les informations de champ concernant chaque type d'entité et table disponibles dans le service d'entités.

Exemple d'URL : http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/MapServer/WFSServer?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&VERSION=1.1.0

Classes d'entités, tables et informations de champ renvoyées par l'opération DescribeFeatureType

Ajout de filtres

Vous pouvez également spécifier une seule classe d'entités ou table à propos de laquelle vous souhaitez obtenir des informations de champ en ajoutant la demande suivante à la fin de l'URL avec le nom du type d'entité ou de la table :

?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TypeName=<saisir le type d'entité ici>&VERSION=1.1.0

Dans l'exemple ci-dessous, la demande DescribeFeatureType permet d'identifier les informations de champ du type d'entité Continent :

Exemple d'URL : http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/MapServer/WFSServer?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TypeName=continent&VERSION=1.1.0

Classe d'entités Continent et informations de champ renvoyées par l'opération DescribeFeatureType filtrée

GetFeature

Cette demande renvoie des informations concernant des types d'entités spécifiques disponibles par l'intermédiaire du service WFS.

Pour utiliser l'opération GetFeature dans un navigateur Web, copiez et collez l'URL WFS dans la barre d'adresse et ajoutez ?request=getFeature&typename=<saisir le type d'entité ici> à la fin de l'URL. Cette requête renvoie toutes les informations d'attribut et de géométrie concernant chaque entité ou ligne du type d'entité.

Exemple d'URL : http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/MapServer/WFSServer?request=getfeature&typename=cities

Informations d'attribut et de géométrie renvoyées par l'opération GetFeature pour la classe d'entités Cities

Ajout de filtres

Vous pouvez ajouter également des filtres dans la requête pour affiner les résultats obtenus. Par exemple, vous pouvez demander toutes les villes qui se trouvent dans une plage de coordonnées spécifiée. Dans l'exemple ci-dessous, trois villes se trouvent dans une plage de coordonnées spécifiée :

Exemple d'URL : http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/MapServer/WFSServer?request=getfeature&typename=cities&BBOX=46.90,-76.21,42.12,-72.88

Villes dans la plage de coordonnées spécifiée renvoyées par l'opération GetFeature filtrée

Insérer

L'outil Insérer permet de créer des entités dans une seule requête de transaction. Par défaut, l'état initial d'une entité à créer est exprimé avec GML3 et doit être validé par rapport à un schéma d'application GML3 généré par l'opération DescribeFeatureType.

Dans l'exemple suivant, une entité ponctuelle représentant une ville est insérée :

<wfs:Transaction xmlns:gml="http://www.opengis.net/gml" xmlns:wfs="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:esri="http://www.esri.com" version = "1.1.0" service="WFS">>
  <wfs:Insert>
    <esri:Cities>
      <esri:NAME>Tofino</esri:NAME>
      <esri:CAPITAL>N</esri:CAPITAL>
      <esri:PROV_NAME>British Columbia</esri:PROV_NAME>
      <esri:POPULATION>12345</esri:POPULATION>
      <esri:RepRowID>1000</esri:RepRowID>
      <esri:Shape>
        <gml:Point>
          <gml:coordinates>59.163182034 -133.844892907</gml:coordinates>
        </gml:Point>
      </esri:Shape>
    </esri:Cities>
  </wfs:Insert>
</wfs:Transaction>

Mettre à jour

L'outil Mettre à jour permet de mettre à jour une ou plusieurs entités (d'un seul type) dans une seule requête de transaction.

L'élément <Update> contient un ou plusieurs éléments <Property> qui indiquent le nom et la valeur de remplacement d'une propriété appartenant au type d'entité spécifié à l'aide de l'attribut obligatoire typeName. Un élément <Property> contient un élément <Name> qui renferme le nom de la propriété de l'entité à modifier et un élément facultatif <Value> qui renferme la valeur de remplacement de la propriété de l'entité nommée. L'omission de l'élément <Value> signifie que la propriété doit posséder une valeur Null. Dans le cas où cette propriété ne peut pas prendre la valeur Null, le WFS doit générer une exception indiquant que la valeur Null n'est pas autorisée.

Dans l'exemple suivant, une entité ponctuelle est mise à jour dans un jeu de données nommé cities :

<wfs:Transaction xmlns:gml="http://www.opengis.net/gml" xmlns:wfs="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ogc="http://www.opengis.net/ogc" xmlns:esri="http://www.esri.com" version = "1.1.0" service="WFS">
  <wfs:Update typeName="esri:cities">
    <wfs:Property>
    <wfs:ValueReference>POPULATION</wfs:ValueReference>
    <wfs:Value>300000</wfs:Value>
  </wfs:Property>
  <ogc:Filter>
    <ogc:PropertyIsEqualTo>
      <ogc:PropertyName>NAME</ogc:PropertyName>
      <ogc:Literal>Halifax</ogc:Literal>
    </ogc:PropertyIsEqualTo>
  </ogc:Filter>
  </wfs:Update>
</wfs:Transaction>

Effacer

L'outil Supprimer permet de supprimer une ou plusieurs entités (d'un seul type) dans une seule requête de transaction. La suppression se définit par l'élément <Filter>. Dans le cas où l'élément <Filter> n'identifie aucune instance d'entité à supprimer, la requête de suppression est ignorée.

Dans l'exemple suivant, deux entités sont supprimées dans un jeu de données nommé cities :

<wfs:Transaction xmlns:gml="http://www.opengis.net/gml" xmlns:wfs="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ogc="http://www.opengis.net/ogc" xmlns:esri="http://www.esri.com" version = "2.0.0" service="WFS">
  <wfs:Delete typeName="esri:cities">
    <ogc:Filter xmlns:ogc='http://www.opengis.net/ogc'>
        <ogc:PropertyIsEqualTo>
          <ogc:PropertyName>NAME</ogc:PropertyName>
          <ogc:Literal>Churchill</ogc:Literal>
        </ogc:PropertyIsEqualTo>
    </ogc:Filter>
  </wfs:Delete>
  <wfs:Delete typeName="esri:cities">
    <ogc:Filter xmlns:ogc='http://www.opengis.net/ogc'>
        <ogc:PropertyIsEqualTo>
          <ogc:PropertyName>NAME</ogc:PropertyName>
          <ogc:Literal>Montreal</ogc:Literal>
        </ogc:PropertyIsEqualTo>
    </ogc:Filter>
  </wfs:Delete>
</wfs:Transaction>

Utilisation du service WFS 2.0 dans un navigateur Web

L'implémentation d'ArcGIS Server de la spécification WFS 2.0 gère les fonctions requises du profil WFS de base, ainsi qu'il est indiqué dans la spécification WFS 2.0. Ceci inclut les opérations GetCapabilities, DescribeFeatureType et GetFeature (décrites ci-dessus). L'implémentation WFS 2.0 prend également en charge les transactions, les requêtes stockées et l'appel de réponses qui ne font pas partie du profil WFS de base.

Transactions

L'opération Transaction permet de décrire les opérations de transformation des données appliquées aux instances d'entité d'un service WFS. Grâce à l'opération Transaction, les clients peuvent créer, modifier, remplacer et supprimer des entités du WFS. Lorsque la transaction est terminée, le WFS génère un document de réponse XML indiquant l'état d'achèvement de l'opération.

Requêtes stockées

Les requêtes stockées permettent le stockage de requêtes de filtre complexes par WFS 2.0 et leur exécution via une requête de base. Afin d'obtenir le même résultat avec WFS 1.0.0 ou 1.1.0, vous devez écrire un filtre à l'aide d'une spécification d'encodage de filtre et l'ajouter à l'URL WFS. La configuration de requêtes stockées offre les avantages suivants, qui élargissent l'utilisation de WFS 2.0 dans les applications :

  • Des requêtes complexes peuvent être rationalisées afin de pouvoir être exécutées en tant que requêtes HTTP GET.
  • Un WFS peut être implémenté de façon à prendre en charge uniquement les requêtes stockées afin que l'administrateur puisse contrôler la façon dont les utilisateurs accèdent aux données.
  • Les requêtes stockées peuvent réduire les coûts de développement des applications, car elles peuvent être configurées pour prendre en charge des requêtes spécifiques au lieu de requêtes ad hoc complexes et d'expressions XPath.
  • Des interfaces RESTful peuvent être définies, outre le WFS, avec HTTP GET/POST et SOAP afin de permettre l'utilisation du WFS dans des applications clientes légères.

Les opérations suivantes sont disponibles pour prendre en charge les requêtes stockées : GetFeatureByID, ListStoredQueries et DescribeStoredQueries (décrites ci-dessus).

Création d'un fichier de requêtes stockées

Un fichier de requêtes stockées est un fichier XML qui gère une liste de requêtes stockées créées par l'éditeur et pertinentes pour un service donné. Pour utiliser des requêtes stockées avec WFS 2.0, créez un fichier de requêtes stockées et configurez le service pour référencer l'URL de votre fichier de requêtes stockées.

Le fichier de requêtes stockées de l'exemple suivant fonctionne avec le service de carte SampleWorldCities inclus avec ArcGIS Server. Vous pouvez créer le fichier et configurer le service permettant de l'utiliser en suivant les instructions de la section Configuration d'un service WFS pour utiliser les requêtes stockées. Vous pouvez également modifier le fichier avec un service WFS différent.

<?xml version="1.0" encoding="utf-8" ?>
<wfs:StoredQueryList
  xmlns:ogc="http://www.opengis.net/ogc"
  xmlns:wfs="http://www.opengis.net/wfs"
  xmlns:fes="http://www.opengis.net/fes/2.0"
  xmlns:gml="http://www.opengis.net/gml"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:myns="http://www.someserver.com/myns"
  xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd"
  service="WFS"
  version="2.0.0">
  <wfs:StoredQueryDefinition id="urn:StoredQueries:AttributeDemo">
    <wfs:Title>Attribute request</wfs:Title>
    <wfs:Abstract>test Attribute request</wfs:Abstract>
    <wfs:Parameter name="myrank" type="xsd:double"/>
    <wfs:QueryExpressionText
    returnFeatureTypes="myns:Cities"
    language="urn:ogc:def:queryLanguage:OGC-WFS::WFS_QueryExpression"
    isPrivate="false">
      <wfs:Query typeName="myns:cities">
        <fes:Filter>
          <fes:PropertyIsEqualTo>
            <fes:Literal>POP_RANK</fes:Literal>
            <fes:Literal>${myrank}</fes:Literal>
          </fes:PropertyIsEqualTo>
        </fes:Filter>
      </wfs:Query>
    </wfs:QueryExpressionText>
  </wfs:StoredQueryDefinition>
  <wfs:StoredQueryDefinition id="urn:StoredQueries:SpatialDemo">
      <wfs:Title>Spatial request</wfs:Title>
      <wfs:Abstract>test Spatial Request</wfs:Abstract>
      <wfs:Parameter name="coordinates" type="xsd:string"/>
      <wfs:QueryExpressionText
      returnFeatureTypes="myns:Cities"
      language="urn:ogc:def:queryLanguage:OGC-WFS::WFS_QueryExpression"
      isPrivate="false">
      <wfs:Query typeName='myns:Cities'>
        <ogc:Filter>
          <ogc:BBOX>
            <ogc:PropertyName>Shape</ogc:PropertyName>
            <gml:Box srsName="urn:x-ogc:def:crs:EPSG:4326">
              <gml:coordinates>${coordinates}</gml:coordinates>
            </gml:Box>
          </ogc:BBOX>
        </ogc:Filter>
      </wfs:Query>
      </wfs:QueryExpressionText>
    </wfs:StoredQueryDefinition>    
  <wfs:StoredQueryDefinition id="urn:StoredQueries:SpatialAndAttributeDemo">
      <wfs:Title>Spatial and Attribute Request</wfs:Title>
      <wfs:Abstract>Select all cities with POP > 12000000 and BBOX (0,0,180,90)</wfs:Abstract>
      <wfs:QueryExpressionText
      returnFeatureTypes="myns:Cities"
      language="urn:ogc:def:queryLanguage:OGC-WFS::WFS_QueryExpression"
      isPrivate="false">
      <wfs:Query typeName='myns:Cities'>
        <ogc:Filter>
          <fes:and>
            <ogc:BBOX>
              <ogc:PropertyName>Shape</ogc:PropertyName>
              <gml:Box srsName="urn:x-ogc:def:crs:EPSG:4326">
                <gml:coordinates>0,0 90,180</gml:coordinates>
              </gml:Box>
            </ogc:BBOX>
            <fes:PropertyIsGreaterThan>
              <fes:Literal>POP</fes:Literal>
              <fes:Literal>12000000</fes:Literal>
            </fes:PropertyIsGreaterThan>
          </fes:and>
        </ogc:Filter>
      </wfs:Query>
      </wfs:QueryExpressionText>
    </wfs:StoredQueryDefinition>    
  <wfs:StoredQueryDefinition id="urn:StoredQueries:QueryCitiesByID">
    <wfs:Title>Select feature by ID</wfs:Title>
    <wfs:Abstract>test selecting feature by ID</wfs:Abstract>
    <wfs:QueryExpressionText
    returnFeatureTypes="myns:Cities"
    language="urn:ogc:def:queryLanguage:OGC-WFS::WFS_QueryExpression"
    isPrivate="false">
      <wfs:Query typeName="myns:cities">
        <ogc:Filter>
          <ogc:PropertyIsEqualTo>
            <ogc:Literal>OBJECTID</ogc:Literal>
            <ogc:Literal>${ID}</ogc:Literal>
          </ogc:PropertyIsEqualTo>
        </ogc:Filter>
      </wfs:Query>
    </wfs:QueryExpressionText>
  </wfs:StoredQueryDefinition>
  <wfs:StoredQueryDefinition id="urn:ogc:def:query:OGC-WFS::GetFeatureById">
    <wfs:Title>urn:ogc:def:query:OGC-WFS::GetFeatureById predefined stored query</wfs:Title>
    <wfs:Abstract>This query support all layers in the map</wfs:Abstract>
    <wfs:QueryExpressionText
    returnFeatureTypes="myns:Cities,myns:Continent,myns:World"
    language="urn:ogc:def:queryLanguage:OGC-WFS::WFS_QueryExpression"
    isPrivate="false">
      <!-- Cities -->
      <wfs:Query typeName="myns:Cities">
        <ogc:Filter>
          <ogc:PropertyIsEqualTo>
            <ogc:Literal>OBJECTID</ogc:Literal>
            <ogc:Literal>${ID}</ogc:Literal>
          </ogc:PropertyIsEqualTo>
        </ogc:Filter>
      </wfs:Query>
      <!-- Continent -->
      <wfs:Query typeName="myns:Continent">
        <ogc:Filter>
          <ogc:PropertyIsEqualTo>
            <ogc:Literal>OBJECTID</ogc:Literal>
            <ogc:Literal>${ID}</ogc:Literal>
          </ogc:PropertyIsEqualTo>
        </ogc:Filter>
      </wfs:Query>
      <!-- World -->
      <wfs:Query typeName="myns:World">
        <ogc:Filter>
          <ogc:PropertyIsEqualTo>
            <ogc:Literal>OBJECTID</ogc:Literal>
            <ogc:Literal>${ID}</ogc:Literal>
          </ogc:PropertyIsEqualTo>
        </ogc:Filter>
      </wfs:Query>
      <!-- -->
    </wfs:QueryExpressionText>
  </wfs:StoredQueryDefinition>
  <wfs:StoredQueryDefinition id="urn:StoredQueries:FunctionCHAR_LENGTH">
    <wfs:Title>Function CHAR_LENGTH</wfs:Title>
    <wfs:Abstract>test Function CHAR_LENGTH</wfs:Abstract>
    <wfs:QueryExpressionText
    returnFeatureTypes="myns:Cities"
    language="urn:ogc:def:queryLanguage:OGC-WFS::WFS_QueryExpression"
    isPrivate="false">
      <wfs:Query typeName="myns:cities">
        <fes:Filter>
          <fes:PropertyIsEqualTo>
            <fes:Function name="CHAR_LENGTH">
              <fes:Literal>CITY_NAME</fes:Literal>
            </fes:Function>
            <fes:Literal>2</fes:Literal>
          </fes:PropertyIsEqualTo>
        </fes:Filter>
      </wfs:Query>
    </wfs:QueryExpressionText>
  </wfs:StoredQueryDefinition>
  <wfs:StoredQueryDefinition id="urn:StoredQueries:FunctionSUBSTRING">
    <wfs:Title>Function CHAR_LENGTH</wfs:Title>
    <wfs:Abstract>test Function CHAR_LENGTH</wfs:Abstract>
    <wfs:QueryExpressionText>
      <wfs:Query typeName="myns:cities">
        <fes:Filter>
          <fes:PropertyIsEqualTo>
            <fes:Function name="SUBSTRING">
              <fes:Literal>CITY_NAME</fes:Literal>
              <fes:Literal>2</fes:Literal>
              <fes:Literal>3</fes:Literal>
            </fes:Function>
            <fes:Literal>os</fes:Literal>
          </fes:PropertyIsEqualTo>
        </fes:Filter>
      </wfs:Query>
    </wfs:QueryExpressionText>
  </wfs:StoredQueryDefinition>
  <wfs:StoredQueryDefinition id="urn:StoredQueries:MyStoredQuery">
    <wfs:Title>MyStoredQuery</wfs:Title>
    <wfs:Abstract>some tested MyStoredQuery</wfs:Abstract>
    <wfs:Parameter name="AreaOfInterest" type="gml:PolygonPropertyType"/>
    <wfs:QueryExpressionText
    returnFeatureTypes="myns:Parks myns:Lakes myns:Rivers"
    language="urn:ogc:def:queryLanguage:OGC-WFS::WFS_QueryExpression"
    isPrivate="false">
      <wfs:Query typeName="myns:cities">
        <ogc:Filter>
          <ogc:Within>
            <ogc:ValueReference>Shape</ogc:ValueReference>
            ${AreaOfInterest}
          </ogc:Within>
        </ogc:Filter>
      </wfs:Query>
      <wfs:Query typeName="myns:cities">
        <ogc:Filter>
          <ogc:PropertyIsEqualTo>
            <ogc:Literal>POP_RANK</ogc:Literal>
            <ogc:Literal>3</ogc:Literal>
          </ogc:PropertyIsEqualTo>
        </ogc:Filter>
      </wfs:Query>
      <wfs:Query typeNames="myns:Parks">
        <fes:Filter>
          <fes:Within>
            <fes:ValueReference>geometry</fes:ValueReference>
            ${AreaOfInterest}
          </fes:Within>
        </fes:Filter>
      </wfs:Query>
      <wfs:Query typeNames="myns:Lakes">
        <fes:Filter>
          <fes:Within>
            <fes:ValueReference>region</fes:ValueReference>
            ${AreaOfInterest}
          </fes:Within>
        </fes:Filter>
      </wfs:Query>
      <wfs:Query typeNames="myns:Rivers">
        <fes:Filter>
          <fes:Within>
            <fes:ValueReference>region</fes:ValueReference>
            ${AreaOfInterest}
          </fes:Within>
        </fes:Filter>
      </wfs:Query>
    </wfs:QueryExpressionText>
  </wfs:StoredQueryDefinition>
  <wfs:StoredQueryDefinition id="urn:StoredQueries:FeaturesInPolygon">
      <wfs:Title>Features In Polygon</wfs:Title>
      <wfs:Abstract>Find all the features in a Polygon.</wfs:Abstract>
      <wfs:Parameter name="AreaOfInterest" type="gml:PolygonPropertyType"/>
      <wfs:QueryExpressionText
      returnFeatureTypes="myns:Parks myns:Lakes myns:Rivers"
      language="urn:ogc:def:queryLanguage:OGC-WFS::WFS_QueryExpression"
      isPrivate="false">
        <wfs:Query typeNames="myns:Parks">
          <fes:Filter>
            <fes:Within>
              <fes:ValueReference>geometry</fes:ValueReference>
              ${AreaOfInterest}
            </fes:Within>
          </fes:Filter>
        </wfs:Query>
        <wfs:Query typeNames="myns:Lakes">
          <fes:Filter>
            <fes:Within>
              <fes:ValueReference>region</fes:ValueReference>
              ${AreaOfInterest}
            </fes:Within>
          </fes:Filter>
        </wfs:Query>
        <wfs:Query typeNames="myns:Rivers">
          <fes:Filter>
            <fes:Within>
              <fes:ValueReference>region</fes:ValueReference>
              ${AreaOfInterest}
            </fes:Within>
          </fes:Filter>
        </wfs:Query>
      </wfs:QueryExpressionText>
    </wfs:StoredQueryDefinition>    
  </wfs:StoredQueryList>

GetFeatureByID

L'opération GetFeatureByID accepte un seul argument, nommé id ou de type xsd:string, et renvoie une entité unique dont l'identifiant est égal à la valeur spécifiée de l'argument id.

L'exemple d'URL suivant appelle la requête stockée GetFeatureByID pour récupérer et afficher une entité unique :

http://gisserver.domain.com/arcgis/services/SampleWorldCities/MapServer/WFSServer?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&STOREDQUERY_ID=urn:ogc:def:query:OGC-WFS::GetFeatureById&ID=Cities.1

ListStoredQueries

L'opération ListStoredQueries dresse une liste des requêtes stockées disponibles sur ArcGIS Server. Le client peut exécuter une requête stockée à la fois, par exemple :

http://gisserver.domain.com:6080/arcgis/services/SampleWorldCities/MapServer/WFSServer?request=ListStoredQueries&service=WFS&version=2.0.0

<wfs:ListStoredQueriesResponse version="2.0.0" xsi:schemaLocation="http://www.opengis.net/gml http://schemas.opengis.net/gml/3.2.1/gml.xsd http://www.opengis.net/ogc http://schemas.opengis.net/filter/2.0/filter.xsd http://www.opengis.net/ows/1.1 http://schemas.opengis.net/ows/1.1.0/owsAll.xsd http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd http://www.opengis.net/fes/2.0 http://schemas.opengis.net/filter/2.0/filterAll.xsd">
  <wfs:StoredQuery id="urn:StoredQueries:AttributeDemo">
    <ows:Title>Attribute request</ows:Title>
    <ows:Abstract>test Attribute request</ows:Abstract>
  </wfs:StoredQuery>
  <wfs:StoredQuery id="urn:StoredQueries:SpatialDemo">
    <ows:Title>Spatial request</ows:Title>
    <ows:Abstract>test Spatial Request</ows:Abstract>
  </wfs:StoredQuery>
  <wfs:StoredQuery id="urn:StoredQueries:SpatialAndAttributeDemo">
    <ows:Title>Spatial and Attribute Request</ows:Title>
    <ows:Abstract>Select all cities with POP > 12000000 and BBOX (0,0,180,90)</ows:Abstract>
  </wfs:StoredQuery><wfs:StoredQuery id="urn:StoredQueries:QueryCitiesByID">
    <ows:Title>Select feature by ID</ows:Title>
    <ows:Abstract>test selecting feature by ID</ows:Abstract>
  </wfs:StoredQuery>
  <wfs:StoredQuery id="urn:ogc:def:query:OGC-WFS::GetFeatureById">
    <ows:Title>urn:ogc:def:query:OGC-WFS::GetFeatureById predefined stored query</ows:Title>
    <ows:Abstract>This query support all layers in the map</ows:Abstract>
  </wfs:StoredQuery><wfs:StoredQuery id="urn:StoredQueries:FunctionCHAR_LENGTH">
    <ows:Title>Function CHAR_LENGTH</ows:Title>
    <ows:Abstract>test Function CHAR_LENGTH</ows:Abstract>
  </wfs:StoredQuery>
  <wfs:StoredQuery id="urn:StoredQueries:FunctionSUBSTRING">
    <ows:Title>Function CHAR_LENGTH</ows:Title>
    <ows:Abstract>test Function CHAR_LENGTH</ows:Abstract>
  </wfs:StoredQuery>
  <wfs:StoredQuery id="urn:StoredQueries:MyStoredQuery">
    <ows:Title>MyStoredQuery</ows:Title>
    <ows:Abstract>some tested MyStoredQuery</ows:Abstract>
  </wfs:StoredQuery>
  <wfs:StoredQuery id="urn:StoredQueries:FeaturesInPolygon">
    <ows:Title>Features In Polygon</ows:Title>
    <ows:Abstract>Find all the features in a Polygon.</ows:Abstract>
  </wfs:StoredQuery>
</wfs:ListStoredQueriesResponse>

DescribeStoredQueries

L'opération DescribeStoredQueries décrit les requêtes stockées disponibles sur ArcGIS Server. Cette opération permet aux clients WFS d'interroger le serveur et de comprendre la nature de la requête stockée et des paramètres qui doivent être envoyés pour exécuter cette requête stockée.

http://gisserver.domain.com:6080/arcgis/services/SampleWorldCities/MapServer/WFSServer?request=DescribeStoredQueries&service=WFS&version=2.0.0

<wfs:DescribeStoredQueriesResponse version="2.0.0" xsi:schemaLocation="http://www.opengis.net/gml http://schemas.opengis.net/gml/3.2.1/gml.xsd http://www.opengis.net/ogc http://schemas.opengis.net/filter/2.0/filter.xsd http://www.opengis.net/ows/1.1 http://schemas.opengis.net/ows/1.1.0/owsAll.xsd http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd http://www.opengis.net/fes/2.0 http://schemas.opengis.net/filter/2.0/filterAll.xsd">
  <wfs:StoredQueryDefinition id="urn:StoredQueries:AttributeDemo">
    <wfs:Title>Attribute request</wfs:Title>
    <wfs:Abstract>test Attribute request</wfs:Abstract>
    <wfs:Parameter name="myrank" type="xsd:double"/>
    <wfs:QueryExpressionText returnFeatureTypes="myns:Cities" language="urn:ogc:def:queryLanguage:OGC-WFS::WFS_QueryExpression" isPrivate="false">
      <wfs:Query typeName="myns:cities">
        <fes:Filter>
          <fes:PropertyIsEqualTo>
            <fes:Literal>POP_RANK</fes:Literal>
            <fes:Literal>${myrank}</fes:Literal>
          </fes:PropertyIsEqualTo>
        </fes:Filter>
      </wfs:Query>
    </wfs:QueryExpressionText>
  </wfs:StoredQueryDefinition>
  <wfs:StoredQueryDefinition id="urn:StoredQueries:SpatialDemo">
    <wfs:Title>Spatial request</wfs:Title>
    <wfs:Abstract>test Spatial Request</wfs:Abstract>
    <wfs:Parameter name="coordinates" type="xsd:string"/>
    <wfs:QueryExpressionText returnFeatureTypes="myns:Cities" language="urn:ogc:def:queryLanguage:OGC-WFS::WFS_QueryExpression" isPrivate="false">
      <wfs:Query typeName="myns:Cities">
        <ogc:Filter>
          <ogc:BBOX>
            <ogc:PropertyName>Shape</ogc:PropertyName>
            <gml:Box srsName="urn:x-ogc:def:crs:EPSG:4326">
              <gml:coordinates>${coordinates}</gml:coordinates>
            </gml:Box>
          </ogc:BBOX>
        </ogc:Filter>
      </wfs:Query>
    </wfs:QueryExpressionText>
  </wfs:StoredQueryDefinition>
</wfs:DescribeStoredQueriesResponse>

Exécution d'une requête stockée incluse dans une requête GetFeature

Voici un exemple de requête d'attribut où une requête stockée (AttributeDemo) est appelée à l'aide du paramètre myrank=3 :

http://gisserver.domain.com:6080/arcgis/services/SampleWorldCities/MapServer/WFSServer?service=WFS&version=2.0.0&REQUEST=GetFeature&typeName=cities&startIndex=0&count=5&STOREDQUERY_ID=urn:StoredQueries:AttributeDemo&myrank=3

Voici un exemple où une requête stockée (SpatialDemo) est appelée à l'aide du paramètre coordinates pour récupérer une liste des villes des Etats-Unis qui se trouvent au sein d'une emprise obligatoire. Seules les deux premières villes sont renvoyées depuis cette liste (notez l'utilisation de l'index de début et du nombre) :

http://gisserver.domain.com:6080/arcgis/services/SampleWorldCities/MapServer/WFSServer?service=WFS&version=2.0.0&REQUEST=GetFeature&typeName=cities&startIndex=0&count=2&STOREDQUERY_ID=urn:StoredQueries:SpatialDemo&coordinates=0,-180%2090,0

L'exemple suivant illustre l'appel d'une requête stockée (FunctionChat_Length). La requête stockée sur le serveur est écrite pour filtrer les villes dont le nom compte plus de deux caractères :

http://gisserver.domain.com:6080/arcgis/services/SampleWorldCities/MapServer/WFSServer?service=WFS&version=2.0.0&REQUEST=GetFeature&typeName=Cities&STOREDQUERY_ID=urn:StoredQueries:FunctionCHAR_LENGTH

Appel de réponses

L'appel de réponses permet à une requête de spécifier l'index de début de l'entité à récupérer. Un nombre total des entités à récupérer peut également être spécifié.

Grâce au service de carte SampleWorldCities installé avec ArcGIS Server, la requête suivante renvoie deux villes (nombre = 2) : Brasilia et Goiânia :

http://gisserver.domain.com:6080/arcgis/services/SampleWorldCities/MapServer/WFSServer?service=WFS&version=2.0.0&REQUEST=GetFeature&typeName=cities&startIndex=1&count=2

Si vous changez la requête et que vous faites commencer l'index de début à 2, la ville renvoyée est Goiânia. Etant donné que le nombre = 2, les deux villes renvoyées sont Goiânia et Campo Grande.

http://gisserver.domain.com:6080/arcgis/services/SampleWorldCities/MapServer/WFSServer?service=WFS&version=2.0.0&REQUEST=GetFeature&typeName=cities&startIndex=2&count=2