作者:非法小恋
##一、什么是WFS服务
支持对地理要素的插入,更新,删除,检索和发现服务。该服务根据HTTP客户请求返回GML(Geography Markup Language、地理标识语言)数据。
WFS服务多用于查询要素,WFS通过OGC Filter构造查询条件,支持基于空间几何关系的查询,基于属性域的查询,当然还包括基于空间关系和属性域的共同查询。
##二、WFS服务请求步骤
- 客户端向 WFS 服务请求 Capabilities 文档。Capabilities 文档包含了对 WFS 服务支持的所有操作的描述,以及 WFS 服务可以提供服务的所有要素类型列表。
- 客户端(可选)向 WFS 服务请求一个或多个 WFS 服务可以提供服务的要素类型。
- 基于要素类型的定义,客户端生成 Capabilities 文档中的指定请求。
- 客户端将请求提交到 Web 服务器。
- 服务器调用 WFS 服务处理请求。
- WFS 服务完成请求处理之后会生成一个状态报告,并将这个状态报告传回给客户端。如果有错误发生,状态报告会将错误指出。
##三、WFS基本操作
目前分为以下几种操作:(这里使用iServer7C范例进行展示)
####1.GetCapabilities 操作
一个 WFS可以描述其能力,并且必须指出它可以服务的要素类型和每个要素类型所能支持的操作,通俗的讲就是获取WFS的能力文件。
例如构建请求地址:
http://localhost:8090/iserver/services/data-world/wfs100/utf-8?SERVICE=WFS&REQUEST=GetCapabilities&VERSION=1.0.0
表示查看该WFS服务的能力文件。
####2.DescribeFeatureType 操作
WFS能够在请求中描述其可以提供服务的任何要素类型的结构。通俗的讲就是获取某个数据集中的字段类型。
例如构建请求地址:
http://localhost:8090/iserver/services/data-world/wfs100/utf-8?REQUEST=DescribeFeatureType&TypeName=World:Countries
表示查看World:Countries数据集字段类型。
####3.GetFeature 操作
WFS可以为一个获取要素实例的请求提供服务。另外,客户端可以指定获取要素的哪些属性,并且可以使用空间和非空间的查询限制条件。通俗的讲就是通过查询,获取某个数据集中的具体内容。
例如构建请求地址:
http://localhost:8090/iserver/services/data-world/wfs100/utf-8?SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=World:Capitals&MAXFEATURES=5
表示查看World:Capitals 中的前5个要素。
##四、iClient目前支持的WFS版本
- iClient for JavaScript 支持 WFS1.0.0/1.1.0
- iClient for Flash 支持 WFS1.0.0
- iClient for Silverlight 支持WFS1.0.0
##五、iClient 对接WFS服务
####1.针对iServer发布的WFS服务
针对iServer Java 7C发布的WFS,我们在使用iClient对接时,需要注意以下几个参数,这里我用iClient for JavaScript代码作为示范。
//WFS属性过滤器
var filter = new SuperMap.Filter.Comparison({
type:SuperMap.Filter.Comparison.EQUAL_TO, //等于
property:"COUNTRY", //(*)查询字段名
value:"俄罗斯" //具体某个名称
});
var protocolRead = new SuperMap.Protocol.WFS({
version:"1.0.0", //请求服务版本
url:"http://localhost:8090/iserver/services/data-world/wfs100", //(*)请求WFS
featureType:"Countries", //(*)请求查询数据集
featureNS:"http://www.supermap.com/World", //要素的命名空间
featurePrefix:"World", //(*)请求数据源
geometryName:"the_geom" //几何图形属性名称
});
protocolRead.read({
filter:filter, //过滤
maxFeatures: 1,
callback: queryCompleted //回调函数
});
如果是iServer发布的WFS服务,那么其中带(*)的部分,我们尤为要注意。那我们该如何获取这参数些信息呢?
- 首先,启动iServer7C。
- 浏览器中输入WFS服务地址,例如范例中使用如下地址: http://localhost:8090/iserver/services/data-world/wfs100 。
- 选择utf-8字符集。
- 搜索FeatureTypeList节点下的,每一个FeatureType都是一个数据集,例如下图所示,World:Countries就是一个数据集,其命名方式为:【数据源名称:数据集名称】
- 过滤参数字段获取办法,可由DescribeFeatureType操作获取,例如:
http://localhost:8090/iserver/services/data-world/wfs100/utf-8?REQUEST=DescribeFeatureType&TypeName=World:Countries
最终通过代码实现,返回结果:
####2.针对ArcGIS发布的WFS服务
针对ArcgGIS的WFS服务,我们在使用iClient对接时,需要注意以下几个参数,这里我用iClient for JavaScript代码作为示范。
//WFS属性过滤器
var filter = new SuperMap.Filter.Comparison({
type:SuperMap.Filter.Comparison.EQUAL_TO, //等于
property:"COUNTRY", //(*)查询字段名
value:"俄罗斯" //具体某个名称
});
var protocolRead = new SuperMap.Protocol.WFS({
version: "1.0.0", //请求服务版本
srsName: "EPSG:4326",
url: "http://192.168.15.99:6080/arcgis/services/world1/MapServer/WFSServer",
featureType: "world", //(*)查询数据集名称
featurePrefix:"world1", //(*)请求数据源
geometryName:"Shape" //(*)几何图形属性名称
});
protocolRead.read({
filter:filter, //过滤
maxFeatures: 1,
callback: queryCompleted //回调函数
});
如果是ArcGIS发布的WFS服务,那么其中带(*)的部分,我们也要注意。那我们该如何获取这参数些信息呢?
- 获取能力表述文件
http://192.168.15.99:6080/arcgis/services/world1/MapServer/WFSServer?SERVICE=WFS&VERSION=1.0.0&REQUEST=GetCapabilities - 搜索FeatureTypeList节点下的,每一个FeatureType都是一个数据集,例如下图所示,World:Countries就是一个数据集,其命名方式为:【数据源名称:数据集名称】
- 过滤参数字段获取办法,可由DescribeFeatureType操作获取,例如:
http://192.168.15.99:6080/arcgis/services/world1/MapServer/WFSServer?SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFeatureType&TypeName=world1:world
最终通过代码实现,返回结果:
##六、常见问题
####WFS查询无结果
1.请查看url请求地址是否正确。
2.查看geometryName,featurePrefix,featureType,version等参数是否正确。
3.是否设置过滤参数无查询结果。
4.查看是否请求跨域。
ArcGIS发布的WFS,为什么使用客户端查询的时候,图形是倒过来的。
修改ArcGIS发布WFS服务里面的经纬度顺序,如原本是YX 则修改为XY。
####iServer中WFS查询,为什么最多只能查2000个结果?
在webapps\iserver\WEB-INF文件夹下的iserver-services-interfaces.xml
文件里interface节点下添加期望返回结果,例如:
<config class="com.supermap.services.wfs.WFSConfig"><maxFeatures>期望返回的结果</maxFeatures></config>