被客户爸爸折腾了好久,最后终于做出基本满意的“热力图”
起初做的热力图,但是来回反复测试百度地图热力图和echars热力图+百度地图,终究不满足客户爸爸,原因很简单某些地区放大后,为什么啥也没有了,为什么?为什么?mmmp不知当讲不当讲,热力图放大数据稀疏的地方当然不明显,遂开始改热力图各种配置,渐变色,透明度,无奈怎么也不满足。最后技术总监说干脆用某某项目的聚合算了,接着就进入了正题百度地图–聚合折腾之路。
百度地图的聚合在文档里不太好找,在百度地图开源库里才能找到
#####贴一下官方的简单说明
|类 | 描述 |
| - | - |
|BMapLib.MarkerClusterer(map, options)|MarkerClusterer|
方法
方法 | 返回值 | 描述 |
---|---|---|
addMarker(marker) | None | 添加一个聚合的标记。 |
addMarkers(markers) | None | 添加要聚合的标记数组。 |
clearMarkers() | None | 从地图上彻底清除所有的标记 |
getClustersCount() | Number | 获取聚合的总数量。 |
getGridSize() | Number | 获取网格大小 |
getMap() | Map | 获取聚合的Map实例。 |
getMarkers() | Array | 获取所有的标记数组。 |
getMaxZoom() | Number | 获取聚合的最大缩放级别。 |
getMinClusterSize() | Number | 获取单个聚合的最小数量。 |
getStyles() | Array | 获取聚合的样式风格集合 |
isAverageCenter() | Boolean | 获取单个聚合的落脚点是否是聚合内所有标记的平均中心。 |
removeMarker(marker) | Boolean | 删除单个标记 |
removeMarkers(markers) | Boolean | 删除一组标记 |
setGridSize(size) | None | 设置网格大小 |
setMaxZoom(maxZoom) | None | 设置聚合的最大缩放级别 |
setMinClusterSize(size) | None | 设置单个聚合的最小数量。 |
setStyles(styles) | None | 设置聚合的样式风格集合 |
事实上要不是逼急一般人不会来这里看这些文档,百度地图的demo基本上就够用。
由于数据量巨大,本项目的就有十三万数据,一股脑显示在地图上之后来回缩放,发现….卡,卡到没朋友,还有就是这十三万数据从服务器传送到前端耗时十多秒赶上网速不好就得挂在半路500错误码。
无奈之下的继续优化,终于在苦苦搜索之后找到了网上大神的优化代码 (传送门),不得不说效率确实大增,但是,优化后依然扛不住13万的数据。将来的数据可不止13万。进一步优化。
结合网上的仿照链家等地图找房例子(传送门),规划这样的方案:
1.进行区域划分,省、市、区对应不同的地图等级显示不同等级的数据,这样起码就解决的全国数据时有十三万的尴尬,这样折合下来全国数据也就30多条,效率不言而喻的高!
2.省、市、区级别之后进行自动聚合,就是百度地图真正的聚合。
3.为了避免数据多余营销效率,每次请求只请求可视区域内的数据。
然后是甩锅到本渣渣这里,开始自我猜想:
1.地图要做到拖动请求,缩放请求
2.每次请求都要知道现在的地图缩放级别是多少,以便判断当前是省、市、区
3.每次请求还要有地图可视的区域经纬度
4.省市区要用地图的自定义覆盖物,Label是个不错的选择
5.请求数据地图级别省市区的时候,数据要包含行政区域名称,人数,经纬度
基本上是这样,然后开始搞
1 | 获取地图缩放级别 |
添加文本标注label
Label(content: String, opts: LabelOptions)
创建一个文本标注实例。point参数指定了文本标注所在的地理位置
|方法|返回值| 描述|
|setStyle(styles: Object)|none|设置文本标注样式,该样式将作用于文本标注的容器元素上。其中styles为JavaScript对象常量,比如: setStyle({ color : “red”, fontSize : “12px” }) 注意:如果css的属性名中包含连字符,需要将连字符去掉并将其后的字母进行大写处理,例如:背景色属性要写成:backgroundColor|
|setContent(content: String)|none|设置文本标注的内容。支持HTML|
|setPosition(position: Point)|none|设置文本标注坐标。仅当通过Map.addOverlay()方法添加的文本标注有效|
然后就是代码说事儿
1 | var map = new BMap.Map("echars_heatmap", {minZoom:5}); |
后台用的php,这里贴上sql说明一下问题就行
当请求级别是小于4的时候,sql如下:
1 | /* |
当请求级别是4的时候,sql如下:
1 | /* |
效果图
附加address表的说明:
表结构:
名称 | 类型 | 备注 |
---|---|---|
id | bigint(11) | 表id |
name | varchar(32) | 地区名称 |
level | tinyint(4) | 地区等级 分省市县区 |
pid | bigint(10) | 父id |
longitude | float | 百度坐标,经度 |
latitude | float | 百度坐标,纬度 |