ArcGIS JS API加载GeoServer发布的WFS服务

前言

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>

几个需要注意的地方在下面的总结中!

总结

  1. 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
  2. 在API文档里面是有直接通过 new WFSLayer(options) 创建图层的方法,但是经过测试后发现并不行,具体原因不明。而在官方给出的示例中也没有采用new WFSLayer(options),是采用的layer.fromJson(options);
  3. 网络请求有些慢,关键是本身服务的数据量并不大,只有几十个点,不知道是不是和代理有关系;
  4. 关于一些参数可以通过 WFS Url + ?service=WFS&request=GetCapabilities 查看,如 https://data.wien.gv.at/daten/geo?service=WFS&request=GetCapabilities , 主要用到的是name图层名称、wkid坐标系id。
  5. API支持三种坐标系3857 | 4326 | 3785 , 否则可能报错 WFSLayer: could not project geometry.

参考链接

http://www.opengeospatial.org/standards/wfs

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值