百度地图js lite api 支持点聚合
百度地图lite api 是专门为h5 绘制海量点设计的,但是偏偏忽略掉了点聚合的需求,所以需要自己动手,做一次二次改造。
我们知道点聚合需要引入开源库:
MarkerClusterer: http://api.map.baidu.com/library/MarkerClusterer/1.2/src/MarkerClusterer.js
TextIconOverlay: http://api.map.baidu.com/library/TextIconOverlay/1.2/src/TextIconOverlay.js
由于是开源库,我们可以直接把代码撸下来保存直接放到自己的业务里使用
我们在 MarkerClusterer addMarkers的时候浏览器会报错,
是因为lite api中的map对象及bounds对象缺乏两个方法:
map.getDistance 及 bounds.containsPoint
getDistance方法是计算两个点之间的直线距离,返回数值为米,这个方法网上就有
const EARTH_RADIUS = 6378137.0;
const {PI} = Math; function getRad(d){
return d*PI/180.0;
} function getDistance(start,end){
let lat1 = +start.lat;
let lat2 = +end.lat;
let lng1 = +start.lng;
let lng2 = +end.lng;
if(lat1==lat2 && lng1 == lng2){
return 0;
}
let f = getRad((lat1 + lat2)/2);
let g = getRad((lat1 - lat2)/2);
let l = getRad((lng1 - lng2)/2);
let sg = Math.sin(g);
let sl = Math.sin(l);
let sf = Math.sin(f);
let s,c,w,r,d,h1,h2;
let a = EARTH_RADIUS;
let fl = 1/298.257;
sg = sg*sg;
sl = sl*sl;
sf = sf*sf;
s = sg*(1-sl) + (1-sf)*sl;
c = (1-sg)*(1-sl) + sf*sl;
w = Math.atan(Math.sqrt(s/c));
r = Math.sqrt(s*c)/w;
d = 2*w*a;
h1 = (3*r -1)/2/c;
h2 = (3*r +1)/2/s;
return d*(1 + fl*(h1*sf*(1-sg) - h2*(1-sf)*sg));
}
我们把这个方法赋到map对象上
var MarkerClusterer = function (map, options) {
if (!map) {
return;
}
map.getDistance = getDistance; // 这里
this._map = map;
this._markers = [];
this._clusters = [];
var opts = options || {};
this._gridSize = opts["gridSize"] || 60;
this._maxZoom = opts["maxZoom"] || 18;
this._minClusterSize = opts["minClusterSize"] || 2;
this._isAverageCenter = false;
if (opts['isAverageCenter'] != undefined) {
this._isAverageCenter = opts['isAverageCenter'];
}
this._styles = opts["styles"] || [];
var that = this;
this._map.addEventListener("zoomend", function () {
that._redraw();
});
this._map.addEventListener("moveend", function () {
that._redraw();
});
var mkrs = opts["markers"];
isArray(mkrs) && this.addMarkers(mkrs);
};
map对象就补齐了
containsPoint 是计算点是否在bounds给定的区域中,这个更简单
var getExtendedBounds = function (map, bounds, gridSize) {
bounds = cutBoundsInRange(bounds);
var pixelNE = map.pointToPixel(bounds.getNorthEast());
var pixelSW = map.pointToPixel(bounds.getSouthWest());
pixelNE.x += gridSize;
pixelNE.y -= gridSize;
pixelSW.x -= gridSize;
pixelSW.y += gridSize;
var newNE = map.pixelToPoint(pixelNE);
var newSW = map.pixelToPoint(pixelSW);
let nb = new BMap.Bounds(newSW, newNE);
// 写在这里
nb.containsPoint = function(point){
var lat = point.lat;
var lng = point.lng;
if(!point || !point.lat || !point.lng){
return false;
} else {
return lat>this._swLat && lat < this._neLat && lng<this._neLng && lng>this._swLng;
}
}
return nb;
};
至此MarkerClusterer 改造完毕
然后是改造TextIconOverlay
由于lite api 返回的MarkerPane
TextIconOverlay.prototype.initialize = function (map) {
this._map = map;
this._domElement = document.createElement('div');
this._updateCss();
this._updateText();
this._updatePosition();
this._bind();
// 将markerMouseTarget 替换成markerPane
this._map.getPanes().markerPane.appendChild(this._domElement);
return this._domElement;
};
这样就可以了
百度地图js lite api 支持点聚合的更多相关文章
- 百度地图--JS版
百度地图JS版本 ----选择关键字地图展示对应地址---- CSS body, html { width: %; height: %; margin: ; font-family: "微软 ...
- 外部引入的js 判断js脚本加载是否完成,完成后执行 相应的动作(以引入百度地图js为例)
可以使用JQuery的 $.getScript(url,function(){});方法 $.getScript("http://api.map.baidu.com/getscript?v= ...
- 【完全开源】百度地图Web service API C#.NET版,带地图显示控件、导航控件、POI查找控件
目录 概述 功能 如何使用 参考帮助 概述 源代码主要包含三个项目,BMap.NET.BMap.NET.WindowsForm以及BMap.NET.WinformDemo. BMap.NET 对百度地 ...
- C# 调用百度地图Web服务API
最近公司项目中需要根据两个地点的交通路径和距离做一些数据推荐,为了程序的稳定和用户体验所以想从百度地图 API 采集数据保存到数据库中,经过一翻研究之后选定了百度地图 Web 服务 API 中的 Di ...
- C# 调用百度地图 Web 服务 API
最近公司项目中需要根据两个地点的交通路径和距离做一些数据推荐,为了程序的稳定和用户体验所以想从百度地图 API 采集数据保存到数据库中,经过一翻研究之后选定了百度地图 Web 服务 API 中的 Di ...
- 【转】【完全开源】百度地图Web service API C#.NET版,带地图显示控件、导航控件、POI查找控件
[转][完全开源]百度地图Web service API C#.NET版,带地图显示控件.导航控件.POI查找控件 目录 概述 功能 如何使用 参考帮助 概述 源代码主要包含三个项目,BMap.NET ...
- Node.js调用百度地图Web服务API的Geocoding接口进行点位反地理信息编码
(从我的新浪博客上搬来的,做了一些修改.) 最近迷上了node.js以及JavaScript.现在接到一个活,要解析一个出租车点位数据的地理信息.于是就想到使用Node.js调用百度地图API进行解析 ...
- 百度地图JS API不能使用position:fixed
用于放置百度地图的dom元素及其任何一级父元素设置position:fixed属性时,js会报如下错误: Uncaught TypeError: Cannot read property 'offse ...
- 百度地图 JS API开发Demo01
百度地图DEMO <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...
随机推荐
- 【明哥报错簿】tomcat 安装时出现 Failed to install Tomcat7 service
安装tomcat时提示 Failed to install Tomcat7 service 应该是卸载时直接删除目录导致的. Failed to install Tomcat7 service Che ...
- MD5加密概述
一.Note: 写到这篇文章是工作中实际遇到了,以前都听过不过没有细看.这里简单概述下,原理的话需要看看更专业的介绍了. 二.MD5简介 Message Digest Algorithm MD5(中文 ...
- [洛谷P4910]帕秋莉的手环
题目大意:有一个$n(n\leqslant10^{18})$个点的环,每个点可以是$0$或$1$,要求相邻点中至少一个$1$,问方案数,多组询问. 题解:先考虑是一条链的情况,令$f_{i,j}$表示 ...
- 【BZOJ2436】【NOI2011】NOI嘉年华(动态规划)
[BZOJ2436]NOI嘉年华(动态规划) 题面 BZOJ 题解 考虑第一问如何求解 发现状态与选择了哪些活动无关,只与时间有关 设\(f[i][j]\)表示前\(i\)个单位时间(离散后),一个嘉 ...
- 【读书笔记】《HTTP权威指南》:Web Robots
一.概述 Web机器人(Web Robots)是一种Web客户端的软件程序,它自动发起一系列的Web事务,从而在没有人工参与的状态下完成各种Web数据的搜集和处理. 典型的Web机器人有: 股票绘图机 ...
- [CF1087D]Minimum Diameter Tree
link 题目大意 有$n$个点的前边权为$0$的树,你要加入$S$边权总量,可以为分数,使得当前树的直径最小. 题目分析 题目过于毒瘤,导致于最后$1$个小时一直在做此题,没想到真的只是一个结论一样 ...
- 【arc075F】Mirrored
Portal --> arc075_f Solution 一开始抱着"我有信仰爆搜就可以过"的心态写了一个爆搜.. 但是因为..剪枝和枚举方式不够优秀愉快T掉了q ...
- 【二维树状数组】【CF10D】 LCIS
传送门 Description 给你两个串,求他们的最长公共上升子序列 Input 第一行是第一个串的长度\(n\) 第二行\(n\)个数代表第一个串 第三行是第二个串的长度\(m\) 第四行\(m\ ...
- 04-树4. Root of AVL Tree-平衡查找树AVL树的实现
对于一棵普通的二叉查找树而言,在进行多次的插入或删除后,容易让树失去平衡,导致树的深度不是O(logN),而接近O(N),这样将大大减少对树的查找效率.一种解决办法就是要有一个称为平衡的附加的结构条件 ...
- [树莓派]wifi在面板看不到,但是可以scan到的解决方案
突然遇到一个问题,发现在wifi面板中找不到WiFi,但是运行scan命令可以发现WiFi,多方查找资料终于找到了一个解决方案: 运行如下命令: sudo apt-get install wicd ...