百度地图的应用也是极为广泛,从基本的定位,大头针的展现到线路的规划等等,但如果地图页面上在某一个区域内展示的大头针过多的话会在地图上面一团一团的都是满满的大头针,或许我们将地图缩小到某个区域之后用户并不关心某一个具体的大头针了,而成团的大头针叠在一起给人的感觉很不好,百度地图 SDK 在 2.9 的版本以后新增了

BMKClusterManager 的这样一个点聚合管理类.原理很简单,就是当地图缩放到某个级别的时候让地图显示另外一个类型的大头针.

百度地图聚合功能的实现:

{

BMKClusterManager *_clusterManager;//点聚合管理类

NSInteger _clusterZoom;//聚合级别

CGFloat _clusterFloatZoom;//百度地图聚合的浮点数级别

NSMutableArray *_clusterCaches;//点聚合缓存标注

NSInteger _previousZoom; // 记录前一次的缩放等级

}

#pragma mark - 更新聚合状态

//更新聚合状态

- (void)updateClusters {

_clusterZoom = (NSInteger)_mapView.zoomLevel;

_clusterFloatZoom=_mapView.zoomLevel;

//    NSLog(@"当前更新地图的时候地图的缩放级别为: %f",_mapView.zoomLevel);

//    NSLog(@"当前更新地图时地图的缩放级别取整结果: %ld",_clusterZoom);

//NSLog(@"--现在当前的地图缩放级别为 %d",_clusterZoom);

if (_clusterZoom<11) { // 目前是当地图缩放级别小于 11 级的时候才开始聚合

if (_dataSource.count < 150) {

return;

}

[self getStationModelToJuHeAnnotation];

@synchronized(_clusterCaches) {

__block NSMutableArray *clusters = [_clusterCaches objectAtIndex:(_clusterZoom -3)];

if (clusters.count > 0) {

[_mapView removeAnnotations:_mapView.annotations];

[_mapView addAnnotations:clusters];

[_mapView addAnnotation:_selfLocalModel];

} else {

dispatch_async(dispatch_get_global_queue(0, 0), ^{

///获取聚合后的标注

__block NSArray *array = [_clusterManager getClusters:_clusterFloatZoom];

dispatch_async(dispatch_get_main_queue(), ^{

for (BMKCluster *item in array) {

// 获得每一个聚合之后标注的内容(个数,经纬度)

ClusterAnnotation *annotation = [[ClusterAnnotation alloc] init];

annotation.coordinate = item.coordinate;

annotation.size = item.size;

annotation.title = [NSString stringWithFormat:@"我是%ld个", item.size];

[clusters addObject:annotation];

int yellow=0;

int blue=0;

int gray=0;

for (JuHeModel* model in item.clusterItems) {

if ([model.categary intValue] ==3) {

yellow++;

}else if ([model.categary intValue] == 2){

blue++;

}else if([model.categary intValue] ==1){

gray++;

}

}

annotation.yellowCount=[NSString stringWithFormat:@"%d",yellow];

annotation.blewCount=[NSString stringWithFormat:@"%d",blue];

annotation.grayCount=[NSString stringWithFormat:@"%d",gray];

}

[_mapView removeAnnotations:_mapView.annotations];

[_mapView addAnnotations:clusters];

[_mapView addAnnotation:_selfLocalModel];

});

});

}

}

}else{

if (_previousZoom!= (NSInteger)_mapView.zoomLevel ) {

[_mapView removeAnnotations:_mapView.annotations];

[_mapView addAnnotations:_dataSource];

[_mapView addAnnotation:_selfLocalModel];

}

}

// 记录前一次的缩放比例

_previousZoom=(NSInteger)_mapView.zoomLevel;

}

/** _dataSource 为从服务器获取的数据模型数组*/

-(void)getStationModelToJuHeAnnotation

{

[self addJuHecoordinate:_dataSource];

}

-(void)addJuHecoordinate:(NSArray*)models

{

//点聚合管理类

_clusterManager = [[BMKClusterManager alloc] init];

for (LocalModel* model in models) {

JuHeModel* clusterItem=[[JuHeModel alloc] init];

clusterItem.coor=model.coordinate;

clusterItem.categary=model.category;

[_clusterManager addClusterItem:clusterItem];

}

}

#program mark -- 百度地图代理方法

- (void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated

{

NSLog(@"地图代理中区域发生变化时当前地图的所缩放级别:%f",mapView.zoomLevel);

if (_previousZoom != (NSInteger)mapView.zoomLevel) {

[self updateClusters];

}

}

// 根据anntation生成对应的View

/**

ClusterAnnotation     遵从BMKAnnotation 协议的大头针模型

ClusterAnnotationView  为自定义的聚合模型,目前展示的是外面一圈色带展示所聚合区域类不同类型的占比

*/

- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation

{

[self hideHud];

//普通annotation

if ([annotation isKindOfClass:[ClusterAnnotation class]]) {  // 聚合类

NSString *AnnotationViewID = @"ClusterMark";

ClusterAnnotation *cluster = (ClusterAnnotation*)annotation;

ClusterAnnotationView *annotationView = [[ClusterAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID];

annotationView.size = cluster.size;

// 按返回比例计算

//        annotationView.bluScal=[cluster.blewCount intValue] * 1.0 / (cluster.size * 1.0);

//        annotationView.yellowScal=[cluster.yellowCount intValue] * 1.0 / (cluster.size * 1.0);

//        annotationView.grayScal=[cluster.grayCount intValue] * 1.0 / (cluster.size * 1.0);

// 周围只选择蓝色一圈

annotationView.bluScal=1.0;

// NSLog(@"%d--%d     %f  %f  %f",cluster.size,cluster.size-2, annotationView.bluScal,annotationView.yellowScal,annotationView.grayScal);

annotationView.draggable = YES;

//annotationView.canShowCallout=NO;

annotationView.annotation = cluster;

return annotationView;

}else if ([annotation isKindOfClass:[LocalModel class]]) { // 非聚合类

/** 根据数据模型 想展示怎样的大头针自己定义*/

return newAnnotationView;

}

return nil;

}

项目中的聚合效果图:

              

iOS-百度地图聚合相关推荐

  1. ios 百度地图指定区域_ios百度地图的使用(普通定位、反地理编码)

    iOS定位 - 普通定位(没有地图) - 反地理编码(得到具体位置),下面通过代码给大家详解,代码如下: #import 使用到的头文件 要引入CoreLocation这个包 使用的代理名称 //1. ...

  2. iOS百度地图SDK之实时绘制轨迹(后台仍执行)

    首先,对于百度地图SDK的配置和环境搭建就不做说明,需要的人可以博客中另一篇文章看 <iOS百度地图SDK基本使用> ,本文的重点在于实现实时绘制轨迹的功能,并且对细节进行处理和优化 1. ...

  3. iOS 百度地图使用详解

    最近仿照美团做了款应用,刚好用到百度地图,高德地图之前用的比较多,只是这个项目的后台服务器是另外一个公司做的,他们用的就是百度地图,现在网上用百度地图的还不算太多,博文也是断断续续的,主要是中间跳跃有 ...

  4. iOS百度地图的使用

    为什么80%的码农都做不了架构师?>>>    项目最近对地图整体模块进行了重构, 为了和我们的安卓同学保持统一,放弃了原本就很6的高德地图,全部改用百度地图(虽然我觉得百度地图不好 ...

  5. iOS百度地图的相关开发(一)

    2019独角兽企业重金招聘Python工程师标准>>> 我是最近接触的百度读图开发,百度地图的相关sdk api开发写的很简单,有很多都是写的不是很详细,但是如果我们想深究就会遇到很 ...

  6. iOS 百度地图之坐标转换

    iOS系统定位是采用的是gps坐标,如果想在百度地图上展示有两种方式 1.百度地图SDK采用的是百度自有的地理坐标系(bdll09),因此开发者在做位置标注的时候,需要将其他类型的坐标转换为百度坐标. ...

  7. 百度地图聚合点的展示

    转载请声明原文地址:http://blog.csdn.net/sagittarius1988/article/details/52665300 前言 好久没有更新博客了,一直在忙着项目地图实景图聚合的 ...

  8. 百度地图聚合中的marker添加label后移动、放大缩小时label消失的问题download

    最近在做百度地图相关的项目,由于要解决大批量点位渲染的问题,所以使用了聚合MarkerClusterer,但是在使用的过程中,碰到很多问题,例如如何获得已经聚合了的marker.给marker设置了l ...

  9. ios 百度地图指定区域_iOS百度地图简单使用详解

    百度地图 iOS SDK是一套基于iOS 5.0及以上版本设备的应用程序接口,不仅提供展示地图的基本接口,还提供POI检索.路径规划.地图标注.离线地图.定位.周边雷达等丰富的LBS能力 . 今天主要 ...

  10. iOS百度地图 Demo

    效果图 一.环境设置 1.开发环境:Xocode 7.3.1 2.模拟器环境:iOS 9.3 3.iOS 9 之后不能直接使用 HTTP 进行请求,需要在 Info.plist 新增一段用于控制 AT ...

最新文章

  1. Flink 助力美团数仓增量生产的应用实践
  2. Tomcat 8 安装和配置、优化
  3. 用python输入任意三条边长_如何用python求第三条边边长
  4. FileSystemObject和Folders使用详细介绍
  5. Python小白的数学建模课-23.数据拟合全集
  6. mysql上机实验报告3_SQL入门随笔(上机实验报告)
  7. 已解决:手动打包war包结果无法在Tomcat中部署
  8. [转载] Python_正则表达式匹配Word文档
  9. Glade3 tutorial in chinese
  10. android通知栏内添加快捷键_Android实现向Launcher添加快捷方式的方法
  11. [C++项目]C++实现简易的酒店管理系统
  12. oracle里xdb用户,修改Oracle XDB默认监听端口
  13. php 秒拍视频解析,新浪微博视频解析源码_秒拍视频站外调用可自定义广告
  14. HTML图片的空隙解决
  15. C++学习笔记-STL
  16. 润物无声:java的字符串操作
  17. #路由配置以及华为路由协议优先级
  18. 关于length与length()
  19. python画太极图
  20. 【深度学习】ONNX 模型文件修改节点的名称,修改输入名称,修改输出名称

热门文章

  1. 解读经典《C#高级编程》第七版 Page32-38.核心C#.Chapter2
  2. 精彩回顾:终于明白阿里百度为什么拿WaitNotify通知机制考察求职者了
  3. Ubuntu下利用Conda创建虚拟环境并安装Pytorch各版本教程(妈妈再也不用担心我在家还不学习了系列三)
  4. GPT中的temperature参数不是用在对话的而是用在调用OPEN API过程中的
  5. PHP-校花评选-埃洛等级分系统(Elo rating system)
  6. 【USACO 2.4.4】回家
  7. html与网页设计 实践课,网页设计与制作实践课期末考试
  8. cn域名保护隐私_域名隐私保护的含义及获取方法
  9. 一个通信男的6年时光!
  10. Redis-- 缓存预热+缓存雪崩+缓存击穿+缓存穿透