前言介绍:
主要是基于v3.0的API版本进行的离线,纯内网可操作,基本上实现了现有90%以上的功能点,能兼容jpg和png格式的瓦片图层,实现了原生和基于Vue两个版本(包含常用的55个示例),文末有个人微信二维码,有不完善的地方,可加微信一起探讨交流,实现的功能点概要如下:
地图示例:
地图展示
同时加载两个地图
设置地图最大及最
小级别移动地图
缩放地图
拖拽地图
设置地图显示范围
获取地图显示范围
测距
地图控件:
工具条、比例尺控件 地图类型
缩略图控件
添加版权控件
添加自定义控件
覆盖物示例:
添加/删除覆盖物
折线上添加方向箭头
添加动画标注点
设置点的新图标
设置点是否可拖拽 设置线、面可编辑
设置覆盖物的显示与隐藏
文本标注
带文字标签的覆盖物
获取覆盖物的信息
添加多个标注点
从多个点删除指定点
加载闪烁点
加载海量点 添加弧线
画椭圆
添加自定义覆盖物
点聚合
添加/删除地面叠加层
热力图功能示例
矢量图
添加自定义控件
信息窗口示例:
纯文本的信息窗口
添加复杂内容的信息窗口
给多个点添加信息窗口
获取信息窗口的信息
右键菜单示例:
给地图添加右键菜单
给覆盖物添加右键菜单
鼠标操作示例
设置地图默认的鼠标样式
鼠标滚轮缩放地图
鼠标拖拽地图
鼠标测距
单击获取点击的经纬度
鼠标绘制工具
添加层示例:
添加清华校园微观图
自定义网格
事件示例
图块加载完毕
地图单击事件
给覆盖物注册事件
传递事件参数
为多个点注册单击事件
注销事件
除了离线了官方API外,还对一些操作工具类进行了离线(总计11个工具),比如:
Heatmap
作用:热力图
SearchInfoWindow
作用:百度地图样式”的信息窗口工具。该工具为用户提供带搜索框的信息窗口,该窗口内容可自由定制多种风格。同时,用户可以将信息窗口标题以短信方式发送到手机上。
MarkerClusterer
作用:多标注聚合器。此工具解决加载大量点要素到地图上造成缓慢,且产生覆盖现象的问题。
RectangleZoom
作用:区域缩放工具。此工具将根据用户拖拽绘制的矩形区域大小对地图进行放大或缩小操作。
TextIconOverlay
作用:自定义覆盖物工具。用户可以使用该工具在地图上添加文字和图标样式的覆盖物。
LuShu
作用:路书,轨迹运动工具。此工具用以实现marker沿路线运动,并有暂停等功能。
GeoUtils
作用:几何运算工具。此工具提供判断点与矩形、 圆形、多边形线、多边形面的关系,并提供计算折线长度和多边形的面积的公式。
DistanceTool
作用:测距。
DrawingManager
作用:矢量图绘制。
代码示例实现:
html引用示例代码如下:
1、百度地图离线API下载地址
2、百度地图离线工具类集合下载地址
可以看出全部是离线引用,当然哪些工具类可以在组件内用的时候再引用也可以
<!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="allmap33"></div>
<div id="r-result33">
<input type="button" @click="openHeatmap();" value="显示热力图" /><input
type="button"
@click="closeHeatmap();"
value="关闭热力图"
/>
</div>
</div>
</template>
<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import 《组件名称》 from '《组件路径》';
export default {
//import引入的组件需要注入到对象中才能使用
components: {},
data() {
//这里存放数据
return {
mapObj:{
heatmapOverlay:{}
}
};
},
//监听属性 类似于data概念
computed: {},
//监控data中的数据变化
watch: {},
//方法集合
methods: {
initMap() {
var map = new BMap.Map("allmap33"),vm = this; // 创建地图实例
var point = new BMap.Point(116.418261, 39.921984);
map.centerAndZoom(point, 15); // 初始化地图,设置中心点坐标和地图级别
map.enableScrollWheelZoom(); // 允许滚轮缩放
var points = [
{ lng: 116.418261, lat: 39.921984, count: 50 },
{ lng: 116.423332, lat: 39.916532, count: 51 },
{ lng: 116.419787, lat: 39.930658, count: 15 },
{ lng: 116.418455, lat: 39.920921, count: 40 },
{ lng: 116.418843, lat: 39.915516, count: 100 },
{ lng: 116.42546, lat: 39.918503, count: 6 },
{ lng: 116.423289, lat: 39.919989, count: 18 },
{ lng: 116.418162, lat: 39.915051, count: 80 },
{ lng: 116.422039, lat: 39.91782, count: 11 },
{ lng: 116.41387, lat: 39.917253, count: 7 },
{ lng: 116.41773, lat: 39.919426, count: 42 },
{ lng: 116.421107, lat: 39.916445, count: 4 },
{ lng: 116.417521, lat: 39.917943, count: 27 },
{ lng: 116.419812, lat: 39.920836, count: 23 },
{ lng: 116.420682, lat: 39.91463, count: 60 },
{ lng: 116.415424, lat: 39.924675, count: 8 },
{ lng: 116.419242, lat: 39.914509, count: 15 },
{ lng: 116.422766, lat: 39.921408, count: 25 },
{ lng: 116.421674, lat: 39.924396, count: 21 },
{ lng: 116.427268, lat: 39.92267, count: 1 },
{ lng: 116.417721, lat: 39.920034, count: 51 },
{ lng: 116.412456, lat: 39.92667, count: 7 },
{ lng: 116.420432, lat: 39.919114, count: 11 },
{ lng: 116.425013, lat: 39.921611, count: 35 },
{ lng: 116.418733, lat: 39.931037, count: 22 },
{ lng: 116.419336, lat: 39.931134, count: 4 },
{ lng: 116.413557, lat: 39.923254, count: 5 },
{ lng: 116.418367, lat: 39.92943, count: 3 },
{ lng: 116.424312, lat: 39.919621, count: 100 },
{ lng: 116.423874, lat: 39.919447, count: 87 },
{ lng: 116.424225, lat: 39.923091, count: 32 },
{ lng: 116.417801, lat: 39.921854, count: 44 },
{ lng: 116.417129, lat: 39.928227, count: 21 },
{ lng: 116.426426, lat: 39.922286, count: 80 },
{ lng: 116.421597, lat: 39.91948, count: 32 },
{ lng: 116.423895, lat: 39.920787, count: 26 },
{ lng: 116.423563, lat: 39.921197, count: 17 },
{ lng: 116.417982, lat: 39.922547, count: 17 },
{ lng: 116.426126, lat: 39.921938, count: 25 },
{ lng: 116.42326, lat: 39.915782, count: 100 },
{ lng: 116.419239, lat: 39.916759, count: 39 },
{ lng: 116.417185, lat: 39.929123, count: 11 },
{ lng: 116.417237, lat: 39.927518, count: 9 },
{ lng: 116.417784, lat: 39.915754, count: 47 },
{ lng: 116.420193, lat: 39.917061, count: 52 },
{ lng: 116.422735, lat: 39.915619, count: 100 },
{ lng: 116.418495, lat: 39.915958, count: 46 },
{ lng: 116.416292, lat: 39.931166, count: 9 },
{ lng: 116.419916, lat: 39.924055, count: 8 },
{ lng: 116.42189, lat: 39.921308, count: 11 },
{ lng: 116.413765, lat: 39.929376, count: 3 },
{ lng: 116.418232, lat: 39.920348, count: 50 },
{ lng: 116.417554, lat: 39.930511, count: 15 },
{ lng: 116.418568, lat: 39.918161, count: 23 },
{ lng: 116.413461, lat: 39.926306, count: 3 },
{ lng: 116.42232, lat: 39.92161, count: 13 },
{ lng: 116.4174, lat: 39.928616, count: 6 },
{ lng: 116.424679, lat: 39.915499, count: 21 },
{ lng: 116.42171, lat: 39.915738, count: 29 },
{ lng: 116.417836, lat: 39.916998, count: 99 },
{ lng: 116.420755, lat: 39.928001, count: 10 },
{ lng: 116.414077, lat: 39.930655, count: 14 },
{ lng: 116.426092, lat: 39.922995, count: 16 },
{ lng: 116.41535, lat: 39.931054, count: 15 },
{ lng: 116.413022, lat: 39.921895, count: 13 },
{ lng: 116.415551, lat: 39.913373, count: 17 },
{ lng: 116.421191, lat: 39.926572, count: 1 },
{ lng: 116.419612, lat: 39.917119, count: 9 },
{ lng: 116.418237, lat: 39.921337, count: 54 },
{ lng: 116.423776, lat: 39.921919, count: 26 },
{ lng: 116.417694, lat: 39.92536, count: 17 },
{ lng: 116.415377, lat: 39.914137, count: 19 },
{ lng: 116.417434, lat: 39.914394, count: 43 },
{ lng: 116.42588, lat: 39.922622, count: 27 },
{ lng: 116.418345, lat: 39.919467, count: 8 },
{ lng: 116.426883, lat: 39.917171, count: 3 },
{ lng: 116.423877, lat: 39.916659, count: 34 },
{ lng: 116.415712, lat: 39.915613, count: 14 },
{ lng: 116.419869, lat: 39.931416, count: 12 },
{ lng: 116.416956, lat: 39.925377, count: 11 },
{ lng: 116.42066, lat: 39.925017, count: 38 },
{ lng: 116.416244, lat: 39.920215, count: 91 },
{ lng: 116.41929, lat: 39.915908, count: 54 },
{ lng: 116.422116, lat: 39.919658, count: 21 },
{ lng: 116.4183, lat: 39.925015, count: 15 },
{ lng: 116.421969, lat: 39.913527, count: 3 },
{ lng: 116.422936, lat: 39.921854, count: 24 },
{ lng: 116.41905, lat: 39.929217, count: 12 },
{ lng: 116.424579, lat: 39.914987, count: 57 },
{ lng: 116.42076, lat: 39.915251, count: 70 },
{ lng: 116.425867, lat: 39.918989, count: 8 },
];
if (!isSupportCanvas()) {
alert(
"热力图目前只支持有canvas支持的浏览器,您所使用的浏览器不能使用热力图功能~"
);
}
//详细的参数,可以查看heatmap.js的文档 https://github.com/pa7/heatmap.js/blob/master/README.md
//参数说明如下:
/* visible 热力图是否显示,默认为true
* opacity 热力的透明度,1-100
* radius 势力图的每个点的半径大小
* gradient {JSON} 热力图的渐变区间 . gradient如下所示
* {
.2:'rgb(0, 255, 255)',
.5:'rgb(0, 110, 255)',
.8:'rgb(100, 0, 255)'
}
其中 key 表示插值的位置, 0~1.
value 为颜色值.
*/
this.mapObj.heatmapOverlay = new BMapLib.HeatmapOverlay({ radius: 20 });
map.addOverlay(this.mapObj.heatmapOverlay);
this.mapObj.heatmapOverlay.setDataSet({ data: points, max: 100 });
this.closeHeatmap();
function setGradient() {
/*格式如下所示:
{
0:'rgb(102, 255, 0)',
.5:'rgb(255, 170, 0)',
1:'rgb(255, 0, 0)'
}*/
var gradient = {};
var colors = document.querySelectorAll("input[type='color']");
colors = [].slice.call(colors, 0);
colors.forEach(function(ele) {
gradient[ele.getAttribute("data-key")] = ele.value;
});
vm.heatmapOverlay.setOptions({ gradient: gradient });
}
//判断浏览区是否支持canvas
function isSupportCanvas() {
var elem = document.createElement("canvas");
return !!(elem.getContext && elem.getContext("2d"));
}
},
//是否显示热力图
openHeatmap() {
this.mapObj.heatmapOverlay.show();
},
closeHeatmap() {
this.mapObj.heatmapOverlay.hide();
},
},
//生命周期 - 创建完成(可以访问当前this实例)
created() {},
//生命周期 - 挂载完成(可以访问DOM元素)
mounted() {
this.initMap();
},
beforeCreate() {}, //生命周期 - 创建之前
beforeMount() {}, //生命周期 - 挂载之前
beforeUpdate() {}, //生命周期 - 更新之前
updated() {}, //生命周期 - 更新之后
beforeDestroy() {}, //生命周期 - 销毁之前
destroyed() {}, //生命周期 - 销毁完成
activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发
};
</script>
<style lang="scss" scoped>
//@import url(); 引入公共css类
#allmap33 {
height: 800px;
width: 100%;
}
#r-result33 {
width: 100%;
}
p {
margin-left: 5px;
font-size: 14px;
color: red;
font-size: 18px;
font-weight: bold;
}
</style>
地图实现效果展示:
上一篇: 百度离线地图示例之三:矢量图
下一篇:百度离线地图示例之五:点聚合
系列文章后续一直有进行更新,有不完善的地方,可加微信一起交流: