Skip To Content

Comunicación con un servicio WFS en un navegador Web

En este tema

El recurso online de cada operación admitida por un servidor WFS compatible es un localizador de recursos uniforme (URL) de HTTP, de modo que un servicio WFS se puede considerar como un servicio de Transferencia de estado representacional (REST). A través de los parámetros de la dirección URL, puede utilizar estas operaciones para obtener metadatos de servicio, información del tipo de entidad y entidades codificadas de GML desde el servicio WFS. Estas operaciones y parámetros se detallan en las Especificaciones WFS del OGC.

Tipos de clientes

Los servicios WFS se pueden utilizar en cualquier cliente que admita WFS. Casi siempre, un navegador Web es el cliente básico de un servicio WFS. Las solicitudes WFS pueden realizarse mediante HTTP y las respuestas o excepciones se devuelven a través del navegador. Todos los servicios WFS son compatibles con tres operaciones principales: GetCapabilities, DescribeFeatureType y GetFeature. La implementación de ArcGIS Server de WFS 2.0 define operaciones adicionales: GetFeatureByID, ListStoredQueries y DescribeStoredQueries.

Existen muchos clientes de terceros disponibles para utilizar servicios WFS. Para utilizar los servicios WFS, el cliente debe ser compatible con WFS 1.0.0, 1.1.0 o 2.0 y el Perfil de entidades simples de GML. Además, ArcGIS for Desktop puede utilizar los servicios WFS. Si desea obtener ayuda sobre el uso de los servicios WFS en ArcMap, consulte Agregar un servicio de WFS a ArcMap.

Estructura de la dirección URL de WFS

Para conectarse al servicio, es necesario conocer la dirección URL, que sigue este patrón:

http://gisserver.domain.com:6080/arcgis/services/<nombre de carpeta (si procede)>/<nombre de servicio>/<tipo de servicio>/WFSServer?

  • El nombre del servidor es el nombre del equipo del servidor Web.
  • El número de puerto es el puerto de su equipo del servidor Web que utiliza para comunicarse con otros equipos.
  • El tipo de servicio puede ser MapServer o GeoDataServer, dependiendo de si ha creado el servicio WFS desde un mapa o una geodatabase, respectivamente.

Por ejemplo, si ha habilitado el recurso WFS en el servicio de mapas WFSDemoService en una carpeta llamada DemoFolder en el servidor gisserver.domain.com que se ejecuta en el puerto 6080, la dirección URL sería:

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

De manera similar, si ha habilitado el recurso WFS en un servicio de geodatos, la dirección URL sería:

http://gisserver.domain.com:6080/arcgis/services/DemoFolder/WFSDemoService/GeoDataServer/WFSServer?

Utilizar filtros

El parámetro Filtro se puede utilizar en las solicitudes de WFS para obtener entidades específicas en un servicio de WFS. El beneficio del parámetro Filtro es que forma parte de la codificación de par de palabra clave-valor estándar definido en la sección 9.5 de la Especificación de WFS 1.1 y se puede incorporar al final de solicitudes de HTTP. Los servicios WFS 1.0.0 y 1.1.0 utilizan la Especificación de implementación de codificación de filtro de OpenGIS OGC (FE) versión 1.1. WFS 2.0 utiliza la versión 2.0 de la especificación de filtro.

La tabla a continuación enumera los filtros que puede aplicar:

GeometríaEspacialLógicaComparaciónOrdenar

Contorno

BBOX

And

EqualTo

SortBy*

Punto

Es igual a

O

NotEqualTo

Multipunto

Inconexa

No

LessThan

LineString

Intersecciones

GreaterThan

de polígono

Cruza

LessThanOrEqualTo

Toca

GreaterThanOrEqualTo

Dentro de

Como

Contiene

Entre

Superpone

NullCheck

Nota:

*El filtro SortBy únicamente se puede aplicar a servicios WFS basados en los datos almacenados en una geodatabase corporativa.

Por ejemplo, si creó un Tipo de entidad denominado "grupos de bloques" en un servicio de WFS, puede solicitar entidades de grupos de bloques dentro de la extensión -122.423192682619, 37.7877919206256, -122.421377806544, 37.7893634225143 enviando la siguiente solicitud de GetFeature:

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>

Si desea solicitar una entidad de grupos de bloques que contenga una entidad de punto específica, como 122,431577, 37,749936, puede enviar la siguiente solicitud de GetFeature:

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>

Nota:

WFS requiere prefijos de espacio de nombre incluidos en la cadena de texto XML del filtro. Además, para evitar que los navegadores Web o servidores Web completen conversiones incorrectas, la dirección URL codifica la cadena de caracteres XML del filtro antes de enviarla al servidor.

Consumir el servicio de WFS 1.0.0 o 1.1.0 en un navegador Web

Los siguientes ejemplos utilizan los parámetros de dirección URL para comunicarse con los servicios WFS y WFS-T 1.0.0 y 1.1.0 en un navegador Web. Para aprender a utilizar las operaciones de WFS 2.0 en un navegador Web, consulte la sección Consumir un servicio WFS 2.0 en un navegador Web a continuación.

GetCapabilities

Esta solicitud devuelve todos los tipos de entidades y funciones disponibles a través del servicio en formato GML. Para utilizar la operación GetCapabilities, copie y pegue la dirección URL del servicio WFS en la barra de direcciones y agregue ?request=getcapabilities al final de la dirección URL.

Ejemplo de URL: http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/GeoDataServer/WFSServer?request=GetCapabilities

El siguiente gráfico es un ejemplo de una funcionalidad devuelta en la operación GetCapabilities:

Funcionalidad devuelta en la operación GetCapabilities

La operación GetCapabilities también devuelve una lista de todas las clases de entidades y tablas disponibles:

Clases de entidad y tablas disponibles devueltas en la operación GetCapabilities

DescribeFeatureType

Esta solicitud describe la información del campo sobre una o más entidades en el servicio de WFS. Incluye los nombres de campo, los tipos de campo, los valores de campo máximo y mínimo permitidos y cualquier otra restricción establecida en un campo de las clases de entidad o tablas.

Para utilizar la operación DescribeFeatureType, copie y pegue la dirección URL del WFS en la barra de direcciones y agregue ?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&VERSION=1.1.0 al final de la dirección URL. Esto devuelve toda la información del campo de cada una de las tablas y tipos de entidad disponibles en el servicio de entidades.

Ejemplo de dirección URL: http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/GeoDataServer/WFSServer?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&VERSION=1.1.0

Clases de entidad, información del campo y tablas devueltas en la operación DescribeFeatureType

Agregar filtros

Puede también especificar una única tabla o clase de entidad de la que desea información del campo incorporando la siguiente solicitud al final de la dirección URL con el nombre de la tabla o tipo de entidad:

?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TypeName=<enter feature type here>&VERSION=1.1.0

En el siguiente ejemplo, la solicitud DescribeFeatureType se utiliza para identificar la información del campo para el tipo de entidad denominado "cities":

Ejemplo de dirección URL: http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/GeoDataServer/WFSServer?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TypeName=cities&VERSION=1.1.0

La clase de entidad de ciudades y su información del campo correspondiente devueltas en la operación filtrada DescribeFeatureType

GetFeature

Esta solicitud devuelve información sobre tipos de entidad específicos disponibles a través del servicio WFS.

Para utilizar la operación GetFeature en un navegador web, copie y pegue la dirección URL del WFS en la barra de direcciones y agregue ?request=getFeature&typename=<enter feature type here> al final de la dirección URL. Esto devuelve toda la información sobre atributos y geometría de cada entidad o fila en el tipo de entidad.

Ejemplo de dirección URL: http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/GeoDataServer/WFSServer?request=getfeature&typename=cities

Información sobre atributos y geometría de la clase de entidad de ciudades devuelta en la operación GetFeature

Agregar filtros

También puede agregar filtros en la solicitud para refinar los resultados obtenidos. Por ejemplo, puede solicitar todas las ciudades dentro un intervalo especificado de coordenadas. En el ejemplo siguiente, dos ciudades están dentro de un intervalo especificado de coordenadas:

Ejemplo de dirección URL: http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/GeoDataServer/WFSServer?request=getfeature&typename=cities&BBOX=46.90,-76.21,42.12,-72.88

Ciudades dentro del rango especificado de coordenadas devueltas en la operación filtrada GetFeature

Insertar

Insertar se usa para crear nuevas entidades en una sola petición de transacción. De forma predeterminada, el estado inicial para que se cree una entidad se expresa con GML3 y debe validar con relación a un esquema de aplicación GML3 generado por la operación DescribeFeatureType. Varias inserciones pueden incluirse en una sola petición de transacción.

Por ejemplo, en la siguiente muestra se introducen dos entidades de puntos que representan ciudades:

<wfs:Transaction>
  <wfs:Insert>
    <esri:cities_inserts gml:id="F808__26">
      <esri:OBJECTID>26</esri:OBJECTID>
      <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:pos>59.163182034 -133.844892907</gml:pos>
        </gml:Point>
      </esri:Shape>
    </esri:cities_inserts>
    <esri:cities_inserts gml:id="F808__27">
      <esri:OBJECTID>27</esri:OBJECTID>
      <esri:NAME>St Andrews by the sea</esri:NAME>
      <esri:CAPITAL>N</esri:CAPITAL>
      <esri:PROV_NAME>British Columbia</esri:PROV_NAME>
      <esri:POPULATION>12345</esri:POPULATION>
      <esri:RepRowID>1001</esri:RepRowID>
      <esri:Shape>
        <gml:Point>
          <gml:pos>59.3026669650001 -129.3813751</gml:pos>
        </gml:Point>
      </esri:Shape>
    </esri:cities_inserts>
  </wfs:Insert>
</wfs:Transaction>

Actualización

Actualizar se usa para actualizar una entidad o entidades (de un solo tipo) en una sola petición de transacción. Varias actualizaciones pueden aplicarse en una sola petición de transacción.

El elemento <Update> contiene uno o más elementos <Property> que especifican el nombre y valor de reemplazo de una propiedad que pertenece al tipo de entidad indicado usando el atributo obligatorio typeName. Un elemento <Property> contiene un elemento <Name> que contiene el nombre de la propiedad de la entidad que se va a modificar y un elemento <Value> opcional que contiene el valor de reemplazo de la propiedad de la entidad con nombre. La omisión del elemento <Value> significa que debe asignarse a la propiedad un valor NULO. En el caso de que la propiedad no se pueda anular, WFS debe generar una excepción que indique que el valor NULO no está permitido.

Por ejemplo, en la siguiente muestra se actualizan dos entidades de puntos en un dataset llamado cities_updates:

<wfs:Transaction>
  <wfs:Update typeName="esri:cities_updates">
    <wfs:Property>
    <wfs:Name>Shape</wfs:Name>
    <wfs:Value>
      <gml:Point>
        <gml:pos>52.83 -124.18</gml:pos>
      </gml:Point>
    </wfs:Value>
  </wfs:Property>
  <ogc:Filter>
    <ogc:PropertyIsEqualTo>
      <ogc:PropertyName>OBJECTID</ogc:PropertyName>
      <ogc:Literal>1</ogc:Literal>
    </ogc:PropertyIsEqualTo>
  </ogc:Filter>
  </wfs:Update>
  <wfs:Update typeName="esri:cities_updates">
    <wfs:Property>
      <wfs:Name>Shape</wfs:Name>
      <wfs:Value>
        <gml:Point>
          <gml:pos>57.29 -114.44</gml:pos>
        </gml:Point>
      </wfs:Value>
    </wfs:Property>
    <ogc:Filter>
      <ogc:PropertyIsEqualTo>
        <ogc:PropertyName>OBJECTID</ogc:PropertyName>
          <ogc:Literal>2</ogc:Literal>
        </ogc:PropertyIsEqualTo>
      </ogc:Filter>
    </wfs:Update>
  <wfs:Update typeName="esri:cities_updates">
</wfs:Transaction>

Eliminar

Eliminar se usa para eliminar una o más entidades (de un solo tipo) en una sola petición de transacción. Eliminar se define usando el elemento <Filter>. En el caso de que el elemento <Filter> no identifique ninguna instancia de entidades para eliminarla, la solicitud de eliminación se ignora.

Por ejemplo, en la siguiente muestra se eliminan dos entidades en un dataset llamado cities_deletes:

<wfs:Transaction>
  <wfs:Delete typeName="esri:cities_deletes">
    <ogc:Filter>
      <ogc:Or>
        <ogc:PropertyIsEqualTo>
          <ogc:PropertyName>OBJECTID</ogc:PropertyName>
          <ogc:Literal>1</ogc:Literal>
        </ogc:PropertyIsEqualTo>
        <ogc:PropertyIsEqualTo>
          <ogc:PropertyName>OBJECTID</ogc:PropertyName>
          <ogc:Literal>2</ogc:Literal>
        </ogc:PropertyIsEqualTo>
      </ogc:Or>
    </ogc:Filter>
  </wfs:Delete>
</wfs:Transaction>

Trabajar con el parámetro FeatureID

El parámetro FeatureID se puede utilizar en las solicitudes GetFeature para pedir entidades específicas en un servicio WFS. El parámetro FeatureID consiste en el tipo de entidad y el Id. de entidad (gml: id), no el OBJECTID de la entidad. El formato de un Id. de entidad de una entidad en un servicio WFS es <FeatureType>.<gml:id>. Una manera de identificar el gml:id de una entidad en un servicio WFS es hacer una solicitud GetFeature en el tipo de entidad de interés.

Nota:

El Id. de entidad gml:id no se proporciona para entidades de servicios WFS basadas en shapefiles.

Por ejemplo, supongamos que hay un tipo de entidad denominada Ciudades en un servicio WFS. Si hace una solicitud GetFeature para las Ciudades, la respuesta incluirá el gml:id de cada entidad.

Ejemplo de dirección URL: http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/GeoDataServer/WFSServer?request=getfeature&typename=cities

Solicitud GetFeature

En este ejemplo, el Id. de entidad de la ciudad de Vancouver es cities.F293__1. La siguiente solicitud se puede utilizar para solicitar específicamente la ciudad de Vancouver utilizando el Id. de entidad:

http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/GeoDataServer/WFSServer?request=getfeature&featureid=cities.F293__1

Consumir un servicio de WFS 2.0 en un navegador Web

La implementación de la especificación WFS 2.0 en ArcGIS Server aborda las entidades obligatorias del perfil WFS básico, como se indica en la especificación de WFS 2.0. Esto incluye las operaciones GetCapabilities, DescribeFeatureType y GetFeature (descritas anteriormente). La implementación de WFS 2.0 también admite transacciones, consultas almacenadas y paginación de respuestas, que no forman parte del perfil WFS básico.

Transacciones

La operación Transacción se utiliza para describir las operaciones de transformación de datos aplicadas a instancias de entidades en un servicio WFS. Con la operación Transacción, los clientes pueden crear, modificar, eliminar, sustituir y eliminar entidades en WFS. Cuando finaliza la transacción, WFS genera un documento de respuesta XML que indica el estado finalizado de la operación.

Consultas almacenadas

Las consultas almacenadas permiten que WFS 2.0 almacene las consultas de filtro complejas y que estas se ejecuten mediante una solicitud básica. Para conseguir el mismo resultado con WFS 1.0.0 o 1.1.0, un usuario debe escribir un filtro mediante una especificación de codificación y anexarlo a la dirección URL de WFS. La configuración de consultas almacenadas proporciona una amplia gama de ventajas que amplían el uso de WFS 2.0 en aplicaciones:

  • Las consultas complejas se pueden racionalizar para que se ejecuten como solicitudes HTTP GET.
  • Se puede implementar un WFS para admitir solo las consultas almacenadas de modo que el administrador pueda controlar la manera en que los usuarios acceden a los datos.
  • Las consultas almacenadas pueden reducir los costes de desarrollo de aplicaciones ya que se pueden configurar para que admitan consultas específicas, en lugar de complejas consultas ad hoc y expresiones XPath.
  • Es posible establecer interfaces RESTful encima de WFS conjuntamente con HTTP GET/POST y SOAP para habilitar WFS de modo que pueda utilizarse con aplicaciones cliente ligeras.

Las operaciones siguientes están disponibles para admitir las consultas almacenadas: GetFeatureByID, ListStoredQueries y DescribeStoredQueries (descritas a continuación).

Crear un archivo de consulta almacenada

Un archivo de consulta almacenada es un archivo XML que mantiene una lista de consultas almacenadas creadas por el editor que son de interés para un servicio concreto. Para utilizar consultas almacenadas con WFS 2.0, cree un archivo de consulta almacenada y configure el servicio para que utilice como referencia la dirección URL de su archivo de consultas almacenadas.

El siguiente ejemplo de archivo de consulta almacenada funciona con el servicio de mapas SampleWorldCities suministrado con ArcGIS Server. Puede crear el archivo y configurar el servicio para que lo utilice siguiendo las instrucciones contenidas en Configurar un servicio WFS para utilizar consultadas almacenadas. También puede modificar el archivo para que funcione con un servicio WFS diferente.

<?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

La operación GetFeatureByID selecciona un solo argumento, denominado id o tipo de xsd:string y devuelve una sola entidad cuyo identificador es igual al valor especificado del argumento id.

El siguiente ejemplo de URL invoca la consulta almacenada GetFeatureByID para obtener y mostrar una sola entidad:

http://gisserver.domain.com/wfs.cgi?SERVICE=WFS&VERSION=2.0.0& REQUEST=GetFeature& STOREDQUERY_ID=urn:ogc:def:query:OGC-WFS::GetFeatureById& ID=INWATERA_1M.1013

ListStoredQueries

La operación ListStoredQueries enumera las consultas almacenadas disponibles en ArcGIS Server. El cliente puede ejecutar una consulta almacenada por vez, por ejemplo:

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

<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

La operación DescribeStoredQueries describe las consultas almacenadas disponibles en ArcGIS Server. Esta operación resulta útil para que los clientes WFS interroguen al servidor y comprendan la índole de la consulta almacenada y los parámetros que se deben enviar para ejecutar la consulta almacenada.

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

<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>

Ejecutar una consulta almacenada como parte de una solicitud GetFeature

El siguiente es un ejemplo de una solicitud de atributo en la cual se llama a una consulta almacenada (AttributeDemo) mediante un parámetro 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

El siguiente es un ejemplo en el cual se llama a una consulta almacenada (SpatialDemo) mediante el parámetro coordinadas para obtener una lista de las ciudades estadounidenses que entran dentro de una caja de límite. Solo se devuelven las dos primeras ciudades de esta lista (tenga en cuenta el uso de startindex y count):

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

El siguiente es un ejemplo en el cual se llama a una consulta almacenada (FunctionChat_Length). La consulta almacenada en el servidor se escribe para excluir a las ciudades con nombres cuya longitud sea mayor que dos caracteres:

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

Paginación de respuestas

La paginación de respuestas permite a una solicitud especificar el índice de inicio de la entidad que se va a recuperar. También se puede especificar un recuento del número de entidades que se va a recuperar.

Mediante el servicio de mapas SampleWorldCities instalado con ArcGIS Server, la consulta siguiente devuelve dos ciudades (recuento=2): Brasilia y Goiania.

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 cambia la solicitud y hace que el índiceinicio comience en 2, la primera ciudad devuelta será Goiania. Como el recuento=2, ahora la solicitud devolverá dos ciudades: Goiania y 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