百度点聚合功能,自定义针头功能

关于怎么导入百度地图SDK与创建应用就不多说了,百度的文档应该比我说的更详细,下面直接正文吧:

demo图:

demo路径在最下面;

1.首先地图的初始化

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];
}

- (void)setupView {

  /// 地图
  _mapView = [[BMKMapView alloc]init];

  [_mapView setMapType:BMKMapTypeStandard];// 地图类型 ->卫星/标准、
  _mapView.showsUserLocation = YES;
  _mapView.gesturesEnabled = YES;
  _mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
  _mapView.frame = self.view.bounds;
  [self.view addSubview:_mapView];
}
// 地图的初始化
- (void)setupMapService {
  _locService = [[BMKLocationService alloc]init];
  _locService.delegate = self;
  _locService.desiredAccuracy = kCLLocationAccuracyBest;
  _locService.distanceFilter = 10;//大于100米
  [_locService startUserLocationService];

  _geoCodeSerch = [[BMKGeoCodeSearch alloc] init];
  _geoCodeSerch.delegate = self;

  _mapView.showsUserLocation = NO;//先关闭显示的定位图层
  _mapView.userTrackingMode = BMKUserTrackingModeFollow;//设置定位的状态
  _mapView.showsUserLocation = YES;//显示定位图层

  _clusterManager = [[BMKClusterManager alloc] init];

  //初始化检索对象
  self.districtSearch = [[BMKDistrictSearch alloc] init];
  //设置delegate,用于接收检索结果
  self.districtSearch.delegate = self;

  //在此处理正常结果
  _clusterCaches = [[NSMutableArray alloc] init];
   (NSInteger i = 3; i < 22; i++) {
    [_clusterCaches addObject:[NSMutableArray array]];
  }
}

2.地图的开始与加载完毕

/**
*地图初始化完毕时会调用此接口
*@param mapView 地图View
*/
- (void)mapViewDidFinishLoading:(BMKMapView *)mapView {
  BMKLocationViewDisplayParam *displayParam = [[BMKLocationViewDisplayParam alloc]init];
  displayParam.isAccuracyCircleShow = NO;//精度圈是否显示
  [_mapView updateLocationViewWithParam:displayParam];

  BMKCoordinateRegion region ;//表示范围的结构体
  region.center = _mapView.centerCoordinate;//中心点
  self.cCoordinate = _mapView.centerCoordinate;//中心点
  region.span.latitudeDelta = 0.002;//经度范围(设置为0.1表示显示范围为0.2的纬度范围)
  region.span.longitudeDelta = 0.002;//纬度范围
  [_mapView setRegion:region animated:YES];
  [self updateClusters];
}

/**
*地图渲染每一帧画面过程中,以及每次需要重绘地图时(例如添加覆盖物)都会调用此接口
*@param mapView 地图View
*@param status 此时地图的状态
*/
- (void)mapView:(BMKMapView *)mapView onDrawMapFrame:(BMKMapStatus *)status {
  if (_clusterZoom != 0 && _clusterZoom != (NSInteger)mapView.zoomLevel) {
    [self updateClusters];
  }
}

3.地图的位置发生变化

- (void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
  //屏幕坐标转地图经纬度
  CLLocationCoordinate2D MapCoordinate = [_mapView convertPoint:_mapView.center toCoordinateFromView:_mapView];

  if (_reverseGeoCodeOption==nil) {
    //初始化反地理编码类
    _reverseGeoCodeOption= [[BMKReverseGeoCodeOption alloc] init];
  }

  //需要逆地理编码的坐标位置
  _reverseGeoCodeOption.reverseGeoPoint =MapCoordinate;
  [_geoCodeSerch reverseGeoCode:_reverseGeoCodeOption];
  // 如果你是请求自己后台的数据可以在这里请求,可以省去下面检索回来的数据,由于我的是demo,所以下面是必须要的
  BMKNearbySearchOption *option = [[BMKNearbySearchOption alloc]init];
  option.pageIndex = 1;
  option.pageCapacity = 10;
  option.location = mapView.centerCoordinate;

  option.keyword = @"小吃";
  BOOL flag = [self.poiSearch poiSearchNearBy:option];
  if(flag)
  {
    NSLog(@"周边检索发送成功");
  } else {
    NSLog(@"周边检索发送失败");
  }
}

// 当地图发生改变之后,检索并
//实现PoiSearchDeleage处理回调结果
- (void)onGetPoiResult:(BMKPoiSearch*)searcher result:(BMKPoiResult*)poiResultList errorCode:(BMKSearchErrorCode)error
{
  if (error == BMK_SEARCH_NO_ERROR) {
    //在此处理正常结果
  }
  else if (error == BMK_SEARCH_AMBIGUOUS_KEYWORD){
  //当在设置城市未找到结果,但在其他城市找到结果时,回调建议检索城市列表
  // result.cityList;
    NSLog(@"起始点有歧义");
  } else {
    NSLog(@"抱歉,未找到结果");
  }
  // 清空缓存数据
  [_clusterManager clearClusterItems];
  for (BMKPoiInfo *poiInfo in poiResultList.poiInfoList) {
  XJCluster *cluster = [[XJCluster alloc] init];
  cluster.name = poiInfo.name;
  cluster.pt = poiInfo.pt;
  // 添加数据
  [self addAnnoWithPT:cluster];
  }
}

4.更新点聚合状态

//更新聚合状态
- (void)updateClusters {

  _clusterZoom = (NSInteger)_mapView.zoomLevel;
  @synchronized(_clusterCaches) {

  NSMutableArray *clusters = [NSMutableArray array];
  dispatch_async(dispatch_get_global_queue(0, 0), ^{
  ///获取聚合后的标注
  __block NSArray *array = [_clusterManager getClusters:_clusterZoom];

    dispatch_async(dispatch_get_main_queue(), ^{
      for (BMKCluster *item in array) {
        XJClusterAnnotation *annotation = [[XJClusterAnnotation alloc] init];
        annotation.coordinate = item.coordinate;
        annotation.size = item.size;
        annotation.title = item.title;
        annotation.cluster = item.cluster;
        [clusters addObject:annotation];
       }
        [_mapView removeOverlays:_mapView.overlays];
        [_mapView removeAnnotations:_mapView.annotations];
        [_mapView addAnnotations:clusters];

      });
    });
  }
}

demo : https://github.com/SingGitHub/BMKMapClusterView

时间: 2024-10-06 22:24:45

百度点聚合功能,自定义针头功能的相关文章

Android百度地图之自定义绘制功能

我们可以在地图上绘制各种自定义的图形,包括点.折线.圆.多边形等等,尤其绘制点和折线非常实用,点可以用来标识所处的位置,折线可以用来描述走过的轨迹,结合前面GPS定位功能可以做出一些非常有意思的应用,下面应用百度Demo实现绘制的基本功能,代码如下: Activity: package com.home; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.

模块管理常规功能自定义系统的设计与实现(23--二个模块之间的关联[1])

"省"."市"二个模块之间的关联的操作(1) 一. "市"模块定义好了,我们先来新增1个市,看看和"省"的关联操作. 上面显示了"市"的模块界面,在导航栏中为省份的导航,我们看到只有"江苏省"一个,其他的在哪里呢. 一个模块的父模块的导航有一个选项,叫"显示无记录的项目",此选项默认不选中,也就是说省里面还没有市的话,那个省将不放在导航列表中,看下图. 二.记录拖放操

模块管理常规功能自定义系统的设计与实现(24--二个模块之间的关联[2])

父子模块之间关联操作(2) 上一节介绍了子模块中对父模块的一些相关操作.这一节来看看父模块中对子模块可以进行什么样的操作. 一.进入子模块的时候,限定父模块值.选择一个"省"记录,查看省下面的所有市的记录. 在选择了"江苏省"记录之后,按toolbar上面的"市",会进入市模块的界面.(在前一节的基础上,我又给河北省和浙江省增加了市,在下面的界面中将会看不到) 二.加入子模块的记录和聚合字段.上节中介绍了可以将父模块中的字段加入到子模块的grid

模块管理常规功能自定义系统的设计与实现(40--终级阶段 综合查询[7])

综合查询(7)--多个模块的查询 前几节讲的查询都是二个模块之间的,现在看看多模块的查询.其实原理是一样的,先选择字段,设计一个查询方案,把和订单相关的所有模块都选进去. 我又设置了二个条件,设置好后的查询主界面如下: 现在选择基准模块的菜单下有七个模块可供选择.也就是说上面的查询一共选择了七个表的数据. 现在一个个看看结果吧.先选择"订单"作为基准模块. 以客户单位作为基准模块: 再选择客户等级作为基准模块: 这个查询贴一下自动生成的sql 语句: select top 5 '' a

模块管理常规功能自定义系统的设计与实现(38--终级阶段 综合查询[5])

综合查询(5)--基准模块的选择 什么是基准模块,就是你的综合查询要以哪个模块作为查询的主模块,我没想到其他的词,就用这个来表示一下.具体的来说,就是你选择了若干个模块的字段组成了一个查询,你究竞是想展示哪个模块的内容.比如我们前几节的例子中,选择的模块有"订单"和"订单明细",里面有分别以"订单"和"订单明细"作为基准模块的截图.现在来具体讲讲二个父子模块作为基准模块时的不同之处. 1.子模块作为基准模块:这时所有的父模块的

模块管理常规功能自定义系统的设计与实现(39--终级阶段 综合查询[6])

综合查询(6)--不同基准模块下的条件 有了基准模块,又产生了一个问题,你设置查询条件的作用对象可能会随着基准模块的不同而改变.举个例子,当你查询"订单明细"的时候,选择了若干个商品作为查询条件,当基准模块是"订单明细"的时候,一切都没问题,满足你选择的商品的条件才会加到结果集中.但是这时候,你把基准模块改成了"订单",那么这些商品的查询条件就要应用到聚合字段之中. 来看一下演示:先选择二个模块的条件,客户名称和商品,用来限制查询的范围在此二个条

模块管理常规功能自定义系统的设计与实现(32--权限设计[2])

权限设计(2) 二.模块记录的可视权限.通俗的讲哪些记录你能看,哪些记录你不能看,说起来简单,做起来不简单. 先从一个简单的需求说起.对于前面搭建的销售系统如果由一个内勤来处理所有的合同,那么就没有权限设计的问题,把内勤的部门加在"销售部"就可以看到销售一.二.三部的所有合同.但是如果每个销售部有单独的内勤来处理自己部门的销售订单,并且互不干扰,就要设计记录的可视权限了.现在系统里内置了部门的权限.例子中的部门结构如下: 部门编码 部门名称 操作所有记录 操作本级 其他 00 公司  

模块管理常规功能自定义系统的设计与实现(34--终级阶段 综合查询[1])

综合查询(1) 前面已经架构好了一个销售管理系统,看看功能也挺多,也基本够用了.但是仔细分析一下就会发现,前面的设计都是属于数据操纵方面的,虽然有导航.筛选功能,但是对于统计分析来说还是远远不够用的.为了能够进行灵活的统计分析和查询,经过多次的改进,生成了我现在的综合查询体系. 整个综合查询体系包括以下几个方面的内容: 1.字段的选择: 2.查询条件的设置: 3.基准模块的选择: 4.聚合字段类型的设置: 5.多级分组的设置: 6.综合查询方案的管理: 7.图表分析: 8.数据导出: 整个综合查

模块管理常规功能自定义系统的设计与实现(36--终级阶段 综合查询[3])

综合查询(3)--查询条件的设置2 不仅仅对于模块才有这样方便的条件选择方式,对模块的字段也可以设置.例如对于"省份"中有个字段是"所属区域",这个字段不是一个manyToOne字段,而是一个字符串字段,里面就是存着"东北地区"."华北地区"等等这样的具体的字符串值.对于这样的字段也很容易将其放在toolbar上供选择.在模块字段中找到"所属区域"这个字段,修改字段的属性,让这个字段可以加到综合查询的too