vue项目中使用mapbox.gl加载本地geoserver发布的建筑物数据
这是根据mapbox.gl官网示例,写的加载建筑的小demo
主要代码如下
if (!mapboxgl.supported()) {
console.log("您的浏览器不支持WebGL,请升级到最新版本");
return;
}
mapboxgl.accessToken = glToken;// 自己申请的token
this.map = new mapboxgl.Map({
container: "mapContainer",
// style: "mapbox://styles/mapbox/light-v10",
center: [113.54, 22.2],
zoom: 18.5,
// 倾斜角度
pitch: 75,
style: {
version: 8,
name: "Mapbox Streets",
sources: {
"mapbox-streets": {
type: "vector",
url: "mapbox://mapbox.mapbox-streets-v6",
},
},
sprite: `${window.location.origin}/static/sprite/build`,// 这是用的本地的雪碧图
// sprite: "mapbox://sprites/mapbox/streets-v8",
glyphs: "mapbox://fonts/mapbox/{fontstack}/{range}.pbf",
layers: [
{
id: "water",
source: "mapbox-streets",
"source-layer": "water",
type: "fill",
paint: {
"fill-color": "#00ffff",
},
},
],
},
});
*sprite: ${window.location.origin}/static/sprite/build
地图的style这里的sprite用的是加载的本地的雪碧图,主要是测试下后面根据不同高度的建筑物侧面加不同的图片,看网上说mapbox官网上加载这个会生成@2x.json、@2x.png的,所以后面加载本地雪碧图时就按照这个来写的
this.map.addSource("source_build", {
type: "vector",
scheme: "tms",
tiles: [
// 这是本地用geoserver发布的建筑物的矢量瓦片服务
"http://localhost:8080/geoserver/gwc/service/tms/1.0.0/aomen%3Aaomen@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf",
],
});
this.map.addLayer({
id: "3d-buildings",
source: "source_build",
// source-layer中aomen是发布的图层的名称
"source-layer": "aomen",
// 这个fill-extrusion类型用来加载建筑物的
type: "fill-extrusion",
minzoom: 15,
paint: {
// Floor是矢量数据里的字段名代表建筑物高度
"fill-extrusion-height": [
"interpolate",
["linear"],
["zoom"],
15,
0,
15.05,
["get", "Floor"],
],
// 建筑物侧面贴图
"fill-extrusion-pattern": [
"step",
["get", "Floor"],
"l2",
5,
"l1",
9,
"r2",
],
"fill-extrusion-opacity": 0.8,
},
});
// 建筑物顶部
this.map.addLayer({
id: "buildings-top",
source: "source_build",
"source-layer": "aomen",
type: "fill-extrusion",
minzoom: 15,
paint: {
"fill-extrusion-color": "#52aff8",
"fill-extrusion-height": [
"interpolate",
["linear"],
["zoom"],
15,
0,
15.05,
["get", "Floor"],
],
"fill-extrusion-base": [
"interpolate",
["linear"],
["zoom"],
15,
0,
15.05,
["get", "Floor"],
],
"fill-extrusion-opacity": 1,
},
});
fill-extrusion-pattern 添加图片这后面l2,l1,r2取得前面加载的xx@2x.json文件里对应的字段名
效果图(有点丑哈哈):