vue项目中使用mapbox地图,切换底图

如何在vue项目中加载并使用mapbox

mapbox用了感觉确实不错,操作很顺滑,矢量切片体验流畅,地图主题定制化地图漂亮,二三维一体化,二三维切换很是简单,一行代码搞定。

基本使用

这是mapbox官方文档地址:mapbox文档
在这里插入图片描述

里面有很多官方例子,基本就是copy下来就能用。

开始使用

  1. 首先安装mapbox依赖
npm install --save mapbox-gl
  1. 然后引入css文件,css引入方法很多,可以在style中import,也可以在入口文件public的index.html中引入,下面是index.html引入
<!--mapbox  -->
<script src='https://api.mapbox.com/mapbox-gl-js/v2.11.0/mapbox-gl.js'></script>
<link href='https://api.mapbox.com/mapbox-gl-js/v2.11.0/mapbox-gl.css' rel='stylesheet' />
  1. 手动导入mapboxgl对象
import mapboxgl from 'mapbox-gl'
  1. 初始化
mapboxgl.accessToken = 'YOUR_MAPBOX_ACCESS_TOKEN';
  	const map = new mapboxgl.Map({
	container: 'map', // 地图容器
// Choose from Mapbox's core styles, or make your own style with Mapbox Studio
	style: 'mapbox://styles/mapbox/streets-v12', // style URL
	center: [-74.5, 40], // starting position [lng, lat]
	zoom: 9 // starting zoom
});

一个基本maobox地图就出来了

底图切换

mapbox地图默认国外,可以使用天地图的地图来换底图
另外可以实现地图切换功能
在这里插入图片描述
实现思路就是把所有的图层先加上,通过mapbox方法控制显隐,比较方便,可以控制图层的显示层级

data() {
    return {
      tk: '自己的天地图token',
      tk2: '自己的天地图token',
      // 影像
      yxBaseUrl:
        'https://t' + Math.floor(Math.random() * 7) + '.tianditu.gov.cn/DataServer?T=img_w&X={x}&Y={y}&L={z}&tk=',
      yxBaseCav:
        'https://t' + Math.floor(Math.random() * 7) + '.tianditu.gov.cn/DataServer?T=cia_w&X={x}&Y={y}&L={z}&tk=',
      // 电子
      dzBaseUrl:
        'https://t' + Math.floor(Math.random() * 7) + '.tianditu.gov.cn/DataServer?T=vec_w&X={x}&Y={y}&L={z}&tk=',
      dzBaseCav:
        'https://t' + Math.floor(Math.random() * 7) + '.tianditu.gov.cn/DataServer?T=cva_w&X={x}&Y={y}&L={z}&tk=',
      // 地形
      dxBaseUrl:
        'https://t' + Math.floor(Math.random() * 7) + '.tianditu.gov.cn/DataServer?T=ter_w&X={x}&Y={y}&L={z}&tk=',
      dxBaseCav:
        'https://t' + Math.floor(Math.random() * 7) + '.tianditu.gov.cn/DataServer?T=cta_w&X={x}&Y={y}&L={z}&tk=',
    }
  },

这是三种底图。
地图初始化加载,并把三种底图加上

createViewer(callback) {
      var yxBaseUrl = {
        //类型为栅格瓦片
        type: 'raster',
        tiles: [this.yxBaseUrl + this.tk],
        tileSize: 256,
      }
      var yxBaseCav = {
        type: 'raster',
        tiles: [this.yxBaseCav + this.tk2],
        tileSize: 256,
      }
      // 电子底图
      var dzBaseUrl = {
        //类型为栅格瓦片
        type: 'raster',
        tiles: [this.dzBaseUrl + this.tk],
        tileSize: 256,
      }
      var dzBaseCav = {
        type: 'raster',
        tiles: [this.dzBaseCav + this.tk2],
        tileSize: 256,
      }
      // 地形底图
      var dxBaseUrl = {
        //类型为栅格瓦片
        type: 'raster',
        tiles: [this.dxBaseUrl + this.tk],
        tileSize: 256,
      }
      var dxBaseCav = {
        type: 'raster',
        tiles: [this.dxBaseCav + this.tk2],
        tileSize: 256,
      }
      mapboxgl.accessToken = '自己的mapboxToken'
      let viewer = new mapboxgl.Map({
        container: this.mapId, // container ID
        style: 'mapbox://styles/mapbox/streets-v12', // style URL
        center: [108.06590205, 41.17608996], // starting position [lng, lat]
        zoom: 4, // starting zoom
        style: {
          //地图雾效果,主要在三维展示
          fog: {
            range: [2, 20],
            color: 'hsl(0, 0%, 100%)',
            'high-color': 'hsl(210, 100%, 80%)',
            'space-color': [
              'interpolate',
              ['exponential', 1.2],
              ['zoom'],
              5,
              'hsl(210, 40%, 30%)',
              7,
              'hsl(210, 100%, 80%)',
            ],
            'horizon-blend': ['interpolate', ['exponential', 1.2], ['zoom'], 5, 0.02, 7, 0.08],
            'star-intensity': ['interpolate', ['exponential', 1.2], ['zoom'], 5, 0.1, 7, 0],
          },
          //设置版本号,一定要设置
          version: 8,
          projection: {
            name: 'globe',
          },
          //添加来源
          sources: {
            yxBaseUrl: yxBaseUrl,
            yxBaseCav: yxBaseCav,
            dzBaseUrl: dzBaseUrl,
            dzBaseCav: dzBaseCav,
            dxBaseUrl: dxBaseUrl,
            dxBaseCav: dxBaseCav,
          },
          layers: [
            {
              //图层id,要保证唯一性
              id: 'yxBaseUrl',
              //图层类型
              type: 'raster',
              //数据源
              source: 'yxBaseUrl',
              layout: {
                visibility: 'visible',
              },
              //图层最小缩放级数
              minzoom: 0,
              //图层最大缩放级数
              maxzoom: 17,
            },
            {
              id: 'yxBaseCav',
              type: 'raster',
              source: 'yxBaseCav',
              layout: {
                visibility: 'visible',
              },
              minzoom: 0,
              maxzoom: 17,
            },
            {
              //图层id,要保证唯一性
              id: 'dzBaseUrl',
              //图层类型
              type: 'raster',
              //数据源
              source: 'dzBaseUrl',
              layout: {
                visibility: 'none',
              },
              //图层最小缩放级数
              minzoom: 0,
              //图层最大缩放级数
              maxzoom: 17,
            },
            {
              id: 'dzBaseCav',
              type: 'raster',
              layout: {
                visibility: 'none',
              },
              source: 'dzBaseCav',
              minzoom: 0,
              maxzoom: 17,
            },
            {
              //图层id,要保证唯一性
              id: 'dxBaseUrl',
              //图层类型
              type: 'raster',
              layout: {
                visibility: 'none',
              },
              //数据源
              source: 'dxBaseUrl',
              //图层最小缩放级数
              minzoom: 0,
              //图层最大缩放级数
              maxzoom: 17,
            },
            {
              id: 'dxBaseCav',
              type: 'raster',
              layout: {
                visibility: 'none',
              },
              source: 'dxBaseCav',
              minzoom: 0,
              maxzoom: 17,
            },
          ],
        },
      })
      callback(viewer)
    },

这是底图切换的方法

<template>
  <div class="toolsbar-mappic">
    <ul id="basemaps" v-for="(item, i) in baseMapList" :key="i">
      <li :class="item.visible ? 'hover' : ''" @click="changeBaseMaps(item, i)">
        <a>
          <div><img :src="item.iconUrl" /></div>
          <div>{{ item.name }}</div>
        </a>
      </li>
    </ul>
  </div>
</template>
<script>
import global from '@comp/Global.vue'
export default {
  data() {
    return {
      baseMapList: [
        {
          visible: true,
          name: '影像',
          id:'yxBaseUrl',
          iconUrl: 'img/basemap/img.png',
        },
        {
          visible: false,
          name: '电子',
          id:'dzBaseUrl',
          iconUrl: 'img/basemap/elec.png',
        },
        {
          name: '地形',
          visible: false,
          id:'dxBaseUrl',
          iconUrl: 'img/basemap/ter.png',
        },
      ],
    }
  },
  mounted() {
  },
  methods: {
    changeBaseMaps(item, index) {
    //global.map3d是mapbox地图的全局对象
      let styleJson = global.map3d.getStyle();
      styleJson.layers.forEach((item)=>{
        if(item.layout&&item.layout.visibility){
          global.map3d.setLayoutProperty(item.id, 'visibility', 'none')
        }
      })
      global.map3d.setLayoutProperty(item.id, 'visibility', 'visible')
      this.baseMapList.forEach((val, index, arr) => {
        val['visible'] = false
      })
      item['visible'] = true
    },
  },
}
</script>
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3使用Mapbox,你可以按照以下步骤进行操作: 1. 首先,你需要在Vue项目引入MapboxJavaScript SDK。你可以通过在HTML文件插入以下代码来实现: ```html <script src='https://api.mapbox.com/mapbox-gl-js/v2.3.1/mapbox-gl.js'></script> <link href='https://api.mapbox.com/mapbox-gl-js/v2.3.1/mapbox-gl.css' rel='stylesheet' /> ``` 2. 接下来,在Vue组件创建一个地图容器,并在mounted钩子函数初始化地图。你可以使用mapbox-gl库提供的API来实现。下面是一个简单的示例: ```vue <template> <div ref="mapContainer" class="map-container"></div> </template> <script> import mapboxgl from 'mapbox-gl'; export default { mounted() { mapboxgl.accessToken = 'YOUR_MAPBOX_ACCESS_TOKEN'; // 替换为你自己的Mapbox访问令牌 const map = new mapboxgl.Map({ container: this.$refs.mapContainer, style: 'mapbox://styles/mapbox/streets-v11', // 替换为你想要的地图样式 center: [longitude, latitude], // 设置地图初始心点的经纬度 zoom: 12 // 设置初始缩放级别 }); } } </script> <style> .map-container { height: 400px; } </style> ``` 在上面的示例,我们首先将Mapbox的访问令牌设置为`YOUR_MAPBOX_ACCESS_TOKEN`,请确保替换为你自己的Mapbox访问令牌。然后,在mounted钩子函数,我们创建了一个地图实例,并将其绑定到组件的ref属性上的DOM元素。我们还可以设置地图的样式、初始心点的经纬度和缩放级别。 这只是一个简单的示例,你可以根据自己的需求进一步自定义地图的样式和功能。你可以探索Mapbox的文档以了解更多可用的API和功能。 希望这个回答能够帮助到你!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值