
本文衔接上篇文章:
不睡觉的怪叔叔:Cesium多源数据加载之影像图层(一)zhuanlan.zhihu.com
一、加载WMS服务
OGC的WMS服务就不赘述了,可以去OGC官网了解:
The Home of Location Technology Innovation and Collaborationwww.ogc.org
或者查看这篇文章:
不睡觉的怪叔叔:OpenLayers教程十六:多源数据加载之WMSzhuanlan.zhihu.com
1.1、加载ArcGIS Server发布的WMS服务
可以查看这篇文章了解如何在ArcGIS Server中发布WMS服务:
不睡觉的怪叔叔:ArcGIS Server教程:发布WMS服务zhuanlan.zhihu.com
在Cesium中通过Cesium.WebMapServiceImageryProvider类去加载WMS服务,直接来看一个示例:
首先需要在ArcGIS Server中发布一个WMS服务,我这里发布了一个广东路网数据的WMS服务gd_roads_wms,然后在ArcGIS Server Manager中找到对应的URL:

然后在从ArcGIS Server的REST目录中找到图层的编号:

为什么要去找到图层编号呢?因为ArcGIS Server中有图层组的概念(GeoServer也有),所以要找到图层编号,用以指定访问该图层。
<!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 Server发布的WMS服务</title>
<script src="http://localhost:8080/cesium/Cesium/Cesium.js"></script>
<link href="http://localhost:8080/cesium/Cesium/Widgets/widgets.css" rel="stylesheet">
</head>
<body>
<div id="cesium"></div>
<script>
// 初始化Cesium应用程序
Cesium.Ion.defaultAccessToken = '你的Cesium访问Token';
const viewer = new Cesium.Viewer('cesium');
const imageryLayers = viewer.imageryLayers;
// 加载ArcGIS Server发布的WMS服务
const arcgis_wms_imageryProvider = new Cesium.WebMapServiceImageryProvider({
url: 'https://localhost:6443/arcgis/services/gd_roads_wms/MapServer/WMSServer',
layers: '0',
parameters: {
service: 'WMS',
format: 'image/png',
transparent: true
}
});
// 将WMS数据源组织成影像图层并加入到影像图层容器中
const arcgis_wms_imageryLayer = new Cesium.ImageryLayer(arcgis_wms_imageryProvider);
imageryLayers.add(arcgis_wms_imageryLayer);
</script>
</body>
</html>
以上参数中,layers即指定需要访问的图层的图层编号,transparent:true表示将WMS服务图层的背景透明化。

1.2、加载GeoServer发布的WMS服务
首先也在GeoServer上发布一个WMS服务:

然后使用Cesium加载:
<!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>加载GeoServer发布的WMS服务</title>
<script src="http://localhost:8080/cesium/Cesium/Cesium.js"></script>
<link href="http://localhost:8080/cesium/Cesium/Widgets/widgets.css" rel="stylesheet">
</head>
<body>
<div id="cesium"></div>
<script>
// 初始化Cesium应用程序
Cesium.Ion.defaultAccessToken = '你的Cesium访问Token';
const viewer = new Cesium.Viewer('cesium');
const imageryLayers = viewer.imageryLayers;
// 加载GeoServer发布的WMS服务
const geoserver_wms_imageryProvider = new Cesium.WebMapServiceImageryProvider({
url: 'http://localhost:8080/geoserver/guangdong/wms',
layers: 'guangdong:gd_roads',
parameters: {
service: 'WMS',
version: '1.3.0',
format: 'image/png',
transparent: true
},
crs: 'CRS:84'
});
// 将WMS数据源组织成影像图层并加入到影像图层容器中
const geoserver_wms_imageryLayer = new Cesium.ImageryLayer(geoserver_wms_imageryProvider);
imageryLayers.add(geoserver_wms_imageryLayer);
</script>
</body>
</html>
可以发现参数和前面加载ArcGIS Server发布的WMS服务的参数有几处不同:
- layers:'guangdong:gd_roads' —— 因为GeoServer将图层组织为"工作区:图层名"的形式,所以需要根据这个形式指定特定图层。
- version:'1.3.0' —— 使用WMS的1.3.0版本加载服务,默认情况下Cesium会使用1.1.1版本。
- crs:'CRS:84' —— 手动指定坐标系为WGS84。这里需要注意的是:如果version参数是默认的1.1.1版本的话,就需要通过srs参数(EPSG格式)指定特定坐标系。

二、加载ArcGIS独有的图层服务
刚才说到ArcGIS Server发布的WMS服务,另外ArcGIS Server默认发布的是ArcGIS Server独有的图层服务,如果没有切片就是动态图层服务,如果进行了切片就是瓦片地图服务。
ArcGIS Server通常自带一个图层服务,如下所示:


在Cesium中使用Cesium.ArcGisMapServerImageryProvider类加载ArcGIS Server独有的图层服务,所以我们可以在Cesium中使用REST接口加载上面的这个服务:
<!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 Server独有的图层服务</title>
<script src="https://cesium.com/downloads/cesiumjs/releases/1.65/Build/Cesium/Cesium.js"></script>
<link href="https://cesium.com/downloads/cesiumjs/releases/1.65/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
</head>
<body>
<div id="cesium"></div>
<script>
const viewer = new Cesium.Viewer('cesium');
const imageryLayers = viewer.imageryLayers;
// 加载ArcGIS Server独有的图层服务
const arcgisImageryProvider = new Cesium.ArcGisMapServerImageryProvider({
url: 'https://localhost:6443/arcgis/rest/services//SampleWorldCities/MapServer'
});
// 组织为图层并加载到图层容器中
const arcgisImageryLayer = new Cesium.ImageryLayer(arcgisImageryProvider);
imageryLayers.add(arcgisImageryLayer);
</script>
</body>
</html>
