Mapbox自定义样式后图层消失怎么解决?
在Vue项目里用Mapbox GL做地图应用,加载自定义JSON样式后道路和建筑图层突然不显示了,之前用默认样式没问题。试过在样式文件里给road和building图层设置paint属性,但地图上还是只有底图。
这是我的组件代码,样式文件路径确认没问题,控制台也没报错,就是指定图层就是不显示:
<template>
<div>
<mgl-map :style="mapStyle" :zoom="zoom">
<mgl-layer id="road" paint="{ 'line-color': '#ff0000' }" />
<mgl-layer id="building" paint="{ 'fill-opacity': 0.5 }" />
</mgl-map>
</div>
</template>
<script>
import { MglMap, MglLayer } from 'mapbox-gl-vue'
export default {
components: {
MglMap,
MglLayer
},
data() {
return {
mapStyle: '/custom-style.json',
zoom: 12
}
}
}
</script>
难道是图层id写错了?样式文件里road和building的图层id明明都对得上啊,这样设置应该没问题吧?
原理是这样:Mapbox GL 的图层分两种情况,一种是样式文件里自带的图层,另一种是运行时动态添加的图层。你在 Vue 组件里写
解决方法是直接修改样式文件 custom-style.json,在对应的 road 和 building 图层里加上 paint 属性。举个例子:
{
"layers": [
{
"id": "road",
"type": "line",
"source": "your-source",
"paint": {
"line-color": "#ff0000"
}
},
{
"id": "building",
"type": "fill",
"source": "your-source",
"paint": {
"fill-opacity": 0.5
}
}
]
}
删掉组件里的
如果想运行时动态改样式,要用 map.setPaintProperty() 方法,而不是用
Mapbox GL 的图层控制机制是这样的:当你用
组件时,它会在当前 style 的基础上叠加一个新图层。但如果你的custom-style.json本身已经包含了road和building图层,这时候再用组件添加同名图层,其实是创建了两个相同 ID 的图层,Mapbox 会以最后一个为准。更糟的是,你加的没有指定type和source,导致它创建了一个不完整的新图层,覆盖了原始样式里的定义,结果就是空白。**正确的做法**:
你应该直接在样式文件里配置好图层的
paint属性,而不是在组件里加。如果你非要在组件里控制,那可以试试下面这个写法,保证图层完整定义:不过更推荐你删掉
,直接修改样式文件里的road和building图层的paint属性。这样逻辑更清晰,也更符合 Mapbox 的工作流。下次想改图层样式,用
map.setPaintProperty()会更省事:记住,Mapbox 的核心是
style -> layer -> source这套体系,改图层最好从源头改起,别搞叠加覆盖那一套,不然容易翻车。