在 Web 浏览器中与 WFS 服务进行通信
兼容 WFS 服务器所支持的每种操作的在线资源都是一个 HTTP 统一资源定位器 (URL),所以 WFS 服务可被视为一项表述性状态转移 (REST) 服务。通过 URL 参数,您可以使用这些操作来获取 WFS 服务的服务元数据、要素类型信息和 GML 编码的要素。在 OGC WFS 规范中有这些操作与参数的详细介绍。
客户端的类型
WFS 服务可用于任何支持 WFS 的客户端。通常,Web 浏览器是最简单的 WFS 服务客户端。您可通过 HTTP 发出 WFS 请求,之后,响应或异常将会通过浏览器返回。所有的 WFS 服务都支持三种操作:GetCapabilities、DescribeFeatureType 以及 GetFeature。
许多第三方客户端都可以使用 WFS 服务:要使用 WFS 服务,客户端必须支持 WFS 1.0.0 或 1.1.0 以及 GML 简单要素专用标准。此外,ArcGIS for Desktop 也可使用 WFS 服务。有关在 ArcMap 中使用 WFS 服务的帮助,请参阅如何通过 ArcGIS for Desktop 使用 WFS。
WFS URL 结构
要连接该服务,您需要了解其 URL 结构:
http://<服务器名称>:<端口号>/arcgis/services/<文件夹名称(如果适用)>/<服务名称>/<服务类型>/WFSServer?
- 服务器名称是您的 Web 服务器计算机的名称。
- 端口号是您的 Web 服务器计算机与其他计算机进行通信的端口。
- 服务类型可以是 MapServer 或 GeoDataServer,这取决于您是从地图还是从地理数据库中创建 WFS 服务。
例如,如果您对地图服务 WFSDemoService(服务器名 myserver,端口号 6080,文件夹 DemoFolder)上启用了 WFS 服务能力,ULR 将如下所示:
http://myserver:6080/arcgis/services/DemoFolder/WFSDemoService/MapServer/WFSServer?request=GetCapabilities
同样,如果您对地理数据服务上启用了 WFS 服务能力,URL 将如下所示:
http://myserver:6080/arcgis/services/DemoFolder/WFSDemoService/GeoDataServer/WFSServer?
使用过滤器
在 WFS 请求中可使用 Filter 参数来获得 WFS 服务中的特定要素。Filter 参数的优势在于,它是 WFS 1.1 执行规范第 9.5 节中所定义的标准关键字-值对编码的一部分,并且可追加到 HTTP 请求的末尾。WFS 服务使用的是 OGC OpenGIS 过滤器编码执行规范 (FE) 版本 1.1。
以下是您可以应用的过滤器:
几何 |
空间 |
逻辑 |
比较 |
排序 |
---|---|---|---|---|
Envelope |
BBOX |
And |
EqualTo |
SortBy* |
Point |
Equals |
Or |
NotEqualTo | |
MultiPoint |
Disjoint |
Not |
LessThan | |
LineString |
Intersects |
GreaterThan | ||
Polygon |
Crosses |
LessThanOrEqualTo | ||
Touches |
GreaterThanOrEqualTo | |||
Within |
Like | |||
Contains |
Between | |||
Overlaps |
NullCheck |
*SortBy 过滤器仅可应用于由存储在 ArcSDE 地理数据库中数据发布而获取的 WFS 服务。
例如,如果在 WFS 服务中创建了一个名为 blockgroups 的 FeatureType,则可通过发送以下 GetFeature 请求来获取 -122.423192682619, 37.7877919206256, -122.421377806544, 37.7893634225143 范围内的 blockgoup 要素:
http://myserver: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://myserver: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 服务
以下是使用 URL 参数在 Web 浏览器中与 WMS 服务进行通信的示例:
GetCapabilities
此请求将通过服务以 GML 格式返回所有可用的要素类型与功能。要使用 GetCapabilities 操作,请复制 WFS 服务的 URL 并将其粘贴到地址栏中,然后在 URL 末尾添加 ?request=getcapabilities。
URL 示例: http://myserver:6080/arcgis/services/wfs_services/ArcSDE_wfs/GeoDataServer/WFSServer?request=GetCapabilities
下图是由 GetCapabilities 操作返回的功能示例:
GetCapabilities 也可返回所有可用要素类和表的列表:
DescribeFeatureType
该请求描述了有关 WFS 服务中一个或多个要素的字段信息。这包括字段名称、字段类型、允许的最小与最大字段值以及在要素类或者表的字段上所设置的任何其他限制。
要使用 DescribeFeatureType 操作,请复制 WFS URL 并将其粘贴到地址栏中,然后在 URL 末尾添加 ?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&VERSION=1.1.0。这将返回有关要素服务中各个可用的要素类型和表的所有字段信息。
URL 示例: http://myserver:6080/arcgis/services/wfs_services/ArcSDE_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=<在此输入要素类型>&VERSION=1.1.0
在下例中,DescribeFeatureType 请求用于识别名为 cities 的要素类型的字段信息。
URL 示例: http://myserver:6080/arcgis/services/wfs_services/ArcSDE_wfs/GeoDataServer/WFSServer?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TypeName=cities&VERSION=1.1.0
GetFeature
该请求通过 WFS 服务返回有关可用的指定要素类型的信息。
要在 Web 浏览器中使用 GetFeature 操作,请复制 WFS URL 并将其粘贴到地址栏中,然后在 URL 末尾添加 ?request=getFeature&typename=<在此输入要素类型>。这将返回有关此要素类型中各个要素和行的所有属性和几何信息。
URL 示例: http://myserver:6080/arcgis/services/wfs_services/ArcSDE_wfs/GeoDataServer/WFSServer?request=getfeature&typename=cities
添加过滤器
您也可以在请求中添加过滤器来优化返回的结果。例如,可以请求返回指定坐标范围内的所有城市。在下例中,两个城市位于指定的坐标范围内:
URL 示例: http://myserver:6080/arcgis/services/wfs_services/ArcSDE_wfs/GeoDataServer/WFSServer?request=getfeature&typename=cities&BBOX=46.90,-76.21,42.12,-72.88
使用 FeatureID 参数。
在 GetFeature 请求中可使用 FeatureID 参数来请求 WFS 服务中的指定要素。FeatureID 参数由要素类型和要素 ID (gml:id)(不是要素的 OBJECTID)组成。WFS 服务中要素的要素 ID 的格式为 <FeatureType>.<gml:id>。在 WFS 服务中识别要素的 gml:id 的一个方法是在感兴趣的要素类型上执行 GetFeature 请求。
基于 shapefile 的 WFS 服务中不提供要素的 gml:ids。
例如,假设在 WFS 服务中有一个名为 Cities 的要素类型。如果您对 Cities 执行 GetFeature 请求,则响应将包括每个要素的 gml:id。
URL 示例: http://myserver:6080/arcgis/services/wfs_services/ArcSDE_wfs/GeoDataServer/WFSServer?request=getfeature&typename=cities
在此示例中,城市 Vancouver 的要素 ID 将为 cities.F293__1。以下请求可使用要素 ID 专用于请求城市 Vancouver:
http://myserver:6080/arcgis/services/wfs_services/ArcSDE_wfs/GeoDataServer/WFSServer?request=getfeature&featureid=cities.F293__1