百度离线地图示例之三:矢量图

前言介绍:

主要是基于v3.0的API版本进行的离线,纯内网可操作,基本上实现了现有90%以上的功能点,能兼容jpg和png格式的瓦片图层,实现了原生和基于Vue两个版本,实现的功能点概要如下:

地图示例:

地图展示
同时加载两个地图
设置地图最大及最
小级别移动地图
缩放地图
拖拽地图
设置地图显示范围
获取地图显示范围
测距

地图控件:

工具条、比例尺控件 地图类型
缩略图控件
添加版权控件
添加自定义控件

覆盖物示例:

添加/删除覆盖物
折线上添加方向箭头
添加动画标注点
设置点的新图标
设置点是否可拖拽 设置线、面可编辑
设置覆盖物的显示与隐藏
文本标注
带文字标签的覆盖物
获取覆盖物的信息
添加多个标注点
从多个点删除指定点
加载闪烁点
加载海量点 添加弧线
画椭圆
添加自定义覆盖物
点聚合
添加/删除地面叠加层
热力图功能示例
矢量图
添加自定义控件

信息窗口示例:

纯文本的信息窗口
添加复杂内容的信息窗口
给多个点添加信息窗口
获取信息窗口的信息

右键菜单示例:

给地图添加右键菜单
给覆盖物添加右键菜单

鼠标操作示例

设置地图默认的鼠标样式
鼠标滚轮缩放地图
鼠标拖拽地图
鼠标测距
单击获取点击的经纬度
鼠标绘制工具

添加层示例:

添加清华校园微观图
自定义网格

事件示例

图块加载完毕
地图单击事件
给覆盖物注册事件
传递事件参数
为多个点注册单击事件
注销事件

除了离线了官方API外,还对一些操作工具类进行了离线(总计11个工具),比如:

Heatmap

作用:热力图

SearchInfoWindow

作用:百度地图样式”的信息窗口工具。该工具为用户提供带搜索框的信息窗口,该窗口内容可*定制多种风格。同时,用户可以将信息窗口标题以短信方式发送到手机上。

MarkerClusterer

作用:多标注聚合器。此工具解决加载大量点要素到地图上造成缓慢,且产生覆盖现象的问题。

RectangleZoom

作用:区域缩放工具。此工具将根据用户拖拽绘制的矩形区域大小对地图进行放大或缩小操作。

TextIconOverlay

作用:自定义覆盖物工具。用户可以使用该工具在地图上添加文字和图标样式的覆盖物。

LuShu

作用:路书,轨迹运动工具。此工具用以实现marker沿路线运动,并有暂停等功能。

GeoUtils

作用:几何运算工具。此工具提供判断点与矩形、 圆形、多边形线、多边形面的关系,并提供计算折线长度和多边形的面积的公式。

DistanceTool

作用:测距。

DrawingManager

作用:矢量图绘制。

代码示例实现:

html引用示例代码如下:

可以看出全部是离线引用,当然哪些工具类可以在组件内用的时候再引用也可以

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title>百度离线地图</title>
    <!-- 百度地图3.0 API Begin -->
    <script src="static/offlineMapLib/js/jquery-3.3.1.min.js"></script>
    <script type="text/javascript" src="static/offlineMapLib/map3.0_init.js"></script>
    <script type="text/javascript" src="static/offlineMapLib/map3.0.js"></script>
    <script type="text/javascript" src="static/offlineMapLib/layer.js"></script>
    <script type="text/javascript" src="static/offlineMapLib/demo.js"></script>
    <!-- 热力图 -->
    <script type="text/javascript" src="static/offlineMapLib/library/Heatmap_min.js"></script>
    <!-- 画弧线 -->
    <script type="text/javascript" src="static/offlineMapLib/library/CurveLine.min.js"></script>
    <!-- 点聚合 -->
    <script type="text/javascript" src="static/offlineMapLib/library/TextIconOverlay_min.js"></script>
    <script type="text/javascript" src="static/offlineMapLib/library/MarkerClusterer_min.js"></script>
    <!-- 测距 -->
    <script type="text/javascript" src="static/offlineMapLib/library/DistanceTool_min.js"></script>
    <!-- 鼠标绘制 -->
    <link rel="stylesheet" href="static/offlineMapLib/library/DrawingManager_min.css" />
    <script type="text/javascript" src="static/offlineMapLib/library/DrawingManager_min.css"></script>
    <!-- 百度地图3.0 End -->
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

组件内示例代码如下:

<!-- 矢量图  -->
<template>
  <div style="height:100%;width:100%">
    <div id="allmap34"></div>
    <div id="control">
      <input type="button" @click="hide()" value="隐藏" />
      <input type="button" @click="show()" value="显示" />
    </div>
  </div>
</template>

<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import 《组件名称》 from '《组件路径》';

export default {
  //import引入的组件需要注入到对象中才能使用
  components: {},
  data() {
    //这里存放数据
    return {
      mapObj: {
          map:{},
          point:{},
        vectorWARNING: {},
        vectorPlane: {},
        vectorFCArrow: {},
        vectorBCArrow: {},
        vectorFOArrow: {},
        vectorBOArrow: {},
        vectorStar: {},
        vectorCLOCK: {},
        vectorMarker: {},
        vectorPeoplePath: {},
      },
    };
  },
  //监听属性 类似于data概念
  computed: {},
  //监控data中的数据变化
  watch: {},
  //方法集合
  methods: {
    initMap() {
      this.mapObj.map = new BMap.Map("allmap34");
      this.mapObj.point = new BMap.Point(116.473008, 39.916605);
      this.mapObj.map.centerAndZoom(this.mapObj.point, 16);
      this.mapObj.map.enableScrollWheelZoom(true);

      //设置marker图标为人字形
      this.mapObj.vectorPeoplePath = new BMap.Marker(this.mapObj.point, {
        // 设置自定义path路径25325l99
        icon: new BMap.Symbol(
          "m0.5,48.67105l106.55963,0m-53.03642,45.73853l52.06349,51.09042m-52.06349,-51.57716l-48.65731,51.57716m48.41391,-112.39955l0,60.82238m16.17517,-77.24814c0,8.93415 -7.24208,16.17461 -16.17517,16.17461c-8.93307,0 -16.17464,-7.24046 -16.17464,-16.17461c0,-8.93309 7.24156,-16.1747 16.17464,-16.1747c8.93309,0 16.17517,7.24161 16.17517,16.1747z",
          {
            rotation: 0, //顺时针旋转40度
            fillColor: "green",
            fillOpacity: 0.8,
            strokeColor: "#555",
            strokeWeight: 3, //线宽
          }
        ),
      });

      this.mapObj.vectorFCArrow = new BMap.Marker(
        new BMap.Point(this.mapObj.point.lng - 0.01, this.mapObj.point.lat),
        {
          // 初始化方向向上的闭合箭头
          icon: new BMap.Symbol(BMap_Symbol_SHAPE_FORWARD_CLOSED_ARROW, {
            scale: 5,
            strokeWeight: 1,
            rotation: 0, //顺时针旋转30度
            fillColor: "red",
            fillOpacity: 0.8,
          }),
        }
      );

      this.mapObj.vectorBCArrow = new BMap.Marker(
        new BMap.Point(this.mapObj.point.lng + 0.02, this.mapObj.point.lat),
        {
          // 初始化方向向下的闭合箭头
          icon: new BMap.Symbol(BMap_Symbol_SHAPE_BACKWARD_CLOSED_ARROW, {
            scale: 5,
            strokeWeight: 1,
            rotation: 180,
            fillColor: "gold",
            fillOpacity: 0.8,
          }),
        }
      );

      this.mapObj.vectorFOArrow = new BMap.Marker(
        new BMap.Point(this.mapObj.point.lng + 0.03, this.mapObj.point.lat),
        {
          //  初始化方向向上的开放式箭头
          icon: new BMap.Symbol(BMap_Symbol_SHAPE_FORWARD_OPEN_ARROW, {
            scale: 5,
            strokeWeight: 1,
            rotation: 0,
            fillColor: "pink",
            fillOpacity: 0.8,
          }),
        }
      );

      this.mapObj.vectorBOArrow = new BMap.Marker(
        new BMap.Point(this.mapObj.point.lng + 0.04, this.mapObj.point.lat),
        {
          // 初始化方向向下的开放式箭头
          icon: new BMap.Symbol(BMap_Symbol_SHAPE_BACKWARD_OPEN_ARROW, {
            scale: 5,
            strokeWeight: 1,
            rotation: 90,
            fillColor: "lightgreen",
            fillOpacity: 0.8,
          }),
        }
      );

      //设置marker图标为水滴
      this.mapObj.vectorMarker = new BMap.Marker(
        new BMap.Point(this.mapObj.point.lng, this.mapObj.point.lat - 0.03),
        {
          // 指定Marker的icon属性为Symbol
          icon: new BMap.Symbol(BMap_Symbol_SHAPE_POINT, {
            scale: 2, //图标缩放大小
            fillColor: "orange", //填充颜色
            fillOpacity: 0.8, //填充透明度
          }),
        }
      );

      //设置marker图标为飞机
      this.mapObj.vectorPlane = new BMap.Marker(
        new BMap.Point(this.mapObj.point.lng + 0.04, this.mapObj.point.lat - 0.03),
        {
          // 初始化小飞机Symbol
          icon: new BMap.Symbol(BMap_Symbol_SHAPE_PLANE, {
            scale: 3,
            rotation: 0,
          }),
        }
      );

      this.mapObj.vectorCLOCK = new BMap.Marker(
        new BMap.Point(this.mapObj.point.lng + 0.01, this.mapObj.point.lat - 0.03),
        {
          // 初始化闹钟形状的symbol
          icon: new BMap.Symbol(BMap_Symbol_SHAPE_CLOCK, {
            scale: 2,
            strokeWeight: 1,
            fillColor: "blue",
            fillOpacity: 0.8,
          }),
        }
      );
      this.mapObj.ectorWARNING = new BMap.Marker(
        new BMap.Point(this.mapObj.point.lng + 0.02, this.mapObj.point.lat - 0.03),
        {
          // 初始化警告标志的symbol
          icon: new BMap.Symbol(BMap_Symbol_SHAPE_WARNING, {
            scale: 2,
            strokeWeight: 1,
            fillColor: "pink",
            fillOpacity: 0.8,
          }),
        }
      );

      this.mapObj.vectorStar = new BMap.Marker(
        new BMap.Point(this.mapObj.point.lng + 0.03, this.mapObj.point.lat - 0.03),
        {
          // 初始化五角星symbol
          icon: new BMap.Symbol(BMap_Symbol_SHAPE_STAR, {
            scale: 5,
            fillColor: "pink",
            fillOpacity: 0.8,
          }),
        }
      );
      //this.mapObj.map.addOverlay(this.mapObj.vectorWARNING);
      this.mapObj.map.addOverlay(this.mapObj.vectorPlane);
      this.mapObj.map.addOverlay(this.mapObj.vectorFCArrow);
      this.mapObj.map.addOverlay(this.mapObj.vectorBCArrow);
      this.mapObj.map.addOverlay(this.mapObj.vectorFOArrow);
      this.mapObj.map.addOverlay(this.mapObj.vectorBOArrow);
      this.mapObj.map.addOverlay(this.mapObj.vectorStar);
      this.mapObj.map.addOverlay(this.mapObj.vectorMarker);
      this.mapObj.map.addOverlay(this.mapObj.vectorCLOCK);
      this.mapObj.map.addOverlay(this.mapObj.vectorPeoplePath);
      this.mapObj.map.setViewport({
        center: new BMap.Point(116.501035, 39.897538),
        zoom: 14,
      });
    },
    hide() {
      //this.mapObj.vectorWARNING.hide();
      this.mapObj.vectorPlane.hide();
      this.mapObj.vectorFCArrow.hide();
      this.mapObj.vectorBCArrow.hide();
      this.mapObj.vectorFOArrow.hide();
      this.mapObj.vectorBOArrow.hide();
      this.mapObj.vectorStar.hide();
      this.mapObj.vectorCLOCK.hide();
      this.mapObj.vectorMarker.hide();
      this.mapObj.vectorPeoplePath.hide();
    },
    show() {
      //this.mapObj.vectorWARNING.show();
      this.mapObj.vectorPlane.show();
      this.mapObj.vectorFCArrow.show();
      this.mapObj.vectorBCArrow.show();
      this.mapObj.vectorFOArrow.show();
      this.mapObj.vectorBOArrow.show();
      this.mapObj.vectorStar.show();
      this.mapObj.vectorCLOCK.show();
      this.mapObj.vectorMarker.show();
      this.mapObj.vectorPeoplePath.show();
    },
  },
  //生命周期 - 创建完成(可以访问当前this实例)
  created() {},
  //生命周期 - 挂载完成(可以访问DOM元素)
  mounted() {
    this.initMap();
  },
  beforeCreate() {}, //生命周期 - 创建之前
  beforeMount() {}, //生命周期 - 挂载之前
  beforeUpdate() {}, //生命周期 - 更新之前
  updated() {}, //生命周期 - 更新之后
  beforeDestroy() {}, //生命周期 - 销毁之前
  destroyed() {}, //生命周期 - 销毁完成
  activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发
};
</script>
<style lang="scss" scoped>
//@import url(); 引入公共css类
//@import url(); 引入公共css类
#allmap34 {
  width: 100%;
  height: 800px;
}
p {
  margin-left: 5px;
  font-size: 14px;
  color: red;
  font-size: 18px;
  font-weight: bold;
}
</style>

地图实现效果展示:
百度离线地图示例之三:矢量图

系列文章后续一直有进行更新,有不完善的地方,可加微信一起交流:
百度离线地图示例之三:矢量图

上一篇:Gome 高性能撮合引擎微服务


下一篇:擂台PK赛来袭,队长竟然把队员推出去送死,这究竟是道德的沦丧,还是人性的扭曲?