Cesium加载离线地图 + 整合图层控件

提示

  • 使用的都是vue2的语法

  • 靠查阅各种资料+自己试验总结出来的...不一定绝对正确,仅供参考!

nginx架设服务器

比如说我的F盘里的tiles文件夹里是离线地图相关文件,想使用80端口,nginx的server设置就大概是这样的。

如果设置成功,浏览器里打开 http://127.0.0.1:80/tiles 就能看到相关文件了(发送请求也是用这个链接,看下文'添加图层'示例中的第二个)

server {
        listen       80;
        server_name  localhost;
 
        add_header Access-Control-Allow-Origin *;
        add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
        add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
 
        location / {
            root   F:/;
            index  index.html;
        }
 
        location /tiles {
            alias   F:/tiles;
            autoindex on;
            autoindex_localtime on;
        }
    }

先把Cesium Viewer搭起来

// 创建viewer
this.viewer = new Cesium.Viewer('cesiumContainer', {
  // 各种配置项,官网api和各种博客文里都有相关的
});

添加图层

每个ImageryProvider对应一个地图图层,可以多个叠加。

疯狂在这一块踩坑,花了好一阵子纠结为什么坐标一直偏移还纠正不过来。。。然后发现是用了错误类型的ImageryProvider。

根据我的踩坑经验,稍微总结一下:

  • url里有xyz的基本就是UrlTemplateImageryProvider

  • 离线地图瓦片文件夹里有xml文件的,就用TileMapServiceImageryProvider

  • 还有就是别人已经提供好了服务的,比如必应地图的BingMapsImageryProvider

我拿到的瓦片地图是放在z-x-y文件夹顺序的png,一开始我一直在尝试url类型的(因为找到了几个博客教学都用的url)。但是事实证明只有tms类型可以正常展示我手上的这些数据。。。

用哪种取决于你准备用哪种数据!! 附上官方文档API, 至少15种呢!

三个例子:

// 某个在线地图的路标(好像是高德?记不清了)
const onlineMapLabel = new Cesium.UrlTemplateImageryProvider({
  url: 'http://webst02.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8',
  maximumLevel: 15,
})

// 离线地图数据
const offlineMap = new Cesium.TileMapServiceImageryProvider({
    url: `http://127.0.0.1:80/tiles`,
    fileExtension: "png",
    maximumLevel: 15,
})

// bing的在线道路地图(需要去官网申请key,此处不多讲)
const bingMap = new Cesium.BingMapsImageryProvider({
  url : 'https://dev.virtualearth.net',
  key : bing_key,
  mapStyle : Cesium.BingMapsStyle.ROAD,
  maximumLevel: 15,
});

如果要直接把图层画上去,可以这样做:

this.viewer.imageryLayers.addImageryProvider(bingMap)

我个人觉得这样直接加上去后不好操作,如果完全不用切某个图层的话可以这样做。

如果要频繁切地图,还是推荐把图层整合进图层控件(见下文)

整合图层控件

每个选项对应一个model,一个里面可以有好几个图层,而且完全可以自定义每个model,同时自定义整个列表。

新建一个model

// 创建一个新的model
const onlineMapModel = new Cesium.ProviderViewModel({
  name: "在线数据",
  iconUrl: Cesium.buildModuleUrl(
    "Widgets/Images/ImageryProviders/openStreetMap.png"
  ),
  tooltip: "在线数据",
  creationFunction: function () {
    return [bingMap, onlineMapLabel];  // 把上面建立的两个ImageryProvider加进去了
  }
});

获取默认的model列表并进行操作:

// 获取默认列表
const modelList = this.viewer.baseLayerPicker.viewModel.imageryProviderViewModels;

// 操作示范
modelList.push(onlineMapModel) // 加在后面
modelList.unshift(onlineMapModel) // 加在前面
modelList = [onlineMapModel, onlineMapModel] // 完全覆盖

最后成果 (把新的放在原来的前面)

参考博文:

https://blog.csdn.net/floating_heart/article/details/125467142

https://blog.csdn.net/lili40342/article/details/123713802

https://blog.csdn.net/sinat_36226553/article/details/107910880

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

该写代码了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值