Cesium基础-加载地图服务

最近工作中遇到一个问题:本地发布了wgs-1984坐标系的TMS局部地图服务(在上层叠加),和一份google标准的TMS全球底图服务(在下层)。使用UrlTemplateImageryProvider加载两幅地图时,发现不能叠在一起。现象就是:google的地图可以加载,局部高清地图无法加载。

终于在大佬的指导下,找到了原因:google标准的瓦片组织方式与普通TMS服务瓦片的组织方式相反。普通TMS瓦片,原点在左下角,即沿Y轴自下向上切;而google标准瓦片,原点在左上角,即沿Y轴自上而下切。

TMS标准瓦片

 google标准瓦片

因此二者叠加时,需要将一种一副地图的Y轴进行翻转。

翻阅了Cesium帮助文档,UrlTemplateImageryProvider的接口说明中,明确写了,可以更改链接中的y为reverseY进行翻转。

至此,你以为问题就解决了吗?

No,更诡异的问题来了:仍然没有效果。

于是,进一步查资料,

Cesium加载百度地图服务,主要通过集成百度地图的图层数据并进行坐标系适配来实现。百度地图使用的是 BD09 坐标系,该坐标系是在 GCJ-02(火星坐标系)基础上的二次加密版本,而 Cesium 默认使用 WGS84 坐标系,因此在集成过程中需要考虑坐标偏差问题[^2]。 ### 实现步骤 1. **引入必要的库** 需要引入 Cesium 库以及用于 BD09 与 WGS84 坐标转换的第三方纠偏库,例如 `coordtransform`。纠偏库用于处理百度地图坐标与 Cesium 使用的标准地理坐标之间的转换。 2. **设置 Cesium Viewer** 初始化 Cesium 的 Viewer,并设置合适的场景模式,如 `SceneMode.SCENE3D` 或 `SceneMode.MORPHING`,以便支持 3D 地球或 2D/3D 过渡效果。 3. **创建自定义影像图层(WebMapServiceImageryProvider)** 通过 `WebMapServiceImageryProvider` 创建自定义图层,将百度地图服务地址作为图层数据源。例如,百度地图的 WMS 服务地址通常以 `http://online06.map.bdimg.com/tile/?qt=tile&x={x}&y={y}&z={z}&styles=pl&scaler=1&udt=20220301` 格式提供,其中 `{x}`、`{y}`、`{z}` 分别代表瓦片的行列及缩放级别[^3]。 4. **应用坐标转换逻辑** 在加载图层时,需要对坐标进行转换。通过第三方库将 BD09 坐标转换为 WGS84 坐标,确保地图位置准确显示。例如,使用 `coordtransform.bd09towgs84` 方法进行坐标转换。 5. **添加图层到 Cesium Viewer** 使用 `viewer.imageryLayers.addImageryProvider()` 方法将自定义图层添加至 Cesium 场景中,即可在 3D 地球上看到百度地图的数据。 ### 示例代码 ```javascript // 引入 Cesium 和坐标转换库 import * as Cesium from 'cesium/Cesium'; import { bd09towgs84 } from 'coordtransform'; // 初始化 Viewer const viewer = new Cesium.Viewer('cesiumContainer'); // 百度地图瓦片服务地址 const getBaiduTileUrl = (imageryProvider, x, y, level) => { const url = `http://online06.map.bdimg.com/tile/?qt=tile&x=${x}&y=${y}&z=${level}&styles=pl&scaler=1&udt=20220301`; return url; }; // 创建自定义图层 const baiduImageryProvider = new Cesium.WebMapServiceImageryProvider({ getTileUrl: getBaiduTileUrl, }); // 添加图层 viewer.imageryLayers.addImageryProvider(baiduImageryProvider); // 示例:将 BD09 坐标转换为 WGS84 const [lng, lat] = bd09towgs84(116.404, 39.915); viewer.camera.flyTo({ destination: Cesium.Rectangle.fromDegrees(lng - 0.1, lat - 0.05, lng + 0.1, lat + 0.05) }); ``` ### 注意事项 - **纠偏处理**:是否进行坐标纠偏取决于具体业务需求。若地图展示精度要求较高,则建议使用纠偏库进行坐标转换[^2]。 - **性能优化**:加载百度地图时,注意控制图层的加载范围和缩放级别,避免因瓦片加载过多影响性能。 - **图层管理**:Cesium 提供了图层管理接口,如 `raiseToTop`、`lowerToBottom` 等,可用于调整图层的显示顺序[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值