更新时间:2020-06-23
热力图简介
热力图是用不同颜色的区块叠加在地图上描述人群分布、密度和变化趋势的一个产品,百度地图SDK将绘制热力图的能力为广大开发者开放,帮助开发者利用自有数据,构建属于自己的热力图,提供丰富的展示效果。
注意:此处的“热力图功能”不同于“百度城市热力图”。百度城市热力图通过简单的接口调用,开发者可展示百度数据的热力图层。而此处的热力图功能,需要开发者传入自己的位置数据(坐标),然后SDK会根据热力图绘制规则,为开发者做本地的热力图渲染绘制。
热力图生成的原理
大量自有坐标数据在地图打点,打点的越多,就会根据打点的密集程度,呈现热力图。
构建属于自己的热力图
利用自有数据,构建属于自己的热力图,提供丰富的展示效果,添加自定义热力图请参考BMKHeatMap类。关键代码示例如下:
Objective-C
Swift
//添加热力图 -(void)addHeatMap{ //创建热力图数据类 BMKHeatMap* heatMap = [[BMKHeatMap alloc]init]; //创建热力图数据数组 NSMutableArray* data = [NSMutableArray array]; //读取数据 NSData *jsonData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"locations" ofType:@"json"]]; if (jsonData) { NSArray *array = [jsonData objectFromJSONData]; for (NSDictionary *dic in array) { //创建BMKHeatMapNode BMKHeatMapNode* heatMapNodeTest = [[BMKHeatMapNode alloc]init]; CLLocationCoordinate2D coor; coor.latitude = [dic[@"lat"] doubleValue]; coor.longitude = [dic[@"lng"] doubleValue]; heatMapNodeTest.pt = coor; //随机生成点强度 heatMapNodeTest.intensity = arc4random()*900; //添加BMKHeatMapNode到数组 [data addObject:heatMapNodeTest]; } } //将点数据赋值到热力图数据类 heatMap.mData = data; //调用mapView中的方法根据热力图数据添加热力图 [_mapView addHeatMap:heatMap]; }
heatMap = BMKHeatMap.init() let data: Data? = try! Data.init(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "locations", ofType: "json")!)) if (data != nil) { let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments) as! [[String:Any]] var arr:Array<BMKHeatMapNode> = Array.init() for element in jsonObj! { let lat = element["lat"] let lng = element["lng"] let node = BMKHeatMapNode.init() node.pt = CLLocationCoordinate2DMake(lat as! CLLocationDegrees, lng as! CLLocationDegrees) node.intensity = 1.0 arr.append(node) } heatMap.mData = (arr as NSArray).mutableCopy() as? NSMutableArray } mapView.add(heatMap)
Json数据样式可根据需求自定义,示例中的json数据样式如下:
[ {"lng": 116.895579, "lat": 24.306521}, {"lng": 113.951068, "lat": 22.772504}, … {"lng": 110.00006, "lat": 40.603564}, {"lng": 111.846788, "lat": 21.897821} ]
自定义数据热力图效果如下:
注意: 自有坐标数据在地图打点,打点的越多,就会根据打点的密集程度,呈现热力图。如拥有的数据是某一坐标上有一个数值(如密度值、趋势值),生成热力图时,可以理解为在某一坐标打点“密度值次”、“趋势值次”,地图即可呈现热力图。
但密度值、趋势值可能为小数,需要对数据做一下处理,比如整体密度值、趋势值扩大1000倍取整。 读取坐标数据时,某个坐标读取“1000倍密度值次”,那么坐标点的密度,就会通过热力呈现出来了。