vue2由mapbox2升级为mapbox3遇到的矢量底图样式丢失问题解决办法

贴个群号

WebGIS学习交流群461555818,欢迎大家

心路历程

当vue2由mapbox2升级为mapbox3的时候,您可能会遇到以下的问题
所有的代码都没有改变,升级为mapbox3就会出现部分矢量底图样式丢失,表现为图层已经成功加上,但是打印图层信息的话,会发现属性layout和paint属性没有,虽然我们加图层的前一秒打印layer信息,layout和paint信息都在,但是addlayer之后,却不存在了。

开始我以为是style出现的问题,因为我们使用的style是自己搞的,后来使用官方的矢量底图进行测试,也是同样的问题,而且不是写法的问题,mapbox2和mapbox3的写法是相同的。后来以为是setstyle一下加了太多的图层,mapbox没有反应过来,于是搞了一下一个一个的加,问题还是没有解决。但是好奇的是我们在使用官方的那些示例html其实不会出现这种问题,只有将其引入vue2才会出现问题。

于是我们就观察两种方法的区别,写法完全一样,区别貌似只有在声明map的时候,一个是var let,一个是this.map = …存在了data里面,这个会不会是问题出现的原因呢?抱着试试看的想法,使用let 来声明map,不将map实例存在data里面,结果还真的好使了。

至于为什么存在data里面就不好使了,研究了很久还是不清楚原因。但是我们为了组件通信,还是很有必要解决这个问题的,于是就想到了别的办法,比如vuex来存map实例,但是试了一下也是不行的。经过多方面的测试,终极解决办法只有两个,一是升级为vue3,二是将map挂载到window下。其实在cesium使用中,挂载到window中是很常见的写法,但是在mapbox中却是没有这样考虑过,这下我们就使用window来挂载map。

实操

接下来是更新mapbox3由window来挂载map的一些细节
1、声明map

		let map = new ....
		window.map = map
		window.map.on(...)

2、样式调整,诸如popup、ctrl等的class名字可能会有变更,需要重新找一下更改一下对应的class名字

3、将map通过组件传值的方法

由于map不存在于data中了,所以这种传值要改掉,但是也不能改为window.map,因为这种写法会认为你在data里面有一个window对象,,,建议不传值了,反正都是window.map,别的页面也就直接用就完事儿了

<aaaa :map="map"></aaaa>

4、跟map有关的其他控件
比如popup、marker等相关的也不能在data里面存了,也挂在window下
5、跟map有关的插件
比如draw绘画插件、compare卷帘插件等等,声明的时候也不可以在data里面,改为挂在window下
6、在vuex里存的map内容
不能在data里面存,也不能在vuex里面存了
7、class类里传进来的map
达咩

Vue2集成Mapbox指的是在Vue.js这个前端框架的第二个大版本中,将Mapbox这个强大的地图服务集成到Web应用中。Mapbox提供了丰富的地图样式和灵活的API,可以用来创建交互式的地图和地理空间分析应用。要在Vue2项目中集成Mapbox,通常会按照以下步骤进行: 1. 安装Mapbox GL JS库:可以在项目中通过npm或yarn来安装MapboxJavaScript库。 ```bash npm install mapbox-gl --save # 或者 yarn add mapbox-gl ``` 2. 创建地图组件:在Vue2项目中创建一个新的组件,用于承载Mapbox地图的实例。 ```vue <template> <div ref="map" class="map"></div> </template> <script> import mapboxgl from &#39;mapbox-gl&#39;; export default { name: &#39;MapboxMap&#39;, mounted() { mapboxgl.accessToken = &#39;你的Mapbox访问令牌&#39;; const map = new mapboxgl.Map({ container: this.$refs.map, style: &#39;mapbox://styles/mapbox/streets-v11&#39;, center: [经度, 纬度], zoom: 9 }); // 当地图缩放级别发生变化时的回调函数 map.on(&#39;zoom&#39;, () => { // 你可以在这里处理地图缩放事件 }); // 添加其他交互逻辑... } }; </script> <style> .map { position: absolute; top: 0; bottom: 0; width: 100%; } </style> ``` 3. 在主组件中使用地图组件:在Vue2应用的某个组件中,通过import引入地图组件,并在模板中使用它。 ```vue <template> <div> <!-- 其他内容 --> <mapbox-map></mapbox-map> </div> </template> <script> import MapboxMap from &#39;./components/MapboxMap.vue&#39;; export default { components: { MapboxMap } }; </script> ``` 完成以上步骤后,你就可以在Vue2项目中使用Mapbox提供的地图服务了。这可以让你的Web应用具有强大的地图显示和交互功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值