前言
WFS(Web Feature Service),OGC标准下的要素服务。其支持的主要操作如下:
- GetCapabilities (discovery operation)
- DescribeFeatureType (discovery operation)
- GetPropertyValue (query operation)
- GetFeature (query operation)
- GetFeatureWithLock (query & locking operation)
- LockFeature (locking operation)
- Transaction (transaction operation)
- CreateStoredQuery (stored query operation)
- DropStoredQuery (stored query operation)
- ListStoredQueries (stored query operation)
- DescribeStoredQueries (stored query operation)
该服务可以直接在ArcGIS Server上发布,只需要在正常发布服务流程上勾选上WFS的选项就可以,也可以通过其他平台发布,如开源GIS平台GeoServer。在实际项目中WFS服务用到的还是比较少的,一般来说如果甲方采购GIS平台的话,如ArcGIS平台,会直接发布Feature Layer服务来进行要素的增删改操作;SuperMap平台的话,会直接发布数据服务。也就是各自平台所特有的要素数据服务,而不会去采用WFS服务的方式。个人感觉虽然各个GIS平台厂商对OGC标准下的服务都有支持,但支持并不是那么的友好,毕竟不是自家的。该篇博客主要说如何通过ArcGIS JS API加载GeoServer发布的WFS服务,只要是WFS服务就可以,无论哪个平台发布的,以GeoServer平台的为例。
主要代码
API地址
:https://developers.arcgis.com/javascript/3/jsapi/wfslayer-amd.html
官方示例
: https://developers.arcgis.com/javascript/3/jssamples/layers_wfs.html
下面是自己发布的WFS服务
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>ArcGIS叠加GeoServer发布的WFS图层</title>
</head>
<link rel="stylesheet" href="https://js.arcgis.com/3.27/esri/css/esri.css">
<style>
html, body, #map {
height: 100%;
margin: 0;
padding: 0;
}
</style>
<script src="https://js.arcgis.com/3.27/"></script>
<script>
var map;
require(["esri/map", "esri/InfoTemplate", "esri/layers/WFSLayer",
"esri/config", "esri/geometry/Extent", "dojo/domReady!"
], function(Map, InfoTemplate, WFSLayer, esriConfig, Extent) {
map = new Map("map");
esriConfig.defaults.io.proxyUrl = "http://localhost/Java/proxy.jsp";//设置代理
var opts = {
"url": "http://localhost:8090/geoserver/wfs_point/wfs",
"version": "1.1.0",
"name": "Points",//图层名称
"wkid": 4326,//Supported WKIDs: 3857 | 4326 | 3785.
"maxFeatures": 1000
};
var layer = new WFSLayer();//经测试使用new WFSLayer(opts)失败
layer.fromJson(opts);//只能用fromJson
map.addLayer(layer);
map.setExtent(new Extent(116.92277568843764,36.6065212736288,117.16265171209778,36.70398132446974,map.spatialReference));
});
</script>
<body>
<div id="map"></div>
</body>
</html>
几个需要注意的地方在下面的总结中!
总结
- WFSLayer requires using a proxy page.需要设置代理,否则在控制台会输出
esri.config.defaults.io.proxyUrl 尚未进行设置。如果向启用了 CORS 的服务器发出请求,请将域推送到 esri.config.defaults.io.corsEnabledServers。
关于如何设置代理可以参考:https://developers.arcgis.com/javascript/3/jshelp/ags_proxy.html ; - 在API文档里面是有直接通过
new WFSLayer(options)
创建图层的方法,但是经过测试后发现并不行,具体原因不明。而在官方给出的示例中也没有采用new WFSLayer(options)
,是采用的layer.fromJson(options)
; - 网络请求有些慢,关键是本身服务的数据量并不大,只有几十个点,不知道是不是和代理有关系;
- 关于一些参数可以通过
WFS Url + ?service=WFS&request=GetCapabilities
查看,如 https://data.wien.gv.at/daten/geo?service=WFS&request=GetCapabilities , 主要用到的是name
图层名称、wkid
坐标系id。 - API支持三种坐标系
3857 | 4326 | 3785
, 否则可能报错WFSLayer: could not project geometry.