Vue中用 Vue Baidu Map 绘制地图

1、先贴上官网案例

https://dafrok.github.io/vue-baidu-map/#/zh/guide/painting

官网的东西,没有百度地图开放平台上面的东西齐全,考虑到vue 只不过是框架,全部搬过来也是不现实的,所以有需要的小伙伴可以去百度地图的官网去查看相关的教程。

2、需求

我的需求是可以回显之前绘制过的数据,而且只能显示一个图层,不允许有多个图层。
因此官网的教程与我的不符合,我又去找了一下其他的案例,发现有一个符合我的要求
先贴上链接
https://www.cnblogs.com/caoxen/p/11352488.html#commentform
我改动了一丢丢,贴上我的,因为他的没有标注如何回显数据,而且注释的稍微有些些问题,哈哈哈,我差点被绕晕。

<baidu-map
   :center="mapOptions.center"
   :zoom="mapOptions.zoom"
   :scroll-wheel-zoom="mapOptions.scroll"
   :map-click="false"
   @ready="mapReady"
   @mousemove="syncPolygon"
   @click="paintPolygon"
   @rightclick="finishPolygon"
   class="baidu-map-view"
   ak="mapOptions.mapAK"
 >
   <bm-polygon
      :path="path"
      v-for="path of polygonPath.paths"
      :key="path.toString()"
      :fill-opacity="0.4"
      :stroke-opacity="0.5"
      :stroke-weight="3"
      stroke-color="red"
      fill-color="blue"
    />
    <bm-control>
      <el-button type="button"  @click="toggle('polygonPath')">{{ polygonPath.editing ? '停止绘制' : '开始绘制' }}</el-button>
    </bm-control>
    <!--比例尺控件-->
    <bm-scale anchor="BMAP_ANCHOR_BOTTOM_LEFT"></bm-scale>
    <!-- 定位控件 -->
    <bm-geolocation anchor="BMAP_ANCHOR_BOTTOM_RIGHT"></bm-geolocation>
    <!--缩放控件-->
    <bm-navigation anchor="BMAP_ANCHOR_BOTTOM_RIGHT" ></bm-navigation>
  </baidu-map>


<script>
import { BaiduMap, BmScale, BmGeolocation, BmNavigation, BmPolygon} from "vue-baidu-map";
export default {
polygonPath: {
        editing: false,
        paths: [] // 绘制完成后的经纬度,其实是在画的时候动态push的,因为在点击的时候触发了 paintPolygon 函数
      },
  },
methods: {
 //地图加载
  mapReady({ BMap, map }) {
    this.mapOptions.center.lng = 116.404;
    this.mapOptions.center.lat = 39.915;
    this.mapOptions.zoom = 15;
    window.map = map; //将map变量存储在全局
    //这里是个重点,需要将整个数组作为整体推到paths中才可以。 
    let mapPath = [
      {lng: 116.392358, lat: 39.91583},
      {lng: 116.382225, lat: 39.909798},
      {lng: 116.397748, lat: 39.910462},
    ]
    this.polygonPath.paths.push(mapPath)
  },
   // 开启多边形绘制
    toggle (name) {
      this[name].editing = !this[name].editing
      // 在这里做一步判断,如果有路径且开启绘制就把原来的路径清空
      if (this.polygonPath.paths && this.polygonPath.editing) {
        this.polygonPath.paths = []
      }
    },
    // 鼠标移动时
    syncPolygon (e) {
      if (!this.polygonPath.editing) {
        return
      }
      const { paths } = this.polygonPath
      if (!paths.length) {
        return
      }
      const path = paths[paths.length - 1]
      if (!path.length) {
        return
      }
      if (path.length === 1) {
        path.push(e.point)
      }
      this.$set(path, path.length - 1, e.point)
    },
    // 鼠标右键多边形绘制完成
    finishPolygon (e) {
      if (!this.polygonPath.editing) {
        return
      }
      // 当开始绘制后把按钮调回开始绘制状态,防止绘制多个图形
      this['polygonPath'].editing = !this['polygonPath'].editing
      const { paths } = this.polygonPath
      if (!paths.length) {
        paths.push([])
      }
      const path = paths[paths.length - 1]
      path.pop()
      if (path.length) {
        paths.push([])
      }
    },
    // 鼠标左键点击时往路径里push一个点
    paintPolygon (e) {
      if (!this.polygonPath.editing) {
        return
      }
      const { paths } = this.polygonPath
      !paths.length && paths.push([])
      paths[paths.length - 1].push(e.point)
    },
},

然后我发现,其实跟官网的差不多,我感觉有点不太爽啊,感觉多此一举哇,
还是要自己改代码,偷懒是偷不掉的哇!

贴一下我自己的:

<baidu-map
   :center="mapOptions.center"
   :zoom="mapOptions.zoom"
   :scroll-wheel-zoom="mapOptions.scroll"
   :map-click="false"
   @ready="mapReady"
   @mousemove="syncPolygon"
   @click="paintPolygon"
   @rightclick="finishPolygon"
   class="baidu-map-view"
   ak="mapOptions.mapAK"
 >
   <bm-polygon
     :path="paths"
     :key="paths.toString()"
     :fill-opacity="0.4"
     :stroke-opacity="0.5"
     :stroke-weight="3"
     stroke-color="red"
     fill-color="blue"
   />
   <bm-control>
     <el-button type="button"  @click="toggle()">{{ editing ? '停止绘制' : '开始绘制' }}</el-button>
   </bm-control>
   <!--比例尺控件-->
   <bm-scale anchor="BMAP_ANCHOR_BOTTOM_LEFT"></bm-scale>
   <!-- 定位控件 -->
   <bm-geolocation anchor="BMAP_ANCHOR_BOTTOM_RIGHT"></bm-geolocation>
   <!--缩放控件-->
   <bm-navigation anchor="BMAP_ANCHOR_BOTTOM_RIGHT" ></bm-navigation>
 </baidu-map>

<script>
import { BaiduMap, BmScale, BmGeolocation, BmNavigation, BmPolygon} from "vue-baidu-map";
export default {
  name: "areaInfo",
  components: {
    BaiduMap,
    BmScale,
    BmGeolocation,
    BmNavigation,
    BmPolygon
  },
  data() {
    return {
      mapOptions: {
        mapAK: "A1LZGCUGO4zB4ZH0MEGDMihQRggNpURx",
        center: { lng: 0, lat: 0 },
        zoom: 3,
        scroll: "true"
      },
      editing: false,
        paths: [], // 绘制完成后的经纬度,其实是在画的时候动态push的,因为在点击的时候触发了 paintPolygon 函数
    };
  },
  methods: {

    //地图加载
    mapReady({ BMap, map }) {
      this.mapOptions.center.lng = 116.404;
      this.mapOptions.center.lat = 39.915;
      this.mapOptions.zoom = 15;
      window.map = map; //将map变量存储在全局
      //需要将整个数组作为整体推到paths中才可以。
      let mapPath = [
        {lng: 116.392358, lat: 39.91583},
        {lng: 116.382225, lat: 39.909798},
        {lng: 116.397748, lat: 39.910462},
      ]
      this.paths=mapPath
    },
    // 开启多边形绘制
    toggle () {
      this.editing = !this.editing
      // 在这里做一步判断,如果有路径且开启绘制就把原来的路径清空
      if (this.paths && this.editing) {
        this.paths = []
      }
    },
    // 鼠标移动时
    syncPolygon (e) {
      if (!this.editing) {
        return
      }
      let paths = this.paths
      if (!paths.length) {
        return
      }
      if (paths.length === 1) {
        paths.push(e.point)
      }
      this.$set(paths, paths.length - 1, e.point)
      console.log(this.paths)
    },
    // 鼠标右键多边形绘制完成
    finishPolygon (e) {
      if (!this.editing) {
        return
      }
      // 当开始绘制后把按钮调回开始绘制状态,防止绘制多个图形
      this.editing = !this.editing
       let paths = this.paths
      if (!paths.length) {
        this.paths = []
      }
      paths.pop()
      console.log(paths)
    },
    // 鼠标左键点击时往路径里push一个点
    paintPolygon (e) {
      if (!this.editing) {
        return
      }
      let paths = this.paths
      paths.push(e.point)
    },
  }
};
</script>

只是对数据的格式稍微改动了一下,让数据更好的存储了一下。

菜鸟自我成长中,欢迎大佬指点。自己一个人摸索真的太难了。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: vue-baidu-map是基于百度地图API开发的Vue组件,它能够在Vue项目中轻松地集成百度地图。而离线百度地图是指在没有网络连接的情况下能够使用的百度地图。 正常情况下,百度地图需要联网才能显示地和获取相关数据。但是在有些场景下,比如地下车库或者偏远山区等网络较差或者没有网络的地方,就无法正常使用百度地图。离线百度地图就是解决这个问题的解决方案,它通过事先将地数据下载保存在本地,使得在没有网络连接的情况下也能够正常使用百度地图。 对于vue-baidu-map来说,它的离线功能也是很重要的。通过使用vue-baidu-map的离线百度地图,开发者可以轻松地针对不同的场景选择不同的地方案,提高用户的使用体验。而且离线百度地图对于一些隐私性、安全性要求高的应用场景也更加有优势。 总之,vue-baidu-map离线百度地图是一个非常实用与方便的工具,在实际生产中可以提供更好的用户体验,也为开发者提供了更多的选择与便捷。 ### 回答2: vue-baidu-map离线百度地图是一款基于Vue.js框架开发的百度地图组件库,主要解决的是在无网络或网络不稳定的情况下,无法使用在线地的问题。该组件库提供的离线地可以在无网络的情况下正常使用,并且具有与在线地相同的功能和可视化效果。 在vue-baidu-map离线百度地图组件中,我们可以使用百度地图提供的基础地、卫星地、混合地等多种地样式,并且支持地名搜索、地缩放、位置探测、路线规划等常用功能。此外,在使用vue-baidu-map离线百度地图时,我们也可以通过添加自定义数据层、自定义覆盖层等方式,对地进行更加丰富的扩展和定制。 总之,vue-baidu-map离线百度地图是一款非常实用的地组件库,它可以帮助我们在网络不稳定或者无网络的情况下,依然可以正常使用百度地图,并且具有完整的百度地图功能和美观的地样式。如果你正在建设一个应用程序,需要集成离线地功能,那么vue-baidu-map离线百度地图可能正是你需要的工具。 ### 回答3: vue-baidu-map是一个可嵌入Vue.js网站的地组件,它集成了百度地图的API,可以让开发者轻松实现地功能。 离线百度地图指的是一种不需要联网即可使用的百度地图,也就是地数据被下载到本地储存设备上。vue-baidu-map支持使用离线地,这就意味着用户可以在没有网络的环境下依然能够使用地功能。 使用vue-baidu-map离线百度地图的优势在于,它提供了更好的用户体验和更高的灵活性。首先,用户无需担心网络不稳定、信号弱的问题,可以随时随地使用地进行定位、浏览、搜索等操作;其次,开发者可以根据具体需求选择下载特定区域的地数据,以减少数据流量和缩短加载时间;还可以根据不同需求切换在线地和离线地,达到最佳的用户体验。 总之,vue-baidu-map离线百度地图为开发者提供了便捷灵活的地开发工具,让用户可以更加自由地使用地服务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值