Skip To Content

在 Web 浏览器中与 WFS 服务进行通信

在本主题中

兼容 WFS 服务器所支持的每种操作的在线资源都是一个 HTTP 统一资源定位器 (URL),所以 WFS 服务可被视为一项表述性状态转移 (REST) 服务。通过 URL 参数,您可以使用这些操作来获取 WFS 服务的服务元数据、要素类型信息和 GML 编码的要素。在 OGC WFS 规范中有这些操作与参数的详细介绍。

客户端的类型

WFS 服务可用于任何支持 WFS 的客户端。通常,Web 浏览器是 WFS 服务最基本的客户端。您可通过 HTTP 发出 WFS 请求,之后,响应或异常将会通过浏览器返回。所有 WFS 服务都支持以下三种主要操作:GetCapabilities、DescribeFeatureType 和 GetFeature。WFS 2.0 的 ArcGIS Server 实施将定义其他操作:GetFeatureByID、ListStoredQueries 和 DescribeStoredQueries。

许多第三方客户端都可以使用 WFS 服务:要使用 WFS 服务,客户端必须支持 WFS 1.0.0、1.1.0 或 2.0 以及 GML 简单要素专用标准。此外,ArcGIS for Desktop 也支持 WFS 服务。有关在 ArcMap 中使用 WFS 服务的帮助,请参阅向 ArcMap 中添加 WFS 服务

WFS URL 结构

要连接到服务,您需要了解 URL,其格式如下:

http://gisserver.domain.com:6080/arcgis/services/<文件夹名称(如果适用)>/<服务名称>/<服务类型/WFSServer?

  • 服务器名称是您的 Web 服务器计算机的名称。
  • 端口号是您的 web 服务器计算机用于与其他计算机通信的端口。
  • 服务类型可以是 MapServer 或 GeoDataServer,这取决于您是从地图还是从地理数据库创建 WFS 服务。

例如,如果您对地图服务 WFSDemoService(服务器名 gisserver.domain.com,端口号 6080,文件夹 DemoFolder)上启用了 WFS 服务功能,URL 将如下所示:

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

同样,如果您对地理数据服务上启用了 WFS 服务功能,URL 将如下所示:

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

使用过滤器

在 WFS 请求中可使用 Filter 参数来获取 WFS 服务中的指定要素。Filter 参数的优势在于,它是 WFS 1.1 执行规范第 9.5 节中所定义的标准关键字-值对编码的一部分,并且可追加到 HTTP 请求的末尾。WFS 1.0.0 和 1.1.0 服务使用 OGC OpenGIS 过滤器编码执行规范 (FE) 版本 1.1。WFS 2.0 使用过滤器规范的版本 2.0。

下表中列出了您可以应用的过滤器:

几何服务空间逻辑比较排序

Envelope

BBOX

And

EqualTo

SortBy*

Point

Equals

Or

NotEqualTo

MultiPoint

Disjoint

Not

LessThan

LineString

Intersects

GreaterThan

Crosses

LessThanOrEqualTo

Touches

GreaterThanOrEqualTo

Within

Like

Contains

Between

Overlaps

NullCheck

注:

*SortBy 过滤器仅可应用于由存储在企业级地理数据库中数据发布而获取的 WFS 服务。

例如,如果在 WFS 服务中创建了一个名为 blockgroups 的要素类型,则可通过发送以下 GetFeature 请求来获取 -122.423192682619, 37.7877919206256, -122.421377806544, 37.7893634225143 范围内的 blockgroup 要素:

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>

如果要请求一个包含特定点要素(如 122.431577, 37.749936)的 blockgroups 要素,可发送以下 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>

注:

WFS 要求过滤器 XML 字符串中包含相关的命名空间前缀。此外,为避免 Web 浏览器或 Web 服务器完成不正确的转换,应先对过滤器 XML 字符串进行 URL 编码,然后再将其发送到服务器。

在 Web 浏览器中使用 WFS 1.0.0 或 1.1.0 服务

以下示例使用 URL 参数在 Web 浏览器中与 WFS、WFS-T 1.0.0 和 1.1.0 服务进行通信。要了解如何在 Web 浏览器中使用 WFS 2.0 操作,请参阅下文的在 Web 浏览器中使用 WFS 2.0 服务

GetCapabilities

此请求将通过服务以 GML 格式返回所有可用的要素类型与功能。要使用 GetCapabilities 操作,请复制 WFS 服务 URL 并将其粘贴到地址栏中,然后在 URL 末尾添加 ?request=getcapabilities

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

下图是由 GetCapabilities 操作返回的功能示例:

GetCapabilities 操作返回的功能

GetCapabilities 操作也可返回所有可用要素类和表的列表:

GetCapabilities 操作返回的可用要素类和表

DescribeFeatureType

该请求描述了有关 WFS 服务中一个或多个要素的字段信息。这包括字段名称、字段类型、允许的最小与最大字段值以及在要素类或者表的字段上所设置的任何其他限制。

要使用 DescribeFeatureType 操作,请复制 WFS URL 并将其粘贴到地址栏中,然后在 URL 末尾添加?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&VERSION=1.1.0。这将返回有关要素服务中各可用要素类型和表的所有字段信息。

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

DescribeFeatureType 操作返回的要素类、表和字段信息

添加过滤器

通过将下列带有要素类型名称或表名称的请求添加到 URL 的末尾,您也可以指定您需要其字段信息的单个要素类或表:

?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TypeName=<在此输入要素类型>&VERSION=1.1.0

在下例中,DescribeFeatureType 请求用于识别名为 cities 的要素类型的字段信息。

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

过滤的 DescribeFeatureType 操作返回的 Cities 要素类及其字段信息

GetFeature

该请求通过 WFS 服务返回有关可用的指定要素类型的信息。

要在 Web 浏览器中使用 GetFeature 操作,请复制 WFS URL 并将其粘贴到地址栏中,然后在 URL 末尾添加?request=getFeature&typename=<在此输入要素类型>。这将返回有关此要素类型中各个要素和行的所有属性和几何信息。

URL 示例:http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/GeoDataServer/WFSServer?request=getfeature&typename=cities

GetFeature 操作返回的城市要素类的属性和几何信息

添加过滤器

您也可以在请求中添加过滤器来优化返回的结果。例如,可以请求返回指定坐标范围内的所有城市。在下例中,两个城市位于指定的坐标范围内:

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

过滤的 GetFeature 操作返回的指定坐标范围内的城市

插入

插入用于在单个事务请求中创建新要素。默认情况下,待创建要素的初始状态使用 GML3 来表示,并且必须相对于由 DescribeFeatureType 操作生成的 GML3 应用程序方案进行验证。单次事务请求中可包括多次插入。

例如,以下示例插入了两个表示城市的点要素:

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

更新

更新用于更新单个事务请求中的一个要素或一种类型的多个要素。单个事务请求中可应用多次更新。

<更新> 元素包含一个或多个 <属性> 元素,这些属性元素可使用强制的 typeName 属性指定属于特定要素类型的属性的名称和替换值。<属性> 元素中包括含有待修改要素属性名称的 <名称> 元素和含有命名要素属性替换值的 <值> 元素(可选)。遗漏 <值> 元素意味着属性应指定为 NULL 值。在属性不可为空的情况下,WFS 必须引发异常,表示不允许存在 NULL 值。

例如,以下示例在名为 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>

删除

删除用于删除单个事务请求中的一个要素或一种类型的多个要素。使用 <过滤器> 元素定义“删除”。在 <过滤器> 元素不识别任何要删除的要素实例的情况下,删除请求将被忽略。

例如,以下示例在名为 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>

使用 FeatureID 参数。

在 GetFeature 请求中可使用 FeatureID 参数来请求 WFS 服务中的指定要素。FeatureID 参数由要素类型和要素 ID (gml:id),而不是要素的 OBJECTID 组成。WFS 服务中要素的要素 ID 格式为 <FeatureType>.<gml:id>。在 WFS 服务中识别要素的 gml:id 的一个方法是在感兴趣的要素类型上执行 GetFeature 请求。

注:

基于 shapefile 的 WFS 服务中不提供要素的 gml:id 要素 ID。

例如,假设 WFS 服务中存在一个名为 Cities 的要素类型。如果您对 Cities 执行 GetFeature 请求,则响应将包括每个要素的 gml:id。

URL 示例:http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/GeoDataServer/WFSServer?request=getfeature&typename=cities

GetFeature 请求

在此示例中,温哥华市的要素 ID 为 cities.F293__1。以下请求可使用要素 ID 专用于请求温哥华市:

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

在 Web 浏览器中使用 WFS 2.0 服务

WFS 2.0 规范的 ArcGIS Server 实施可提供包括基本 WFS 配置文件在内的所需功能,正如 WFS 2.0 规范中所述。其中包括 GetCapabilities、DescribeFeatureType 和 GetFeature 操作(如上所述)。WFS 2.0 实施还支持事务、已存储的查询和响应页面,这些并不属于基本 WFS 配置文件。

事务

事务操作用于描述应用于 WFS 服务中要素实例的数据变换操作。使用事务操作和客户端可以在 WFS 中创建、修改、替换和删除要素。完成事务后,WFS 将生成一个指明操作完成状态的 XML 响应文档。

存储的查询

存储的查询允许 WFS 2.0 存储复杂过滤器查询并使用基本请求来执行。要使用 WFS 1.0.0 或 1.1.0 获得相同的结果,用户需要使用过滤器编码规范编写一个过滤器,并将其追加到 WFS URL。配置存储的查询可给您带来很多好处。例如,可使 WFS 2.0 在应用程序中得到更广泛地应用:

  • 可简化复杂查询以便将其作为 HTTP GET 请求来执行。
  • 可实施 WFS 来仅支持存储的查询,以便管理员控制用户如何访问数据。
  • 由于存储的查询可配置为支持特定查询,但不支持复杂即时查询和 XPath 表达式,因此它可减少应用程序开发的成本。
  • 可以将 RESTful 接口与 HTTP GET/POST 和 SOAP 一起建立在 WFS 之上,从而使 WFS 能够在轻量级客户端应用程序中使用。

以下操作可用于支持存储的查询:GetFeatureByID、ListStoredQueries 和 DescribeStoredQueries(如下文所述)。

创建存储的查询文件

存储的查询文件为 XML 文件,该文件包含与特定服务相关的由发布者创建的存储的查询。要通过 WFS 2.0 使用存储查询,需要创建一个存储查询文件并配置服务以便引用存储查询文件的 URL

以下存储查询文件示例与包含在 ArcGIS Server 中的 SampleWorldCities 地图服务一起使用。可以创建文件并配置服务以便根据配置 WFS 服务以使用存储查询中的说明加以使用。还可修改文件以与不同的 WFS 服务一起使用。

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

GetFeatureByID 操作采用名为 id 的单个参数或类型 xsd:string,并返回具有与指定的 id 参数值等同标识符的单个要素。

以下 URL 示例会调用 GetFeatureByID 存储的查询来检索并显示单个要素:

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

ListStoredQueries 操作会列出 ArcGIS Server 中可用的存储查询。客户端可以一次执行一个存储查询,例如:

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

DescribeStoredQueries 操作用于描述 ArcGIS Server 中可用的存储查询。此操作对于 WFS 客户端询问服务器、了解存储查询的特性以及需要发送以便执行存储查询的参数来说非常有用。

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>

作为 GetFeature 请求的一部分执行存储的查询

以下是某个属性请求的示例,其中某一存储查询 (AttributeDemo) 是通过 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

以下示例为通过坐标参数调用的存储查询 (SpatialDemo),该存储查询可检索落入边界框内的美国城市的列表。仅返回该列表中的前两个城市(请注意开始索引和计数的使用):

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

以下为调用存储查询 (FunctionChat_Length) 的示例。将写入服务器上的存储查询来过滤出名称长度大于两个字符的城市:

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

响应页面

响应页面允许请求指定用于检索的要素的开始索引。此外,还可指定用于检索的要素的计数。

使用与 ArcGIS Server 一同安装的 SampleWorldCities 地图服务,以下查询将返回两个城市(计数为 2):Brasilia 和 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

如果您更改了请求并将开始索引设置为以 2 开始,则首先返回的城市为 Goiania。由于计数为 2,现在将与请求一起返回两个城市:Goiania 和 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