自定义百度地图聚合点的显示文字以及显示的样式
前言
基于公司的需求,需要实现一个热力图来根据接口数据显示不同站点最近30天的乘车人次分布,采用百度地图的点聚合方法可以实现这一需求,但是要求点聚合后显示的文字和样式需要修改,所以就在这里记录一下如何修改(前后端混编项目)。
1. 地图展示
代码实现:
TextIconOverlay.js
自定义聚合点显示文字和样式需要修改百度地图提供的TextIconOverlay.js和MarkerClusterer.js,可以拷贝源码到本地再导入
<div class="tab-content">
<div class="tab-pane active animated fadeIn">
<div class="panel-body cw-panel-body">
<div class="row cw_export" id="view_tab_type">
<div class="col-lg-12">
<div class="cw_fw_bolder">
<div style="font-size: 18px;color: #0C0C0C;font-weight: 400;">最近30天站点乘车人次分布图</div>
<div class="point-map-line wrap-point-map" style="border: 2px solid #000;">
<div class="point-map" id="point_map"></div>
<div class="map-control-tool" id="wrap_point_map_control"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="/public/theme/INSPINIA/js/jquery.page.js?20190121"></script>
<script src="//api.map.baidu.com/api?v=2.0&ak=b2tdmZtPCKfwW8iwn5svaT03"></script>
<script type="text/javascript" src="/public/web/js/TextIconOverlay.js"></script>
<script type="text/javascript" src="/public/web/js/MarkerClusterer.js"></script>
<script type="text/javascript">
$(function () {
getPointsData();
(function setHeight() {
// 设置地图高度
var _height = $(window).height() || 0;
var _barHeight = $('#navbar').height() || 0;
if (_height) {
if (_barHeight) {
$("#point_map").height(_height - _barHeight - 200);
} else {
$("#point_map").height(_height - 200);
}
}
}());
});
/*标签*/
function createLable(map, point, content) {
var pointMap = new BMap.Map('point_map');
var opts = {
position: point,
offset: new BMap.Size(-5, 10)
}
var label = new BMap.Label(content, opts);
label.setStyle({
color: "#000",
border: "0px",
backgroundColor: "0.000000000001", //通过这个方法,去掉背景色
fontSize: "12px",
height: "20px",
lineHeight: "20px"
});
pointMap.addOverlay(label);
return label;
}
// 调用接口数据
function getPointsData() {
$.ajax({
url: '/index.php/dudubashi/enterprise/get_enterprise_hot_line',
type: 'POST',
dataType: 'json',
data: '',
success: function(data) {
if (data.result == '0000') {
// 创建地图实例
var pointMap = new BMap.Map('point_map');
var scaleCtrl = new BMap.ScaleControl(); // 添加比例尺控件
pointMap.addControl(scaleCtrl);
var NavigationControl = new BMap.NavigationControl(); // 添加平移缩放控件
pointMap.addControl(NavigationControl);
// pointMap.centerAndZoom(new BMap.Point(data.data[0].lng, data.data[0].lat), 12);
pointMap.centerAndZoom(new BMap.Point(113.90, 22.57), 13);
pointMap.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
var markers = [];
var pt = null;
// 创建小车图标
var myIcon = new BMap.Icon("/public/web/images/m0.png", new BMap.Size(55, 55));
var contentFirst,contentSecond;
for (var i = 0; i < data.data.length; i++) {
pt = new BMap.Point(data.data[i].lng, data.data[i].lat)
var marker = new BMap.Marker(pt,{
icon: myIcon})
markers.push(marker);
markers[i].customData = {
number: data.data[i].count }
var optsFirst = {
position: markers[i].point, // 指定文本标注所在的地理位置
offset: new BMap.Size(15, 18) // 设置文本偏移量
};
contentFirst = markers[i].customData.number; // 站点人数
contentSecond = data.data[i].title; // 站点名称
var labelFirst = new BMap.Label('<span style="display: inline-block;width: 50px;text-align: center;margin-left: -14px;">'+contentFirst+'</span>'+'<p></p>'+'<span style="margin-left: -25px;display: inline-block;width: 80px;text-align: center;">'+contentSecond+'</span>', optsFirst);
labelFirst.setStyle({
background: 'none',
color: 'black',
fontWeight: 'bold',
borderRadius: "10px",
fontSize: "12px",
lineHeight: "20px",
border :"0",
top: "17px",
transform:'translateX(-50%)'
});
marker.setLabel(labelFirst);
}
// 聚合点自定义样式
// var EXAMPLE_URL = "http://api.map.baidu.com/library/MarkerClusterer/1.2/examples/";
// if ()
// var myStyles = [{
// url: '/public/web/images/m0.png',
// size: new BMap.Size(55, 55),
// opt_anchor: [16, 0],
// textColor: '#333',
// opt_textSize: 10
// }];
//最简单的用法,生成一个marker数组,然后调用markerClusterer类即可。
var markerClusterer = new BMapLib.MarkerClusterer(pointMap, {
markers:markers});
// 聚合点自定义样式
// markerClusterer.setStyles(myStyles);
} else {
swal(data.info);
}
}
});
}
</script>
2. TextIconOverlay.js
/**
* @fileoverview 此类表示地图上的一个覆盖物,该覆盖物由文字和图标组成,从Overlay继承。
* 主入口类是<a href="symbols/BMapLib.TextIconOverlay.html">TextIconOverlay</a>,
* 基于Baidu Map API 1.2。
*
* @author Baidu Map Api Group
* @version 1.2
*/
/**
* @namespace BMap的所有library类均放在BMapLib命名空间下
*/
var BMapLib = window.BMapLib = BMapLib || {
};
(function () {
/**
* 声明baidu包
*/
var T,
baidu = T = baidu || {
version: "1.3.8"};
(function (){
//提出guid,防止在与老版本Tangram混用时
//在下一行错误的修改window[undefined]
baidu.guid = "$BAIDU$";
//Tangram可能被放在闭包中
//一些页面级别唯一的属性,需要挂载在window[baidu.guid]上
window[baidu.guid] = window[baidu.guid] || {
};
/**
* @ignore
* @namespace baidu.dom 操作dom的方法。
*/
baidu.dom = baidu.dom || {
};
/**
* 从文档中获取指定的DOM元素
* @name baidu.dom.g
* @function
* @grammar baidu.dom.g(id)
* @param {string|HTMLElement} id 元素的id或DOM元素
* @shortcut g,T.G
* @meta standard
* @see baidu.dom.q
*
* @returns {HTMLElement|null} 获取的元素,查找不到时返回null,如果参数不合法,直接返回参数
*/
baidu.dom.g = function (id) {
if ('string' == typeof id || id instanceof String) {
return document.getElementById(id);
} else if (id && id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) {
return id;
}
return null;
};
// 声明快捷方法
baidu.g = baidu.G = baidu.dom.g;
/**
* 获取目标元素所属的document对象
* @name baidu.dom.getDocument
* @function
* @grammar baidu.dom.getDocument(element)
* @param {HTMLElement|string} element 目标元素或目标元素的id
* @meta standard
* @see baidu.dom.getWindow
*
* @returns {HTMLDocument} 目标元素所属的document对象
*/
baidu.dom.getDocument = function (element) {
element = baidu.dom.g(element);
return element.nodeType == 9 ? element : element.ownerDocument || element.document;
};
/**
* @ignore
* @namespace baidu.lang 对语言层面的封装,包括类型判断、模块扩展、继承基类以及对象自定义事件的支持。
*/
baidu.lang = baidu.lang || {
};
/**
* 判断目标参数是否string类型或String对象
* @name baidu.lang.isString
* @function
* @grammar baidu.lang.isString(source)
* @param {Any} source 目标参数
* @shortcut isString
* @meta standard
* @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate
*
* @returns {boolean} 类型判断结果
*/
baidu.lang.isString = function (source) {
return '[object String]' == Object.prototype.toString.call(source);
};
// 声明快捷方法
baidu.isString = baidu.lang.isString;
/**
* 从文档中获取指定的DOM元素
* **内部方法**
*
* @param {string|HTMLElement} id 元素的id或DOM元素
* @meta standard
* @return {HTMLElement} DOM元素,如果不存在,返回null,如果参数不合法,直接返回参数
*/
baidu.dom._g = function (id) {
if (baidu.lang.isString(id)) {
return document.getElementById(id);
}
return id;
};
// 声明快捷方法
baidu._g = baidu.dom._g;
/**
* @ignore
* @namespace baidu.browser 判断浏览器类型和特性的属性。
*/
baidu.browser = baidu.browser || {
};
if (/msie (\d+\.\d)/i.test(navigator.userAgent)) {
//IE 8下,以documentMode为准
//在百度模板中,可能会有$,防止冲突,将$1 写成 \x241
/**
* 判断是否为ie浏览器
* @property ie ie版本号
* @grammar baidu.browser.ie
* @meta standard
* @shortcut ie
* @see baidu.browser.firefox,baidu.browser.safari,baidu.browser.opera,baidu.browser.chrome,baidu.browser.maxthon
*/
baidu.browser.ie = baidu.ie = document.documentMode || + RegExp['\x241'];
}
/**
* 获取目标元素的computed style值。如果元素的样式值不能被浏览器计算,则会返回空字符串(IE)
*
* @author berg
* @name baidu.dom.getComputedStyle
* @function
* @grammar baidu.dom.getComputedStyle(element, key)
* @param {HTMLElement|string} element 目标元素或目标元素的id
* @param {string} key 要获取的样式名
*
* @see baidu.dom.getStyle
*
* @returns {string} 目标元素的computed style值
*/
baidu.dom.getComputedStyle = function(element, key){
element = baidu.dom._g(element);
var doc = baidu.dom.getDocument(element),
styles;
if (doc.defaultView && doc.defaultView.getComputedStyle) {
styles = doc.defaultView.getComputedStyle(element, null);
if (styles) {
return styles[key] || styles.getPropertyValue(key);
}
}
return '';
};
/**
* 提供给setStyle与getStyle使用
*/
baidu.dom._styleFixer = baidu.dom._styleFixer || {
};
/**
* 提供给setStyle与getStyle使用
*/
baidu.dom._styleFilter = baidu.dom._styleFilter || [];
/**
* 为获取和设置样式的过滤器
* @private
* @meta standard
*/
baidu.dom._styleFilter.filter = function (key, value, method) {
for (var i = 0, filters = baidu.dom._styleFilter, filter; filter = filters[i]; i++) {
if (filter = filter[method]) {
value = filter(key, value);
}
}
return value;
};
/**
* @ignore
* @namespace baidu.string 操作字符串的方法。
*/
baidu.string = baidu.string || {
};
/**
* 将目标字符串进行驼峰化处理
* @name baidu.string.toCamelCase
* @function
* @grammar baidu.string.toCamelCase(source)
* @param {string} source 目标字符串
* @remark
* 支持单词以“-_”分隔
* @meta standard
*
* @returns {string} 驼峰化处理后的字符串
*/
baidu.string.toCamelCase = function (source) {
//提前判断,提高getStyle等的效率 thanks xianwei
if (source.indexOf('-') < 0 && source.indexOf('_') < 0) {
return source;
}
return source.replace(/[-_][^-_]/g, function (match) {
return match.charAt(1).toUpperCase();
});
};
/**
* 获取目标元素的样式值
* @name baidu.dom.getStyle
* @function
* @grammar baidu.dom.getStyle(element, key)
* @param {HTMLElement|string} element 目标元素或目标元素的id
* @param {string} key 要获取的样式名
* @remark
*
* 为了精简代码,本模块默认不对任何浏览器返回值进行归一化处理(如使用getStyle时,不同浏览器下可能返回rgb颜色或hex颜色),也不会修复浏览器的bug和差异性(如设置IE的float属性叫styleFloat,firefox则是cssFloat)。<br />
* baidu.dom._styleFixer和baidu.dom._styleFilter可以为本模块提供支持。<br />
* 其中_styleFilter能对颜色和px进行归一化处理,_styleFixer能对display,float,opacity,textOverflow的浏览器兼容性bug进行处理。
* @shortcut getStyle
* @meta standard
* @see baidu.dom.setStyle,baidu.dom.setStyles, baidu.dom.getComputedStyle
*
* @returns {string} 目标元素的样式值
*/
baidu.dom.getStyle = function (element, key