cesium利用UrlTemplateImageryProvider加载高德底图

本文介绍了如何使用Cesium库中的UrlTemplateImageryProvider加载高德地图的矢量、影像和标注底图,并提供了代码示例。注意高德使用GCJ-02坐标系,可能需要转换为WGS84坐标系。
摘要由CSDN通过智能技术生成

1 前言

在国内,常用高德、百度等的切片底图,想要加载这些底图时,可以使用UrlTemplateImageryProvider类创建。

cesium探索系列目录传送门

2 UrlTemplateImageryProvider类

UrlTemplateImageryProvider用于加载基于HTTP/HTTPS协议的网络栅格切片数据;支持多种格式、规格和级别范围;需要提供包含切片路径和后缀的URL模板。国内的高德,腾讯等影像服务都可以使用UrlTemplateImageryProvider加载,也可以加载自行发布的影像切片。

3 代码封装与调用

3.1 代码封装

type AMapType = 'vec' | 'img' | 'marker'
/**
 * 5、添加高德底图
 * @param viewer 
 * @param type  vec:矢量、img:影像、marker标注
 * @param option 
 */
export function addAMapImagery(viewer: Cesium.Viewer, type: AMapType, option?: Cesium.UrlTemplateImageryProvider.ConstructorOptions) {
  let url = ''
  if(type === 'img') {
    url = 'https://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}'
  } else if(type === 'vec') {
    url = "http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}"
  } else if(type === 'marker') {
    url = 'http://webst02.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8'
  }
  const atLayer = new Cesium.UrlTemplateImageryProvider({
    url,
    minimumLevel: 3,
    maximumLevel: 18,
    ...option
  })
  viewer.imageryLayers.addImageryProvider(atLayer);
}

3.2 代码调用

addAMapImagery(viewer, 'vec')		// 加载高德矢量底图
addAMapImagery(viewer, 'img')		// 加载高德影像底图
addAMapImagery(viewer, 'marker')	// 加载高德标注图层

3.3 代码调用

高德矢量
矢量底图
高德影像

高德标注

在这里插入图片描述

4 缺陷

暂未查看该底图的坐标系,由于高德使用的是GCJ-02的坐标系,GCJ-02是由国测局制定的互联网地图坐标系,又叫火星坐标,最常见的互联网地图坐标系。所以当数据是WGS84坐标系时,需要把高德的底图转为WGS84坐标系的,目前暂未做这一步,后续在添加geojson数据时,会将该操作补齐。

Cesium中,使用`UrlTemplateImagerProvider`加载瓦片地图时,确实需要考虑层级设置以避免原地图未覆盖的问题。这里是一个基本步骤: 1. **创建UrlTemplateImagerProvider**: 首先,你需要创建一个新的`UrlTemplateImagerProvider`实例,并指定瓦片URL模板。例如: ```javascript const urlTemplate = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'; const imageryProvider = new Cesium.UrlTemplateImagerProvider({ url : urlTemplate, credit : 'OpenStreetMap', }); ``` 2. **设置层级** (Z-index): 当有多个图层叠加时,你可以设置每个图层的`renderOrder`属性。将新图层设为更高的`renderOrder`值,使其位于原地图之上。例如: ```javascript imageryProvider.setRenderOrder(Cesium.ImageryLayer.renderOrder.ABOVE_BASE_MAP); ``` 这样当新图层的瓦片数据到来时,它们会覆盖原有地图的部分区域。 3. **防止未覆盖问题**: 如果新图层覆盖了部分旧图层,那可能是由于瓦片数据更新导致的。你需要确保你的瓦片服务器策略正确,比如定期刷新或只在地图发生变化时更新特定区域的瓦片。 4. **注意缓存**: Cesium会缓存瓦片,如果缓存已满,可能会发生一些瓦片未加载的情况。你可以调整`ImageServiceImagingOptions`的`maxZoomPixelSize`属性来控制缓存大小。 5. **错误处理和用户体验**: 提供良好的错误处理机制,当瓦片加载失败时,展示默认地图或提供其他反馈给用户。 记住,如果你想要完全替换原有的地图,而不是添加新的图层,可以考虑使用`Scene.primitives.remove`方法移除原始图层后再添加新的`UrlTemplateImagerProvider`。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值