Взаимодействие с сервисом WFS в веб-браузере
В этом разделе
- Типы клиентов
- Структура URL WFS
- Использование фильтров
- Использование сервиса WFS 1.0.0 или 1.1.0 в браузере
- Использование сервиса WFS 2.0 в браузере
Для каждой операции, поддерживаемой совместимым WFS-сервером, предусмотрен онлайн-ресурс в виде унифицированного указателя информационного ресурса (URL) по протоколу HTTP, таким образом, WFS-сервис следует считать REST-сервисом. С помощью параметров URL можно использовать эти операции для получения метаданных сервиса, информации о типе объектов и GML-кодированные объекты от сервиса WFS. Эти операции и параметры подробно описаны в спецификации OGC WFS.
Типы клиентов
Сервисы WFS могут использоваться в любом клиенте, поддерживающем WFS. Чаще всего браузер – самый простой клиент сервиса WFS. Запросы WFS можно отправлять по протоколу HTTP, а ответы или исключения будут возвращаться через браузер. Все сервисы WFS поддерживают три операции: GetCapabilities, DescribeFeatureType и GetFeature. WFS 2.0 в ArcGIS Server имеет дополнительные операции: GetFeatureByID, ListStoredQueries и DescribeStoredQueries.
Также доступно большое количество клиентов сторонних производителей для работы с сервисами WFS. Для использования сервисов WFS клиент должен поддерживать WFS 1.0.0, 1.1.0 или 2.0 и профиль Simple Features GML. Кроме того, ArcGIS for Desktop может работать с сервисами WFS. Об использовании сервисов WFS в ArcMap см. раздел Добавление сервиса WFS в ArcMap.
Структура URL WFS
Для подключения к сервису необходимо знать URL, который использует следующий формат:
http://gisserver.domain.com:6080/arcgis/services/<имя папки (если необходимо)>/<имя сервиса>/<тип сервисаmpgt;/WFSServer?
- Имя сервера – это имя вашего веб-сервера.
- Номер порта – это порт, который используется веб-сервером для связи с другими компьютерами.
- Типом сервиса может быть MapServer или GeoDataServer в зависимости от того, создали вы сервис WFS на основе карты или базы геоданных соответственно.
Так, если включена функция WFS для картографического сервиса WFSDemoService в папке DemoFolder на сервере gisserver.domain.com с портом 6080, то 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?
Использование фильтров
Параметр Filter можно использовать в запросах WFS для получения определенных объектов от сервиса WFS. Преимущество параметра Filter состоит в том, что это часть стандартной пары ключевого слова и значения, определенной в разделе 9.5 спецификации реализации WFS 1.1, и его можно добавлять в конец запросов HTTP. Сервисы WFS 1.0.0 и 1.1.0 используют спецификацию реализации кодирования OGC OpenGIS (FE) версии 1.1. WFS 2.0 использует спецификацию фильтра 2.0.
В таблице перечислены применимые фильтры:
Геометрия | Пространственный | Логический | Comparison | Сортировать |
---|---|---|---|---|
Конверт | BBOX | And | EqualTo | SortBy* |
Точка | Равно | Или | NotEqualTo | |
Мультиточка | Disjoint | Нет | LessThan | |
LineString | Пересекает | GreaterThan | ||
Полигон | Пересекает | LessThanOrEqualTo | ||
Касается | GreaterThanOrEqualTo | |||
Внутри | Like | |||
Содержит | Между | |||
Перекрытия | NullCheck |
Примечание:
*Фильтр SortBy можно применять только к сервисам WFS, основанным на данных многопользовательской базы геоданных.
Например, если вы создали тип объекта blockgroups в сервисе WFS, вы можете запросить объекты blockgroups с экстентом -122.423192682619, 37.7877919206256, -122.421377806544, 37.7893634225143, отправив следующий запрос 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>
Если вы хотите запросить объект blockgroups, содержащий определенный точечный объект, например 122.431577, 37.749936, можно отправить следующий запрос 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>
Примечание:
Спецификация WFS требуется, что префиксы пространства имен были включены в строку XML фильтра. Кроме того, чтобы избежать неправильного преобразования браузерами или веб-серверами, URL кодирует строку XML фильтра перед ее отправкой на сервер.
Использование сервиса WFS 1.0.0 или 1.1.0 в браузере
Далее представлены примеры использования параметров URL для работы с сервисами WFS и WFS-T 1.0.0 и 1.1.0 в веб-браузере. Для изучения использования операций WFS 2.0 в веб-браузере см. расположенный ниже раздел Использование сервиса WFS 2.0 в веб-браузере.
GetCapabilities
Этот запрос возвращает все типы объектов и функции, доступные через сервис, в формате GML. Чтобы использовать операцию GetCapabilities, скопируйте и вставьте URL сервиса WFS в адресную строку и добавьте ?request=getcapabilities в конец URL.
Пример URL: http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/GeoDataServer/WFSServer?request=GetCapabilities
На следующем рисунке представлен пример функциональности, возвращаемой операцией GetCapabilities:
Операция GetCapabilities также возвращает список всех доступных классов и таблиц объектов:
DescribeFeatureType
Этот запрос описывает сведения о полях одного или нескольких объектов в сервисе WFS. К ним относятся имена полей, типы полей, разрешенные минимальные и максимальные значения полей и другие ограничения, заданные для поля классов или таблиц объектов.
Чтобы использовать операцию DescribeFeatureType, скопируйте и вставьте URL сервиса WFS в адресную строку и добавьте ?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&VERSION=1.1.0 в конец URL. Этот запрос возвращает сведения о полях каждого типа объектов и таблиц, доступных в сервисе.
Пример 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
Добавление фильтров
Вы также можете указать один класс объектов или одну таблицу, для которой требуется получить сведения о полях, добавив следующий запрос в конец URL с именем типа объекта или таблицы:
?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TypeName=<ввести тип объекта here>&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
GetFeature
Этот запрос возвращает информацию об определенных типах объектов, доступных через сервис WFS.
Чтобы использовать операцию GetFeature в браузере, скопируйте и вставьте URL сервиса WFS в адресную строку и добавьте ?request=getFeature&typename=<enter feature type here> в конец URL. Этот запрос возвращает все сведения об атрибутах и геометрии каждого объекта или каждой строки в типе объектов.
Пример URL: http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/GeoDataServer/WFSServer?request=getfeature&typename=cities
Добавление фильтров
Вы также можете добавить в запрос фильтры, чтобы уточнить возвращаемые результаты. Например, можно запросить все города, попадающие в указанный диапазон координат. В следующем примере два города попадают в указанный диапазон координат:
Пример 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
Вставить
Инструмент Вставить используется для создания новых объектов в запросе отдельной транзакции. По умолчанию, начальный статус создаваемого объекта выражается с использованием GML3 и должен быть проверен с помощью схемы приложения GML3, созданной операцией DescribeFeatureType. Множественные вставки могут быть выполнены в запросе отдельной транзакции.
Например, в следующем примере будут вставлены два точечных объекта, представляющих города:
<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>
Обновление
Инструмент Обновить используется для обновления объекта или объектов (одного типа геометрии) в запросе отдельной транзакции. Множественные обновления могут быть применены в запросе отдельной транзакции.
Элемент <Update> содержит один или более элементов <Property>, определяющих имя и заменяющее значение для свойства, принадлежащего типу объекта, указанному посредством обязательного атрибута typeName. Элемент <Property> содержит элемент <Name>, который содержит имя изменяемого свойства объекта, и дополнительный элемент <Value>, который содержит заменяющее значение для указанного свойства объекта. Отсутствие элемента <Value> означает, что свойству должно быть присвоено значение 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>
Удалить
Инструмент Удалить используется для удаления одного или более объектов (одного типа геометрии) в запросе отдельной транзакции. Удалить задается с помощью элемента <Filter>. В случае, когда элемент <Filter> не установит ни одного экземпляра объекта для удаления, запрос удаления будет проигнорирован.
Например, в следующем примере будут удалены два точечных объекта в наборе данных с именем 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
Параметр FeatureID можно использовать в запросах GetFeature для получения определенных объектов от сервиса WFS. Параметр FeatureID состоит из типа объекта и ID объекта (gml:id), но не идентификатора объекта (OBJECTID). Формат идентификатора объекта сервиса WFS – <FeatureType>.<gml:id>. Один из методов определения gml:id объекта в сервисе WFS – выполнить запрос GetFeature для интересующего типа объекта.
Примечание:
Идентификаторы объектов gml:ids не предоставляются для объектов в сервисах WFS, основанных на шейп-файлах.
Допустим, что в сервисе WFS есть тип объекта Cities. Если выполнить запрос GetFeature для Cities, ответ будет содержать gml:id для каждого объекта.
Пример URL: http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/GeoDataServer/WFSServer?request=getfeature&typename=cities
В этом примере ID объекта для Ванкувера будет иметь значение cities.F293__1. Следующий запрос можно использовать для запроса города Ванкувер с помощью ID объекта:
http://gisserver.domain.com:6080/arcgis/services/wfs_services/enterprise_wfs/GeoDataServer/WFSServer?request=getfeature&featureid=cities.F293__1
Использование сервиса WFS 2.0 в браузере
Реализация ArcGIS Server спецификации WFS 2.0 адресует к нужным объектам простого профиля WFSe, как того требует спецификация 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.
- WFS можно настроить на поддержку только сохраненных запросов, чтобы администратор мог контролировать доступ пользователей к данным.
- Сохраненные запросы позволят уменьшить стоимость разработки приложений, поскольку могут быть настроены на поддержку конкретных запросов вместо сложных запросов для конкретного случая и выражений XPath.
- Интерфейсы REST устанавливаются сверху WFS, наряду с HTTP GET/POST и SOAP, для включения WFS на использование тонкими клиентами.
Для поддержки сохраненных запросов доступны следующие операции: GetFeatureByID, ListStoredQueries и DescribeStoredQueries (описаны ниже).
Создание файла сохраненного запроса
Файл сохраненного запроса – это файл XML, сохраняющий список созданных издателем запросов, подходящих для конкретного сервиса. Для использования сохраненных запросов с WFS 2.0 создайте файл сохраненных запросов и настройте сервис, чтобы он ссылался на URL вашего файла сохраненных запросов.
В приведенном ниже примере файл сохраненных запросов работает с картографическим сервисом SampleWorldCities, входящем в установку ArcGIS Server. Вы можете создать файл и настроить сервис для работы, следуя инструкциям в разделе Настройка сервиса 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) вызывается с помощью параметра coordinates для получения списка городов США, попадающих в ограничивающий прямоугольник. Только первые два города возвращаются из списка (помните о работе начального индекса и количества)
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
Отклики на вызовы
Отклики на вызовы допускают запросы для указания начального индекса нужного объекта. Кроме того, можно указать число получаемых объектов.
С помощью картографического сервиса SampleWorldCities, установленного с ArcGIS Server, следующий запрос возвращает два города (count=2): Бразилиа и Гояния.
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, первым возвращенным городом будет Гояния. Если count=2, запрос возвратит два города: Гояния и Кампо Гранде.
http://gisserver.domain.com:6080/arcgis/services/SampleWorldCities/MapServer/WFSServer?service=WFS&version=2.0.0&REQUEST=getFeature&TypeName=cities&startIndex=2&count=2