vue2开发离线百度地图

前期的准备工作和基本的离线地图使用,是参考了这位博主的文章:

vue-内网,离线使用百度地图(地图瓦片图下载静态资源展示定位)_vue 百度离线地图-优快云博客

按照上面的文章,我们已经可以使用离线百度地图了,接下来就是对于离线百度地图的个性化设置,每个人遇到的需求不一样所以对于自定义一些离线地图的功能需求很大,所以我重点展示我自己写的一些自定义功能,希望能帮到各位!

1.创建离线地图和创建对应的点位;
//html
<div id="container"></div>

//JavaScript
 data() {
    return{
        markList:[],
        map:null,
        mk: []
    }
}

mounted() {
    // 加载地图
    this.$nextTick(() => {
      this.initMap()
    })
}

watch: {
    markList: {
      handler(newValue) {
        this.clearAllMarkers()
        if (newValue.length > 0) {
          for (let i = 0; i < newValue.length; i++) {
            const element = newValue[i];
            const iconUrl = this.iconStyle(element); // 动态生成图标 URL
            const iconSize = this.flag === 'factory'
              ? new BMap.Size(35, 39)
              : new BMap.Size(20, 20); // 动态设置大小
            const iconOffset = this.flag === 'factory'
              ? new BMap.Size(-0.8, -14)
              : new BMap.Size(-1, -1); // 动态设置偏移量

            const myIcon = new BMap.Icon(iconUrl, iconSize, {
              imageSize: iconSize,
              anchor: iconOffset
            });

            // 创建点
            const point = new BMap.Point(element.longitude, element.latitude);
            const marker = new BMap.Marker(point, { icon: myIcon });
            this.map.addOverlay(marker);
            this.mk.push(marker);
            // 绑定点击事件
            marker.addEventListener('click', () => {
              this.lookDetail(element);
            });
          }
        }
      }, deep: true
    }
  },
methods: {
    clearAllMarkers() {
      for (let i = 0; i < this.mk.length; i++) {
        this.map.removeOverlay(this.mk[i]); // 从地图中移除标记
      }
      this.mk = []; // 清空保存的标记数组
    },
    // 获取地图
    initMap() {
      // 内网使用-地图对象-在public/index.html引入文件
      let BMap = window.BMap
      // this指向
      const that = this
      // 创建Map实例
      this.map = new BMap.Map('container')
      // 地图中心点
      let Point = new BMap.Point(118.09584, 24.48603)
      // 初始化地图中心点和放大级别
      this.map.centerAndZoom(Point, 18)
      // 限制地图放大等级
      this.map.setMinZoom(11)
      this.map.setMaxZoom(19)
      //开启鼠标滚轮缩放
      this.map.enableScrollWheelZoom(true)
    },
}


上面的代码是创建离线地图,并且监听对应的数组,根据数组创建对应的点位;this.markList是一个数组,根据数组长度生成对应的点位数量,以下是this.markList的数据结构。

在数据发生变化后,需要使用this.clearAllMarkers()方法清除掉旧点位数据,然后再重新生成新的点位,按照代码动态生成图标的url就是你对点位图标要显示成什么样的,还可以动态的设置点位的大小。以下是使用了厦门市的离线瓦片数据做的地图效果,需要下载数据的可以参考最上面那位博主的文章下载。 效果图如下:

2.点位的信息窗口展示;

首先我们需要在html部分自定义你需要的窗口样式:

 <div class="info-window" id="infoWindow" style="position: absolute;">
      <div class="info_boxs" v-if="flag == 'factory'">
        <div class="info_boxs_title">
         <!-- 自定义 -->
        </div>
       </div>
</div>

注意:div的idposition: absolute这两个不能少,id下面会使用到,position: absolute;是必须的,不然窗口会显示不出来;

然后我们创建一个方法,调用这个方法后可以生成对应点位的信息窗口:

changeWindow(newItem) {
      const info = document.getElementById("infoWindow");
      let infoWindow = new BMap.InfoWindow(info);
      let Point = new BMap.Point(newItem.longitude, newItem.latitude)
      this.$nextTick(() => {
        this.map.openInfoWindow(infoWindow, Point);  // 在指定位置打开信息窗口
      })
    },

在这个方法中,我们通过document.getElementById("xxx")获取到想要将那个div设置成自定义的窗口样式,然后通过let infoWindow = new BMap.InfoWindow(info);创建信息窗口,再根据经纬度让窗口显示在哪个位置,这里我是给点位添加了click事件,所以调用这个方法可以直接拿到对应点位的经纬度数据,再通过this.map.openInfoWindow(infoWindow, Point);  在指定位置打开信息窗口;效果图如下:

3.如果地图页面有列表,想要通过点击列表数据将地图显示到对应的位置;

我们一般地图都会有需求,点击某某设备,根据这个设备的经纬度我们地图也要显示到那个地方。以下就是这种需求的实现方法:

this.map.centerAndZoom(this.equipmentOldCenter, 17);
setTimeout(() => {
    this.map.panTo(new BMap.Point(item.longitude, item.latitude));
    this.changeWindow(item)
}, 200)
  • 通过 this.map.centerAndZoom 方法将地图中心点设置为 this.oldCenter,并将缩放级别设置为 17
  • this.oldCenter 是一个坐标点对象,通常包含 longitudelatitude(经纬度)属性,用于指定地图的初始中心点。
  • 平移到新位置:调用 this.map.panTo 将地图平滑移动到新的坐标点 item.longitudeitem.latitude
  • 调用 this.changeWindow(item)显示对应设备的信息窗口;

以上就是本文章的全部内容了,感谢观看!!

为了在Vue项目中使用离线百度地图,需要将相关资源文件放置在项目的public文件夹下,并在Vue组件中引入相关的JavaScript文件。具体步骤如下: 1. 下载离线百度地图资源文件,将其放置在项目的public文件夹下。可以从以下链接下载:https://github.com/huiyan-fe/baidumap-offline 2.Vue组件中引入相关的JavaScript文件。可以在组件的mounted钩子函数中引入,代码如下: ```javascript mounted() { const BMap_URL = 'http://api.map.baidu.com/api?v=2.0&ak=您的密钥'; const BMap_offline = '/static/BMap_offline.js'; const BMap_offline_data = '/static/BMap_offline_data'; const BMap_style = '/static/BMap_offline_style'; const BMap_route = '/static/BMap_offline_route'; const BMap_symbol = '/static/BMap_offline_symbol'; const BMap_icon = '/static/BMap_offline_icon'; const BMap_font = '/static/BMap_offline_font'; const BMap_sprite = '/static/BMap_offline_sprite'; const BMap_marker = '/static/BMap_offline_marker'; const BMap_clusterer = '/static/BMap_offline_clusterer'; const BMap_heatmap = '/static/BMap_offline_heatmap'; const BMap_boundary = '/static/BMap_offline_boundary'; const BMap_lushu = '/static/BMap_offline_lushu'; const BMap_tract = '/static/BMap_offline_tract'; const BMap_convertor = '/static/BMap_offline_convertor'; const BMap_draw = '/static/BMap_offline_draw'; const BMap_area = '/static/BMap_offline_area'; const BMap_distance = '/static/BMap_offline_distance'; const BMap_autocomplete = '/static/BMap_offline_autocomplete'; const BMap_geolocation = '/static/BMap_offline_geolocation'; const BMap_local = '/static/BMap_offline_local'; const BMap_suggestion = '/static/BMap_offline_suggestion'; const BMap_tile = '/static/BMap_offline_tile'; const BMap_geocoding = '/static/BMap_offline_geocoding'; const BMap_geolocationControl = '/static/BMap_offline_geolocationControl'; const BMap_navigationControl = '/static/BMap_offline_navigationControl'; const BMap_overviewMapControl = '/static/BMap_offline_overviewMapControl'; const BMap_scaleControl = '/static/BMap_offline_scaleControl'; const BMap_mapTypeControl = '/static/BMap_offline_mapTypeControl'; const BMap_panorama = '/static/BMap_offline_panorama'; const BMap_contextMenu = '/static/BMap_offline_contextMenu'; const BMap_customOverlay = '/static/BMap_offline_customOverlay'; const BMap_symbolOverlay = '/static/BMap_offline_symbolOverlay'; const BMap_canvasLayer = '/static/BMap_offline_canvasLayer'; const BMap_tiledLayer = '/static/BMap_offline_tiledLayer'; const BMap_webglLayer = '/static/BMap_offline_webglLayer'; const BMap_rasterLayer = '/static/BMap_offline_rasterLayer'; const BMap_vectorLayer = '/static/BMap_offline_vectorLayer'; const BMap_thirdVectorLayer = '/static/BMap_offline_thirdVectorLayer'; const BMap_thirdRasterLayer = '/static/BMap_offline_thirdRasterLayer'; const BMap_thirdWebglLayer = '/static/BMap_offline_thirdWebglLayer'; const BMap_thirdTiledLayer = '/static/BMap_offline_thirdTiledLayer'; const BMap_thirdCanvasLayer = '/static/BMap_offline_thirdCanvasLayer'; const BMap_thirdSymbolOverlay = '/static/BMap_offline_thirdSymbolOverlay'; const BMap_thirdCustomOverlay = '/static/BMap_offline_thirdCustomOverlay'; const BMap_thirdBoundary = '/static/BMap_offline_thirdBoundary'; const BMap_thirdHeatmap = '/static/BMap_offline_thirdHeatmap'; const BMap_thirdLushu = '/static/BMap_offline_thirdLushu'; const BMap_thirdDraw = '/static/BMap_offline_thirdDraw'; const BMap_thirdArea = '/static/BMap_offline_thirdArea'; const BMap_thirdDistance = '/static/BMap_offline_thirdDistance'; const BMap_thirdAutocomplete = '/static/BMap_offline_thirdAutocomplete'; const BMap_thirdGeolocation = '/static/BMap_offline_thirdGeolocation'; const BMap_thirdLocal = '/static/BMap_offline_thirdLocal'; const BMap_thirdSuggestion = '/static/BMap_offline_thirdSuggestion'; const BMap_thirdTile = '/static/BMap_offline_thirdTile'; const BMap_thirdGeocoding = '/static/BMap_offline_thirdGeocoding'; const BMap_thirdGeolocationControl = '/static/BMap_offline_thirdGeolocationControl'; const BMap_thirdNavigationControl = '/static/BMap_offline_thirdNavigationControl'; const BMap_thirdOverviewMapControl = '/static/BMap_offline_thirdOverviewMapControl'; const BMap_thirdScaleControl = '/static/BMap_offline_thirdScaleControl'; const BMap_thirdMapTypeControl = '/static/BMap_offline_thirdMapTypeControl'; const BMap_thirdPanorama = '/static/BMap_offline_thirdPanorama'; const BMap_thirdContextMenu = '/static/BMap_offline_thirdContextMenu'; const BMap_thirdVectorLayer = '/static/BMap_offline_thirdVectorLayer'; const BMap_thirdRasterLayer = '/static/BMap_offline_thirdRasterLayer'; const BMap_thirdWebglLayer = '/static/BMap_offline_thirdWebglLayer'; const BMap_thirdTiledLayer = '/static/BMap_offline_thirdTiledLayer'; const BMap_thirdCanvasLayer = '/static/BMap_offline_thirdCanvasLayer'; const BMap_thirdSymbolOverlay = '/static/BMap_offline_thirdSymbolOverlay'; const BMap_thirdCustomOverlay = '/static/BMap_offline_thirdCustomOverlay'; const BMap_thirdBoundary = '/static/BMap_offline_thirdBoundary'; const BMap_thirdHeatmap = '/static/BMap_offline_thirdHeatmap'; const BMap_thirdLushu = '/static/BMap_offline_thirdLushu'; const BMap_thirdDraw = '/static/BMap_offline_thirdDraw'; const BMap_thirdArea = '/static/BMap_offline_thirdArea'; const BMap_thirdDistance = '/static/BMap_offline_thirdDistance'; const BMap_thirdAutocomplete = '/static/BMap_offline_thirdAutocomplete'; const BMap_thirdGeolocation = '/static/BMap_offline_thirdGeolocation'; const BMap_thirdLocal = '/static/BMap_offline_thirdLocal'; const BMap_thirdSuggestion = '/static/BMap_offline_thirdSuggestion'; const BMap_thirdTile = '/static/BMap_offline_thirdTile'; const BMap_thirdGeocoding = '/static/BMap_offline_thirdGeocoding'; const BMap_thirdGeolocationControl = '/static/BMap_offline_thirdGeolocationControl'; const BMap_thirdNavigationControl = '/static/BMap_offline_thirdNavigationControl'; const BMap_thirdOverviewMapControl = '/static/BMap_offline_thirdOverviewMapControl'; const BMap_thirdScaleControl = '/static/BMap_offline_thirdScaleControl'; const BMap_thirdMapTypeControl = '/static/BMap_offline_thirdMapTypeControl'; const BMap_thirdPanorama = '/static/BMap_offline_thirdPanorama'; const BMap_thirdContextMenu = '/static/BMap_offline_thirdContextMenu'; const BMap_thirdVectorLayer = '/static/BMap_offline_thirdVectorLayer'; const BMap_thirdRasterLayer = '/static/BMap_offline_thirdRasterLayer'; const BMap_thirdWebglLayer = '/static/BMap_offline_thirdWebglLayer'; const BMap_thirdTiledLayer = '/static/BMap_offline_thirdTiledLayer'; const BMap_thirdCanvasLayer = '/static/BMap_offline_thirdCanvasLayer'; const BMap_thirdSymbolOverlay = '/static/BMap_offline_thirdSymbolOverlay'; const BMap_thirdCustomOverlay = '/static/BMap_offline_thirdCustomOverlay'; const BMap_thirdBoundary = '/static/BMap_offline_thirdBoundary'; const BMap_thirdHeatmap = '/static/BMap_offline_thirdHeatmap'; const BMap_thirdLushu = '/static/BMap_offline_thirdLushu'; const BMap_thirdDraw = '/static/BMap_offline_thirdDraw'; const BMap_thirdArea = '/static/BMap_offline_thirdArea'; const BMap_thirdDistance = '/static/BMap_offline_thirdDistance'; const BMap_thirdAutocomplete = '/static/BMap_offline_thirdAutocomplete'; const BMap_thirdGeolocation = '/static/BMap_offline_thirdGeolocation'; const BMap_thirdLocal = '/static/BMap_offline_thirdLocal'; const BMap_thirdSuggestion = '/static/BMap_offline_thirdSuggestion'; const BMap_thirdTile = '/static/BMap_offline_thirdTile'; const BMap_thirdGeocoding = '/static/BMap_offline_thirdGeocoding'; const BMap_thirdGeolocationControl = '/static/BMap_offline_thirdGeolocationControl'; const BMap_thirdNavigationControl = '/static/BMap_offline_thirdNavigationControl'; const BMap_thirdOverviewMapControl = '/static/BMap_offline_thirdOverviewMapControl'; const BMap_thirdScaleControl = '/static/BMap_offline_thirdScaleControl'; const BMap_thirdMapTypeControl = '/static/BMap_offline_thirdMapTypeControl'; const BMap_thirdPanorama = '/static/BMap_offline_thirdPanorama'; const BMap_thirdContextMenu = '/static/BMap_offline_thirdContextMenu'; const BMap_thirdVectorLayer = '/static/BMap_offline_thirdVectorLayer'; const BMap_thirdRasterLayer = '/static/BMap_offline_thirdRasterLayer'; const BMap_thirdWebglLayer = '/static/BMap_offline_thirdWebglLayer'; const BMap_thirdTiledLayer = '/static/BMap_offline_thirdTiledLayer'; const BMap_thirdCanvasLayer = '/static/BMap_offline_thirdCanvasLayer'; const BMap_thirdSymbolOverlay = '/static/BMap_offline_thirdSymbolOverlay'; const BMap_thirdCustomOverlay = '/static/BMap_offline_thirdCustomOverlay'; const BMap_thirdBoundary = '/static/BMap_offline_thirdBoundary'; const BMap_thirdHeatmap = '/static/BMap_offline_thirdHeatmap'; const BMap_thirdLushu = '/static/BMap_offline_thirdLushu'; const BMap_thirdDraw = '/static/BMap_offline_thirdDraw'; const BMap_thirdArea = '/static/BMap_offline_thirdArea'; const BMap_thirdDistance = '/static/BMap_offline_thirdDistance'; const BMap_thirdAutocomplete = '/static/BMap_offline_thirdAutocomplete'; const BMap_thirdGeolocation = '/static/BMap_offline_thirdGeolocation'; const BMap_thirdLocal = '/static/BMap_offline_thirdLocal'; const BMap_thirdSuggestion = '/static/BMap_offline_thirdSuggestion'; const BMap_thirdTile = '/static/BMap_offline_thirdTile'; const BMap_thirdGeocoding = '/static/BMap_offline_thirdGeocoding'; const BMap_thirdGeolocationControl = '/static/BMap_offline_thirdGeolocationControl'; const BMap_thirdNavigationControl = '/static/BMap_offline_thirdNavigationControl'; const BMap_thirdOverviewMapControl = '/static/BMap_offline_thirdOverviewMapControl'; const BMap_thirdScaleControl = '/static/BMap_offline_thirdScaleControl'; const BMap_thirdMapTypeControl = '/static/BMap_offline_thirdMapTypeControl'; const BMap_thirdPanorama = '/static/BMap_offline_thirdPanorama'; const BMap_thirdContextMenu = '/static/BMap_offline_thirdContextMenu'; const BMap_thirdVectorLayer = '/static/BMap_offline_thirdVectorLayer'; const BMap_thirdRasterLayer = '/static/BMap_offline_thirdRasterLayer'; const BMap_thirdWebglLayer = '/static/BMap_offline_thirdWebglLayer'; const BMap_thirdTiledLayer = '/static/BMap_offline_thirdTiledLayer'; const BMap_thirdCanvasLayer = '/static/BMap_offline_thirdCanvasLayer'; const BMap_thirdSymbolOverlay = '/static/BMap_offline_thirdSymbolOverlay'; const BMap_thirdCustomOverlay = '/static/BMap_offline_thirdCustomOverlay'; const BMap_thirdBoundary = '/static/BMap_offline_thirdBoundary'; const BMap_thirdHeatmap = '/static/BMap_offline_thirdHeatmap'; const BMap_thirdLushu = '/static/BMap_offline_thirdLushu'; const BMap_thirdDraw = '/static/BMap_offline_thirdDraw'; const BMap_thirdArea = '/static/BMap_offline_thirdArea'; const BMap_thirdDistance = '/static/BMap_offline_thirdDistance'; const BMap_thirdAutocomplete = '/static/BMap_offline_thirdAutocomplete'; const BMap_thirdGeolocation = '/static/BMap_offline_thirdGeolocation'; const BMap_thirdLocal = '/static/BMap_offline_thirdLocal'; const BMap_thirdSuggestion = '/static/BMap_offline_thirdSuggestion'; const BMap_thirdTile = '/static/BMap_offline_thirdTile'; const BMap_thirdGeocoding = '/static/BMap_offline_thirdGeocoding'; const BMap_thirdGeolocationControl = '/static/BMap_offline_thirdGeolocationControl'; const BMap_thirdNavigationControl = '/static/BMap_offline_thirdNavigationControl'; const BMap_thirdOverviewMapControl = '/static/BMap_offline_thirdOverviewMapControl'; const BMap_thirdScaleControl = '/static/BMap_offline_thirdScaleControl'; const BMap_thirdMapTypeControl = '/static/BMap_offline_thirdMapTypeControl'; const BMap_thirdPanorama = '/static/BMap_offline_thirdPanorama';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值