Skip to main content

Взаимодействие с сервисом WFS в веб-браузере

Для каждой операции, поддерживаемой совместимым WFS-сервером, предусмотрен онлайн-ресурс в виде унифицированного указателя информационного ресурса (URL) по протоколу HTTP, таким образом, WFS-сервис следует считать REST-сервисом. С помощью параметров URL можно использовать эти операции для получения метаданных сервиса, информации о типе объектов и GML-кодированные объекты от сервиса WFS. Эти операции и параметры подробно описаны в спецификации OGC WFS.

Типы клиентов

Сервисы WFS могут использоваться в любом клиенте, поддерживающем WFS. Чаще всего браузер – самый простой клиент сервиса WFS. Запросы WFS можно отправлять по протоколу HTTP, а ответы или исключения будут возвращаться через браузер. Все сервисы WFS поддерживают три операции: GetCapabilities, DescribeFeatureType и GetFeature. WFS 2.0.0 в ArcGIS Server поддерживает дополнительные операции: GetFeatureByID, ListStoredQueries и DescribeStoredQueries.

Также доступно большое количество клиентов сторонних производителей для работы с сервисами WFS. Для использования сервисов WFS клиент должен поддерживать WFS 1.0.0, 1.1.0 или 2.0.0 и профиль Simple Features GML. Кроме того, ArcGIS Pro может работать с сервисами WFS. Справку по работе с сервисами WFS в ArcGIS Pro, см. в статье Добавление сервисов WFS.

Структура URL WFS

Для подключения к сервису необходимо знать URL, который использует следующий формат:

http://gisserver.example.com:6080/arcgis/services/<folder name (if applicable)>/<service name>/MapServer/WFSServer?

  • Имя сервера – это имя вашего веб-сервера.

  • Номер порта – это порт, который используется веб-сервером для связи с другими компьютерами.

Так, если вы включите функцию WFS для картографического сервиса WFSDemoService в папке DemoFolder на сервере gisserver.example.com с портом 6080, то GetCapabilities URL будет выглядеть следующим образом:

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

Использование фильтров

Параметр Filter можно использовать в запросах WFS для получения определенных объектов от сервиса WFS. Преимущество параметра Filter состоит в том, что это часть стандартной пары ключевого слова и значения, определенной в разделе 9.5 спецификации реализации WFS 1.1, и его можно добавлять в конец запросов HTTP. Сервисы WFS 1.0.0 и 1.1.0 используют спецификацию реализации кодирования OGC OpenGIS (FE) версии 1.1.0. WFS 2.0.0 использует спецификацию фильтра 2.0.0.

В таблице перечислены применимые фильтры:

Geometry Пространственный Логические Сравнение
Envelope BBOX And EqualTo
Точка Equals Or NotEqualTo
MultiPoint Disjoint Not LessThan
LineString Пересекает GreaterThan
Полигон Пересекает LessThanOrEqualTo
Касается GreaterThanOrEqualTo
Внутри Like
Contains Between
Перекрытия NullCheck

Например, если вы создали FeatureType с именем blockgroups в сервисе WFS, вы можете запросить объекты blockgroup с экстентом -122.423192682619, 37.7877919206256, -122.421377806544, 37.7893634225143, отправив следующий запрос GetFeature:

http://gisserver.example.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>

Чтобы запросить объект blockgroups, содержащий определенный точечный объект, например 122.431577, 37.749936, можно отправить следующий запрос GetFeature:

http://gisserver.example.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:coord srsName="urn:x-ogc:def:crs:EPSG:4326"><gml:X>37.749936</gml:X><gml:Y>-122.431577</gml:Y></gml:coord></gml:Point></ogc:Contains></ogc:Filter>

Примечание:

Спецификация WFS требует, чтобы в XML-строке фильтра присутствовали все используемые префиксы пространств имен. Кроме того, чтобы избежать неправильного преобразования браузерами или веб-серверами, URL кодирует строку XML фильтра перед ее отправкой на сервер.

Использование сервиса WFS 1.0.0 или 1.1.0 в браузере

Далее представлены примеры использования параметров URL для работы с сервисами WFS и WFS-T 1.0.0 и 1.1.0 в веб-браузере. Для изучения использования операций WFS 2.0.0 в веб-браузере см. расположенный ниже раздел Использование сервиса WFS 2.0 в веб-браузере.

GetCapabilities

Этот запрос возвращает все типы объектов и функции, доступные через сервис, в формате GML. Чтобы использовать операцию GetCapabilities, скопируйте и вставьте URL сервиса WFS в адресную строку и добавьте ?service=WFS&request=getcapabilities в конец URL. См. пример ниже:

http://gisserver.example.com:6080/arcgis/services/wfs_services/enterprise_wfs/MapServer/WFSServer?service=WFS&request=GetCapabilities

DescribeFeatureType

Этот запрос описывает сведения о полях одного или нескольких объектов в сервисе WFS. К ним относятся имена полей, типы полей, разрешенные минимальные и максимальные значения полей и другие ограничения, заданные для поля класса объектов или таблицы.

Чтобы использовать операцию DescribeFeatureType, скопируйте и вставьте URL сервиса WFS в адресную строку и добавьте ?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&VERSION=1.1.0 в конец URL. Этот запрос возвращает сведения о полях каждого типа объектов и таблиц, доступных в сервисе. См. пример ниже:

http://gisserver.example.com:6080/arcgis/services/wfs_services/enterprise_wfs/MapServer/WFSServer?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&VERSION=1.1.0

Вы также можете указать один класс объектов или одну таблицу, для которой требуется получить сведения о полях, добавив следующий запрос в конец URL с именем типа объекта или таблицы:

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

В следующем примере запрос DescribeFeatureType используется для определения информации о полях для типа объектов continent:

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

GetFeature

Этот запрос возвращает информацию об определенных типах объектов, доступных через сервис WFS.

Чтобы использовать операцию GetFeature, скопируйте и вставьте URL сервиса WFS в адресную строку и добавьте ?service=WFS&version=1.1.0&request=GetFeature&typeName=<enter feature type here> в конец URL. Этот запрос возвращает все сведения об атрибутах и геометрии каждого объекта или каждой строки в типе объектов. См. пример ниже:

http://gisserver.example.com:6080/arcgis/services/wfs_services/enterprise_wfs/MapServer/WFSServer?service=WFS&version=1.1.0&request=GetFeature&typeName=cities

Вы также можете добавить в запрос фильтры, чтобы уточнить возвращаемые результаты. Например, можно запросить все города, попадающие в указанный диапазон координат. В следующем примере три города попадают в указанный диапазон координат:

http://gisserver.example.com:6080/arcgis/services/wfs_services/enterprise_wfs/MapServer/WFSServer?service=WFS&version=1.1.0&request=GetFeature&typeName=cities&BBOX=46.90,-76.21,42.12,-72.88

Insert (Вставить)

Insert используется для создания новых объектов в запросе отдельной транзакции. По умолчанию, начальный статус создаваемого объекта выражается с использованием GML3 и должен быть проверен с помощью схемы приложения GML3, созданной операцией DescribeFeatureType.

Например, в следующем примере POST будет вставлен точечный объект, представляющий город:

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

Обновление

Update используется для обновления объекта или объектов (одного типа геометрии) в запросе отдельной транзакции.

Элемент содержит один или более элементов , определяющих имя и заменяющее значение для свойства, принадлежащего типу объекта, указанному посредством обязательного атрибута typeName. Элемент содержит элемент , который содержит имя изменяемого свойства объекта, и дополнительный элемент , который содержит заменяющее значение для указанного свойства объекта. Отсутствие элемента означает, что свойству должно быть присвоено значение NULL. В случае, если это свойство не обнуляемое, WFS должен выдать исключение, показывающее, что значение NULL не разрешено.

В следующем примере POST будет обновлен точечный объект в наборе данных с именем 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:Name>POPULATION</wfs:Name>
    <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>

Удалить

Delete используется для удаления одного или более объектов (одного типа геометрии) в запросе отдельной транзакции. Delete задается с помощью элемента . В случае, когда элемент не установит ни одного экземпляра объекта для удаления, запрос удаления будет проигнорирован.

В следующем примере POST будут удалены два точечных объекта в наборе данных с именем 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>

Использование сервиса WFS 2.0 в браузере

Реализация спецификации WFS 2.0.0 в ArcGIS Server поддерживает обязательные возможности базового профиля WFS, определенные в спецификации WFS 2.0. Это операции GetCapabilities, DescribeFeatureType и GetFeature (описанные выше). Реализация WFS 2.0 также поддерживает транзакции, сохраненные запросы и отклики на вызовы, не являющиеся частью простого профиля WFS.

Транзакции

Операция Transaction (Транзакция) используется для описания операций преобразования данных, применимых к экземплярам объектов сервиса WFS. С помощью операции Transaction клиенты могут создавать, изменять и удалять объекты в WFS. По завершении транзакции WFS создает XML-документ ответа, содержащий статус завершения операции.

Сохраненные запросы

Сохраненные запросы позволяют сохранять в WFS 2.0 сложные фильтры запросов и выполнять их посредством простого запроса. Для получения такого же результата в WFS 1.0.0 или 1.1.0 вам потребуется написать фильтр с помощью спецификации кодировки фильтра и присоединить его к URL сервиса WFS. Настройка сохраненных запросов предоставляет следующие преимущества, которые расширяют применение WFS 2.0 в приложениях:

  • Сложные запросы могут быть модернизированы с целью запуска в качестве запросов HTTP GET.

  • Сохраненные запросы позволят уменьшить стоимость разработки приложений, поскольку могут быть настроены на поддержку конкретных запросов вместо сложных запросов для конкретного случая и выражений XPath.

  • Интерфейсы REST устанавливаются сверху WFS, наряду с HTTP GET/POST и SOAP, для включения WFS на использование тонкими клиентами.

Для поддержки сохраненных запросов доступны следующие операции: GetFeatureByID, ListStoredQueries и DescribeStoredQueries (описаны ниже).

Создание файла сохраненного запроса

Файл сохраненного запроса – это файл .xml, сохраняющий список созданных издателем запросов, подходящих для конкретного сервиса. Для использования сохраненных запросов с WFS 2.0 создайте файл сохраненных запросов и настройте сервис, чтобы он ссылался на URL вашего файла сохраненных запросов.

В приведенном ниже примере файл сохраненных запросов работает с картографическим сервисом SampleWorldCities, входящем в установку ArcGIS Server. Вы можете использовать этот пример и изменить файл для работы с другим сервисом 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.example.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

Операция ListStoredQueries перечисляет сохраненные запросы, доступные в ArcGIS Server. Клиент может запустить одновременно один сохраненный запрос, к примеру:

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

DescribeStoredQueries

Операция DescribeStoredQueries описывает сохраненные запросы, доступные в ArcGIS Server. Эта операция полезна для клиентов WFS для изучения свойств сервера, понимания природы сохраненного запроса и параметров, которые необходимы для запуска сохраненного запроса.

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

Запуск сохраненного запроса как части запроса GetFeature

Ниже приведен пример атрибутивного запроса, в котором сохраненный запрос (AttributeDemo) вызывается параметром myrank=3:

http://gisserver.example.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) вызывается с помощью параметра coordinates для получения списка городов США, попадающих в ограничивающий прямоугольник. Только первые два города возвращаются из списка (помните о работе начального индекса и количества):

http://gisserver.example.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

Ниже приводится пример, в котором вызывается сохраненный запрос (FunctionChar_Length). Сохраненный запрос записывается на сервере с целью фильтрации городов, названия которых состоят более чем из двух символов:

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

Постраничный вывод ответов

Постраничный вывод ответов позволяет указывать в запросе начальный индекс объекта, который необходимо получить. Кроме того, можно указать число получаемых объектов.

С помощью картографического сервиса SampleWorldCities, установленного с ArcGIS Server, следующий запрос возвращает два города (count=2): Brasilia и Goiania.

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

Если вы измените запрос и ваш начальный индекс будет 2, первым возвращенным городом будет Goiania. Если count=2, запрос возвратит два города: Goiania и Campo Grande.

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

Пользовательский параметр ForceEPSGAxisOrder

ForceEPSGAxisOrder — это пользовательский параметр, который можно отправить с помощью запроса WFS GetFeature, когда запрашивается выходной формат GeoJSON. По умолчанию выходной формат GeoJSON возвращает координаты в формате WGS84 с порядком оси долготы и широты, соответствующим спецификации RFC 7946 GeoJSON. Установка для этого параметра значения true приводит к тому, что порядок осей координат возвращается в соответствии с указанным кодом EPSG. Например, следующий запрос возвращает координаты в порядке широты и долготы, как определено EPSG:4326:

https:///arcgis/services/SampleWorldCities/MapServer/WFSServer?service=wfs&version=2.0.0&&request=GetFeature&typeNames=cities&outputFormat=GEOJSON&srsName=EPSG:4326&ForceEPSGAxisOrder=true