浏览器版本低!无法浏览完整内容,建议升级或更换浏览器。

文档全面上新

更科技的视觉体验,更高效的页面结构,快前往体验吧!

体验新版
更新时间:2023-03-31
热力图简介

热力图是用不同颜色的区块叠加在地图上描述人群分布、密度和变化趋势的一个产品,百度地图SDK将绘制热力图的能力为广大开发者开放,帮助开发者利用自有数据,构建属于自己的热力图,提供丰富的展示效果。

注意:此处的“热力图功能”不同于“百度城市热力图”。百度城市热力图通过简单的接口调用,开发者可展示百度数据的热力图层。而此处的热力图功能,需要开发者传入自己的位置数据(坐标),然后SDK会根据热力图绘制规则,为开发者做本地的热力图渲染绘制。

热力图生成的原理

大量自有坐标数据在地图打点,打点的越多,就会根据打点的密集程度,呈现热力图。

构建属于自己的热力图

利用自有数据,构建属于自己的热力图,提供丰富的展示效果,添加自定义热力图请参考BMKHeatMap类。关键代码示例如下:

Objective-C
Swift
//添加热力图
-(void)addHeatMap { 
  //创建热力图数据类 
  BMKHeatMap* heatMap = [[BMKHeatMap alloc] init]; 
  //读取数据 
  NSData *jsonData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"locations" ofType:@"json"]]; 
  NSArray *array = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; 
  NSMutableArray* datas = [NSMutableArray array]; 
  // 创建60帧数据 
  for (int i = 0; i < 60; i++) { 
    //创建热力图数据数组 
      NSMutableArray* data = [NSMutableArray array]; 
      if (jsonData) { 
          for (NSDictionary *dic in array) { 
              //创建BMKHeatMapNode 
              BMKHeatMapNode* heapmapnode_test = [[BMKHeatMapNode alloc] init]; 
              BMKGradient *graident = [[BMKGradient alloc] initWithColors:@[[UIColor blueColor], [UIColor redColor], [UIColor greenColor]] startPoints:@[@0.08, @0.4, @1.0]]; 
              heatMap.mGradient = graident; 
              CLLocationCoordinate2D coor; 
              coor.latitude = [dic[@"lat"] doubleValue] + 0.05 * i; 
              coor.longitude = [dic[@"lng"] doubleValue] + 0.05 * i; 
              heapmapnode_test.pt = coor; 
              //随机生成点强度 
              heapmapnode_test.intensity = arc4random() % 900; 
              //添加BMKHeatMapNode到数组 
              [data addObject:heapmapnode_test]; 
          } 
      } 
      [datas addObject:data]; 
  } 
  //将点数据赋值到热力图数据类 
  heatMap.mDatas = datas; 
  heatMap.mMaxHight = 100; 
  BMKAnimation *animation = [[BMKAnimation alloc] init]; 
  animation.duration = 600; 
  animation.type = CosineCurve; 
  heatMap.animation = animation; 
  BMKAnimation *frameAnimation = [[BMKAnimation alloc] init]; 
  frameAnimation.duration = 3000; 
  frameAnimation.type = InOutSine; 
  heatMap.frameAnimation = frameAnimation; 
  heatMap.delegate = self; 
  //调用mapView中的方法根据热力图数据添加热力图 
  [self.mapView addHeatMap:heatMap];      
} 

#pragma mark - BMKHeatMapDelegate 
- (void)onHandleCurrentHeatMapFrameAnimationIndex:(NSInteger)index { 
  // 当前展示帧索引值 
} 
let heatMap = BMKHeatMap() 
let path = Bundle.main.path(forResource: "multPoints", ofType: "json")  
let url = URL(fileURLWithPath: path!) 
let nodes = NSMutableArray.init()   
do {   
    let data = try Data(contentsOf: url)   
    let jsonData: Any = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers)   
    let jsonArr = jsonData as! NSArray       
    for dict in jsonArr {  
        let dictTemp: Dictionary = dict as! Dictionary<String, NSNumber>  
        let heapmapnode_test = BMKHeatMapNode.init()   
        let lat = dictTemp["lat"]! as NSNumber   
        let lng = dictTemp["lng"]! as NSNumber   
        heapmapnode_test.pt = CLLocationCoordinate2D(latitude: CLLocationDegrees(lat.floatValue), longitude: CLLocationDegrees(lng.floatValue))   
        //随机生成点强度   
        heapmapnode_test.intensity = Double(arc4random() % 900)   
        nodes.add(heapmapnode_test)   
    } 
  
} catch let error as Error? {   
    print("读取本地数据出现错误!")   
} 
  
//将点数据赋值到热力图数据类  
heatMap.mData = nodes as? [BMKHeatMapNode]  
heatMap.mMaxHight = 100   
heatMap.delegate = self  
/// BMKHeatMapDelegate 
  
func onHandleCurrentHeatMapFrameAnimationIndex(_ index: Int) {  
    // 当前展示帧索引值 
  
} 

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}
]

自定义数据热力图效果如下:

heatingPowerPic.png

注意: 自有坐标数据在地图打点,打点的越多,就会根据打点的密集程度,呈现热力图。如拥有的数据是某一坐标上有一个数值(如密度值、趋势值),生成热力图时,可以理解为在某一坐标打点“密度值次”、“趋势值次”,地图即可呈现热力图。

但密度值、趋势值可能为小数,需要对数据做一下处理,比如整体密度值、趋势值扩大1000倍取整。 读取坐标数据时,某个坐标读取“1000倍密度值次”,那么坐标点的密度,就会通过热力呈现出来了。


热力图米单位半径

地图SDK since 6.5.7 新增米单位半径热力图及热力图展示层级限制,更加适合局部场景热力图展示。修改关键代码示例如下:

Objective-C
Swift
/// 设置热力图点半径单位是否是米,默认为NO,since 6.5.7
heatMap.mRadiusIsMeter = YES;
/// 设置热力图点半径(米),默认为12米,当mRadiusIsMeter为YES时生效,范围[10~50],since 6.5.6
heatMap.mRadiusMeter = 50;
/// 设置热力图最大权重值,默认为1.0,since 6.5.0
/// 建议根据自身需求设置最大权值
heatMap.mMaxIntensity = 120;
/// 设置热力图最大显示等级,默认为22,范围[4~22],since 6.5.7
heatMap.mMaxShowLevel = 22;
/// 设置热力图最大显示等级,默认为4,范围[4~22],since 6.5.7
heatMap.mMinShowLevel = 19;
/// 设置热力图点半径单位是否是米,默认为NO,since 6.5.7
heatMap.mRadiusIsMeter = true
/// 设置热力图点半径(米),默认为12米,当mRadiusIsMeter为YES时生效,范围[10~50],since 6.5.6
heatMap.mRadiusMeter = 50
/// 设置热力图最大权重值,默认为1.0,since 6.5.0
/// 建议根据自身需求设置最大权值
heatMap.mMaxIntensity = 120
/// 设置热力图最大显示等级,默认为22,范围[4~22],since 6.5.7
heatMap.mMaxShowLevel = 22
/// 设置热力图最大显示等级,默认为4,范围[4~22],since 6.5.7
heatMap.mMinShowLevel = 17
效果如下:
https://mapopen-pub-iossdk.cdn.bcebos.com/map/v6_5_7/heatingPower.mov
  • 文档根本没法用

  • 文档水平很差

  • 文档水平一般

  • 文档不错

  • 文档写的很好

如发现文档错误,或对此文档有更好的建议,请在下方反馈。问题咨询请前往反馈平台提交工单咨询。

提交反馈

拖动标注工具

添加矩形标注

添加箭头标注

完成

取消