Cesium加载各种来源的wms和wmts服务

一、加载wmts服务-使用 WebMapTileServiceImageryProvider 方式加载

使用WebMapTileServiceImageryProvider加载,加载方法如下,除了实现方法,针对不同平台发布的wmts服务的配置地址也很重要。下面都会详细讲解。

1、加载方法
/**
 * 加载wmts图层-使用WebMapTileServiceImageryProvider方式加载
 * @param {Object} viewer 地图视图
 * @param {Object} options
 *   -@param {String} id 图层标识
 *   -@param {String} url 图层服务地址
 */
export function addWMTSLayer(viewer, options) {
  // 参数处理
  const mapUrl = options.url.substr(0, options.url.indexOf('?'))
  const mapParameters = {
    url: mapUrl + '?format=image/png',
    layer: '',
    style: '',
    format: 'image/png',
    tileMatrixSetID: 'EPSG:900913',
    maximumLevel: 20,
    tilingScheme: new Cesium.GeographicTilingScheme()
  }
  const params = getUrlParam(options.url)
  Object.keys(params).forEach((key) => {
    if (params[key]) {
      mapParameters[key] = params[key]
    }
  })
  //切片方案选择:3857使用WebMercatorTilingScheme,地理坐标系使用GeographicTilingScheme
  mapParameters.tilingScheme =
    mapParameters.tileMatrixSetID.indexOf('3857') > -1
      ? new Cesium.WebMercatorTilingScheme()
      : new Cesium.GeographicTilingScheme()
  // 初始化图层
  var layer = new Cesium.WebMapTileServiceImageryProvider(mapParameters)
  var imageLayer = new Cesium.ImageryLayer(layer)
  viewer.imageryLayers.add(imageLayer)
}
const getUrlParam = (url) => {
  // str为?之后的参数部分字符串
  const str = url.substr(url.indexOf('?') + 1)
  // arr每个元素都是完整的参数键值
  const arr = str.split('&')
  // result为存储参数键值的集合
  const result = {}
  for (let i = 0; i < arr.length; i++) {
    // item的两个元素分别为参数名和参数值
    const item = arr[i].split('=')
    result[item[0]] = item[1]
  }
  return result
}
2、各gis平台的服务配置地址

基础地址 + 各个参数

(1)超图发布的wmts服务

以下图为例,配置地址为:

https://iserver.supermap.io/iserver/services/map-china400/wmts100/China/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png?layer=China&tileMatrixSetID=Custom_China&style=default

(2)geoserver发布的wmts服务

url模板为

http://localhost:8080/geoserver/gwc/service/wmts/rest/{layer}/{style}/{TileMatrixSet}/{TileMatrixSet}:{TileMatrix}/{TileRow}/{TileCol}?format=image/png

再加上layer,style,tileMatrixSetID各个参数 ,以下图为例,配置地址为:

http://localhost:8080/geoserver/gwc/service/wmts/rest/sf:restricted/{style}/{TileMatrixSet}/{TileMatrixSet}:{TileMatrix}/{TileRow}/{TileCol}?format=image/png&layer=sf:restricted&style=&tileMatrixSetID=EPSG:4326

选中所需图层,点击进入下面页面

二、加载wms图层-使用 WebMapServiceImageryProvider 方式加载

使用WebMapServiceImageryProvider加载,加载方法如下,除了实现方法,针对不同平台发布的wms服务的配置地址也很重要。下面都会详细讲解。

1、加载方法
/**
 * 加载wms图层-使用WebMapServiceImageryProvider方式加载
 * @param {Object} viewer 地图视图
 * @param {Object} options
 *   -@param {String} id 图层标识
 *   -@param {String} url 图层服务地址
 */
export function addWMSLayer(viewer, options) {
  // 参数处理
  const mapUrl = options.url.substr(0, options.url.indexOf('?'))
  const mapParameters = {
    url: mapUrl,
    parameters: {
      transparent: true,
      format: 'image/png'
    }
  }
  const params = getUrlParam(options.url)
  Object.keys(params).forEach((key) => {
    if (params[key]) {
      mapParameters.parameters[key] = params[key]
    }
  })
  mapParameters.layers = mapParameters.parameters.layers
  // 初始化图层
  var layer = new Cesium.WebMapServiceImageryProvider(mapParameters)
  var imageLayer = new Cesium.ImageryLayer(layer)
  imageLayerList.push({ layer: imageLayer, name: options.name })
  viewer.imageryLayers.add(imageLayer)
}
const getUrlParam = (url) => {
  // str为?之后的参数部分字符串
  const str = url.substr(url.indexOf('?') + 1)
  // arr每个元素都是完整的参数键值
  const arr = str.split('&')
  // result为存储参数键值的集合
  const result = {}
  for (let i = 0; i < arr.length; i++) {
    // item的两个元素分别为参数名和参数值
    const item = arr[i].split('=')
    result[item[0]] = item[1]
  }
  return result
}
2、各gis平台的服务配置地址

基础url+参数

(1)超图发布的wms服务

以下图为例,配置地址为:

https://iserver.supermap.io/iserver/services/map-china400/wms111/China?layers=China&srs=EPSG:4326

 

(2)geoserver发布的wms服务

以下图为例,配置地址为:

http://localhost:8080/geoserver/tiger/wms?layers=tiger:poly_landmarks&srs=EPSG:4326

  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Cesium是一个用于构建3D地球应用的JavaScript库。WMTS(Web Map Tile Service)是一种提供动态地图切片的标准化协议。在Cesium中,我们可以通过添加ImageryProvider来加载WMTS图层。但是如何在Cesium中点击WMTS图层,获取其属性呢? 首先需要明确WMTS服务通常都是经过数据加工的瓦片数据,因此获取图层的属性只能通过WMTS图层服务提供的GetFeatureInfo接口来实现。当用户在Cesium中选中一张WMTS图层时,我们可以从这个图层的ImageryLayer对象中获取对应的Web Map Service(WMS)地址以及图层名称。然后通过拼接GetFeatureInfo请求地址,将该地址发送到WMTS服务器获取其相应属性值。 在请求中需要注意的是,请求的url中应包含了图层名称、请求坐标系(通常是EPSG:4326)、请求的图层坐标以及返回格式(通常是xml或json)。通过向服务器发送GetFeatureInfo请求,服务器会返回一个包含请求坐标处属性值的响应,我们需要对该响应进行解析,从响应中提取出我们需要的属性值。 最后,在Cesium中我们可以通过添加PickEvent来响应用户点击事件,当用户在图层上点击时,我们会触发该事件并获取该点击位置的地理坐标。然后将该坐标转换为请求坐标系后,发送GetFeatureInfo请求获取该点处的属性值并将其展示给用户。 总体而言,通过Cesium加载WMTS图层并获取其属性需要对WMTS服务的请求和响应进行深入理解,只有在对WMTS服务有足够了解的情况下才能顺利实现该功能。 ### 回答2: Cesium是一款强大的开源3D地图引擎,在地图可视化方面具有很高的性能和强大的交互能力。WMTS(Web Map Tile Service)是一种基于Web标准的瓷砖地图服务,它可以使用户通过URL获取经过裁剪、投影和缩放的地图瓷砖。 在Cesium加载WMTS服务时,需要使用Cesium的ImageryLayerCollection创建一个新的图像图层,并将WMTS服务添加到该图像图层中作为贴图。除此之外,还需要使用Cesium的ProviderViewModel创建一个视图模型,并将它添加到图层控制器中,以便用户可以在界面上切换不同的图层。 要在Cesium中实现点击获取WMTS服务属性,需要使用pick事件监听用户的鼠标点击操作,并在点击时获取所选取的地理位置信息。一般来说,这个地理位置信息可以用Cartographic对象进行描述,它包含了经度、纬度和高度三个属性。然后,可以通过WMTS服务的FeatureInfo请求获取该位置的地图属性信息。 实现这个功能的关键在于WMTS服务的FeatureInfo请求,它需要一个请求URL和一些请求参数(如地理位置、图层名称等)。可以通过以下代码来发送FeatureInfo请求,并获取响应结果: ```javascript viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) { //获取点击位置的经纬度信息 var ray = viewer.camera.getPickRay(movement.position); var cartesian = viewer.scene.globe.pick(ray, viewer.scene); var cartographic = Cesium.Cartographic.fromCartesian(cartesian); var longitudeString = Cesium.Math.toDegrees(cartographic.longitude).toFixed(10); var latitudeString = Cesium.Math.toDegrees(cartographic.latitude).toFixed(10); //构建请求URL和参数 var layerName = "layer1"; var url = "http://wmtsserver.com/WMTS/1.0.0/layer1/wmts?"; var requestUrl = url + "REQUEST=GetFeatureInfo" + "&VERSION=1.0.0" + "&LAYER=" + layerName + "&INFOFORMAT=text/plain" + "&I=" + Math.round(e.offsetX) + "&J=" + Math.round(e.offsetY) + "&CRS=EPSG:4326" + "&STYLES=" + "&WIDTH=" + "&HEIGHT=" + "&BBOX=" + "&QUERY_LAYERS=" + layerName; //发送FeatureInfo请求 var promise = Cesium.GeoJsonDataSource.load(requestUrl); Cesium.when(promise, function(dataSource) { //获取FeatureInfo响应结果 var feature = dataSource.entities.values[0]; var properties = feature.properties; console.log(properties); }); }, Cesium.ScreenSpaceEventType.LEFT_CLICK); ``` 以上是实现Cesium加载WMTS并点击获取属性的一些思路和代码示例,仅供参考。具体实现方式可能会因服务商和数据源的不同而有所不同,需要根据具体情况进行调整。 ### 回答3: Cesium是一款开源的WebGL绘图库,提供了丰富的地图数据展示和可视化功能。WMTS是Web地图切片服务的一种标准格式,它将地图数据按照地理位置和比例尺进行分块,方便地图服务提供商快速响应客户端的请求。在Cesium加载WMTS服务的过程中,我们可以通过点击获取属性的方式来获得其它各种信息。 首先,我们需要在Cesium中配置WMTS服务的图层信息。通过定义图层的属性,包括名称、URL地址、WMTS服务的格式、样式、瓦片的像素尺寸等信息,然后将图层添加到Cesium的图层控制器中。同时,我们还需要注册鼠标事件监听器,以便在用户点击地图时获取相应的属性信息。 接下来,当用户点击地图时,Cesium会触发相应的鼠标事件,我们可以通过事件监听器获取鼠标点击时的坐标值,并将坐标值转为地理经纬度坐标。然后,我们可以调用WMTS的GetFeatureInfo方法,通过在请求URL中添加相关参数,请求获取地理坐标点所在的图层信息和属性值。 最后,我们可以将获取的属性值展示在Cesium的浮动标记中,也可以通过控制台输出等方式来展示属性信息,这样就可以在地图上实现WMTS服务的点击获取属性功能了。需要注意的是,不同的WMTS服务的GetFeatureInfo方法传递的参数可能会有所不同,需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值