192 lines
7.2 KiB
Markdown
192 lines
7.2 KiB
Markdown
|
---
|
|||
|
title: WMSLayer
|
|||
|
date: 2020-03-24
|
|||
|
author: ac
|
|||
|
tags:
|
|||
|
- WMSLayer
|
|||
|
- ArcGIS for JS
|
|||
|
categories:
|
|||
|
- GIS
|
|||
|
---
|
|||
|
|
|||
|
> ArcGIS for Javascript中使用 WMSLayer 加载OGC的WMS服务。
|
|||
|
|
|||
|
<!-- more -->
|
|||
|
|
|||
|
## 1. 简介
|
|||
|
|
|||
|
[WMSLayer](https://developers.arcgis.com/javascript/3/jsapi/wmslayer-amd.html#wmslayer1) 是用来加载OGC标准的WMS服务的类。如果第一个加载到map的图层是WMS服务,则map的空间参考将使用该图层的空间参考。加载一个WMSLayer实例,默认行为会发送该服务的GetCapabilities 请求,查看服务提供的功能接口,但需要使用代理。可以使用另一种方法加载WMSLayer图层而不发送GetCapabilities 请求,通过构建resourceInfo 参数对象。即WMSLayer加载WMS服务有两种方式:
|
|||
|
|
|||
|
1. 直接给WMS服务所在的URL地址,但需要配置代理;
|
|||
|
2. 在构造器中使用resourceInfo对象,在其layerInfos参数中配置WMS服务的图层信息。
|
|||
|
|
|||
|
## 2. 图层加载
|
|||
|
|
|||
|
### 2.1 方式一
|
|||
|
|
|||
|
直接给WMS服务所在的URL地址,并在visibleLayers参数中指定要加载的图层(命名空间:图层名)。不过该方式需要使用代理。
|
|||
|
|
|||
|
**[代理配置](https://developers.arcgis.com/javascript/3/jshelp/ags_proxy.html)**:
|
|||
|
|
|||
|
1. 代理文件下载,https://github.com/Esri/resource-proxy/releases
|
|||
|
|
|||
|
2. 添加依赖
|
|||
|
|
|||
|
```groovy
|
|||
|
//引入Spring boot 内嵌的Tomcat对jsp的解析包
|
|||
|
compile('org.apache.tomcat.embed:tomcat-embed-jasper')
|
|||
|
compile('javax.servlet:javax.servlet-api:4.0.1')
|
|||
|
compile('javax.servlet:jsp-api:2.0')
|
|||
|
compile('javax.servlet:jstl')
|
|||
|
```
|
|||
|
|
|||
|
3. 设置代理文件的地址
|
|||
|
|
|||
|
```javascript
|
|||
|
require(["esri/config"], function (esriConfig) {
|
|||
|
//代理配置
|
|||
|
esriConfig.defaults.io.proxyUrl = "/demo/proxy.jsp";//指定代理文件在项目中的实际位置
|
|||
|
esriConfig.defaults.io.alwaysUseProxy = false;
|
|||
|
});
|
|||
|
```
|
|||
|
|
|||
|
4. 配置需要代理的请求路径
|
|||
|
|
|||
|
在proxy.jsp文件会从classpath中(即classes目录下)找proxy.config文件,当alwaysUseProxy 设置为false时,只有与proxy.config中匹配的url地址才会使用代理。
|
|||
|
|
|||
|

|
|||
|
|
|||
|
> proxy.config配置:
|
|||
|
> serverUrl 标签中url属性配置要代理的地址,matchAll属性是否全匹配。另外还可以配置代理日志输出路径和日志级别。
|
|||
|
|
|||
|
```xml
|
|||
|
<?xml version="1.0" encoding="utf-8" ?>
|
|||
|
<ProxyConfig allowedReferers="*"
|
|||
|
logFile="proxy_log.log"
|
|||
|
logLevel="INFO"
|
|||
|
mustMatch="true">
|
|||
|
<serverUrls>
|
|||
|
<serverUrl url="http://services.arcgisonline.com" matchAll="true"/>
|
|||
|
<serverUrl url="http://localhost:8080/geoserver/ows" matchAll="true"/>
|
|||
|
<serverUrl url="http://localhost:8080/geoserver/wms" matchAll="true"/>
|
|||
|
<serverUrl url="http://localhost:8080/geoserver/wfs" matchAll="true"/>
|
|||
|
</serverUrls>
|
|||
|
</ProxyConfig>
|
|||
|
<!-- See https://github.com/Esri/resource-proxy for more information -->
|
|||
|
```
|
|||
|
|
|||
|
示例代码:
|
|||
|
|
|||
|
```javascript
|
|||
|
function addWMSLayer() {
|
|||
|
require(["esri/config", "esri/layers/WMSLayer", "esri/layers/WMSLayerInfo"],
|
|||
|
function (esriConfig,Extent, WMSLayer, WMSLayerInfo) {
|
|||
|
//代理配置
|
|||
|
esriConfig.defaults.io.proxyUrl = "/demo/proxy.jsp";
|
|||
|
esriConfig.defaults.io.alwaysUseProxy = false;
|
|||
|
|
|||
|
var wmsUrl = "http://localhost:8080/geoserver/wms";
|
|||
|
var wmsLayer = new WMSLayer(wmsUrl, {
|
|||
|
format: "png",
|
|||
|
version: "1.3.0",
|
|||
|
visibleLayers: ["tiger:tiger_roads"]
|
|||
|
});
|
|||
|
wmsLayer.on("error", function (response){
|
|||
|
console.log("Error: %s", response.error.message);
|
|||
|
});
|
|||
|
map.addLayer(wmsLayer);
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
除了使用上述代理配置外,如果WMS 服务所在的地图服务器支持(CORS)跨域则配置corsEnabledServers属性指定服务器地址,也可以解决加载的跨域问题。
|
|||
|
|
|||
|
```javascript
|
|||
|
function addWMSLayer() {
|
|||
|
require(["esri/config","esri/geometry/Extent", "esri/layers/WMSLayer", "esri/layers/WMSLayerInfo"],
|
|||
|
function (esriConfig,Extent, WMSLayer, WMSLayerInfo) {
|
|||
|
var wmsUrl = "http://localhost:8080/geoserver/wms";
|
|||
|
//当被调用方服务器支持跨域(CORS)时,配置corsEnabledServers
|
|||
|
esri.config.defaults.io.corsEnabledServers.push(wmsUrl);
|
|||
|
|
|||
|
var wmsLayer = new WMSLayer(wmsUrl, {
|
|||
|
format: "png",
|
|||
|
version: "1.3.0",
|
|||
|
visibleLayers: ["tiger:tiger_roads"]
|
|||
|
});
|
|||
|
wmsLayer.on("error", function (response){
|
|||
|
console.log("Error: %s", response.error.message);
|
|||
|
});
|
|||
|
map.addLayer(wmsLayer);
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|
|||
|
该方式是先发送GetCapabilities 请求,获取服务器中的图层信息,再查找与visibleLayers中指定的图层,进行加载(GetMap)
|
|||
|
|
|||
|

|
|||
|
|
|||
|
|
|||
|
|
|||
|
### 2.2 方式二
|
|||
|
|
|||
|
在构造器中使用resourceInfo对象,在其layerInfos参数中配置WMS服务的图层信息。这种方式可以使用getFeatureInfo功能,只要将queryable和showPopup设置成true,添加代理(因为iframe标签中的地址不同源时会拒绝加载,点击劫持,所以需要使用代理来解决跨域问题),在getFeatureInfoURL地址上添加代理的url就可以实现getFeatureInfo和属性信息显示功能。
|
|||
|
|
|||
|
示例代码:
|
|||
|
|
|||
|
```javascript
|
|||
|
function addWMSLayer() {
|
|||
|
require(["esri/config","esri/geometry/Extent", "esri/layers/WMSLayer", "esri/layers/WMSLayerInfo"],
|
|||
|
function (esriConfig,Extent, WMSLayer, WMSLayerInfo) {
|
|||
|
//代理配置
|
|||
|
esriConfig.defaults.io.proxyUrl = "/demo/proxy.jsp";
|
|||
|
esriConfig.defaults.io.alwaysUseProxy = false;
|
|||
|
var proxyUrl = window.location.origin + esriConfig.defaults.io.proxyUrl;
|
|||
|
var wmsUrl = "http://localhost:8080/geoserver/wms";
|
|||
|
var wmsLayer = new WMSLayer(wmsUrl, {
|
|||
|
format: "png",
|
|||
|
resourceInfo: {
|
|||
|
extent: new Extent(-74.02722,40.684221,-73.907005,40.878178, {wkid: 4326}),
|
|||
|
featureInfoFormat: "text/html",
|
|||
|
// getFeatureInfoURL: wmsUrl,
|
|||
|
getFeatureInfoURL: proxyUrl+"?"+wmsUrl+"?",
|
|||
|
getMapURL: wmsUrl,
|
|||
|
layerInfos: [
|
|||
|
new WMSLayerInfo({
|
|||
|
name: "tiger:tiger_roads",
|
|||
|
queryable: true,
|
|||
|
showPopup: true
|
|||
|
})
|
|||
|
],
|
|||
|
version: "1.3.0"
|
|||
|
},
|
|||
|
version: "1.3.0",
|
|||
|
visibleLayers: ["tiger:tiger_roads"]
|
|||
|
});
|
|||
|
wmsLayer.on("error", function (response){
|
|||
|
console.log("Error: %s", response.error.message);
|
|||
|
});
|
|||
|
map.addLayer(wmsLayer);
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
结果分析:
|
|||
|
|
|||
|

|
|||
|
|
|||
|
可以看到该方式没有发送GetCapabilities请求,而是直接发送GetMap获取地图。当点击地图时会执行getFeatureInfo查询和显示查询结果。
|
|||
|
|
|||
|

|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
## 参考文章
|
|||
|
|
|||
|
[1] WMSLayer https://developers.arcgis.com/javascript/3/jsapi/wmslayer-amd.html#wmslayer1
|