iOS实现百度地图定位签到功能

写在前面:

项目需求用到这个功能,主要目的是实现老师设置位置签到范围,学生在一定范围内进行签到的功能。

功能如下方截图:


屏幕快照 2019-01-28 上午10.29.26.png

简要介绍:

下面记录一下主要的实现流程,功能的实现主要是根据百度地图开发者官网提供的api文档,各项功能之间组合。百度地图的SDK现在分成了地图功能和定位功能两块不同的SDK,BaiduMapAPI这个是基础的地图功能,BMKLocationKit这个是定位功能。项目里实现定位签到功能用的的SDK包括上面说的这两个模块,所以在用cocopods引入framework的时候,需要引入: #百度地图 pod 'BMKLocationKit' pod 'BaiduMapKit'

功能实现

一、在APPdelegate.m文件中引入:

#import <BaiduMapAPI_Base/BMKBaseComponent.h>
#import <BMKLocationKit/BMKLocationComponent.h>

加入功能代码:

#pragma mark 百度地图设置
- (void)configBaiduMap {
 NSString *ak = @"xxxx";
 BMKMapManager *mapManager = [[BMKMapManager alloc] init];
 self.mapManager = mapManager;
 BOOL ret = [mapManager start:ak generalDelegate:nil];
 [[BMKLocationAuth sharedInstance] checkPermisionWithKey:ak authDelegate:self];
 if (!ret) {
  NSLog(@"manager start failed!");
 }
}

二、在用到地图定位功能的viewController中

#import <BMKLocationKit/BMKLocationComponent.h>
#import <BaiduMapAPI_Base/BMKBaseComponent.h>//引入base相关所有的头文件
#import <BaiduMapAPI_Map/BMKMapComponent.h>//引入地图功能所有的头文件

遵循协议<BMKMapViewDelegate,BMKLocationManagerDelegate>

声明全局变量

@property (nonatomic, strong) BMKUserLocation *userLocation; //当前位置对象
@property (nonatomic, strong) BMKLocationManager *locationManager;/** locationManager*/
@property (nonatomic, strong) BMKMapView *mapView;/** 百度地图*/
//@property (nonatomic, strong) BMKPointAnnotation* annotation ;/** 标记*/
@property (nonatomic, strong) NSMutableArray *annotationArr;/** 标记数组*/
@property (nonatomic, strong) NSMutableArray *circleArr;/** 圆形数组*/

地图SDK文档中建议在以下代码中如此设置, 目的是控制内存

- (void)viewWillAppear:(BOOL)animated {
 [super viewWillAppear:animated];
 [_mapView viewWillAppear];
 _mapView.delegate = self;
}

- (void)viewWillDisappear:(BOOL)animated {
 [super viewWillDisappear:animated];
 [_mapView viewWillDisappear];
 _mapView.delegate = nil;
}

- (void)dealloc {
 if (_mapView) {
  _mapView = nil;
 }
}

初始化数组,这两个数组在接下来会用到

- (NSMutableArray *)annotationArr {

 if (!_annotationArr) {
  _annotationArr = [NSMutableArray array];
 }
 return _annotationArr;
}

- (NSMutableArray *)circleArr {
 if (!_circleArr) {
  _circleArr = [NSMutableArray array];
 }
 return _circleArr;
}

添加地图view

#pragma mark 添加地图
- (void)addSignMapBgView {
 if (!self.mapBgView) {
  UIView *mapBgView = [UIView new];
  self.mapBgView = mapBgView;
  mapBgView.backgroundColor = [CommUtls colorWithHexString:APP_BgColor];
  [self addSubview:mapBgView];
  [mapBgView makeConstraints:^(MASConstraintMaker *make) {
   make.top.equalTo(self.tipView.bottom);
   make.left.right.bottom.equalTo(0);
  }];

  _mapView = [[BMKMapView alloc] initWithFrame:CGRectZero];
//  _mapView.delegate = self;
  [_mapView setZoomLevel:21];//精确到5米
  _mapView.showsUserLocation = YES;//显示定位图层
  [mapBgView addSubview:_mapView];
  [_mapView makeConstraints:^(MASConstraintMaker *make) {
   make.edges.equalTo(0);
  }];
  _mapView.userTrackingMode = BMKUserTrackingModeNone;

 }
}

初始化地图定位:这里我用的是一次定位而没有选择持续定位。

#pragma mark 初始化locationManager
- (void)initUserLocationManager {
 //因为mapView是在一个分离出来的view中创建的,所以在这里将signSetTypeView中的mapView赋给当前viewcontroller的mapView;
 self.mapView = self.mainView.signSetTypeView.mapView;
 self.mapView.delegate = self;
// self.annotation = [[BMKPointAnnotation alloc] init];

 // self.mapView是BMKMapView对象
 //精度圈设置
 BMKLocationViewDisplayParam *param = [[BMKLocationViewDisplayParam alloc] init];
 //设置显示精度圈,默认YES
 param.isAccuracyCircleShow = YES;
 //精度圈 边框颜色
 param.accuracyCircleStrokeColor = [UIColor colorWithRed:242/255.0 green:129/255.0 blue:126/255.0 alpha:1];
 //精度圈 填充颜色
 param.accuracyCircleFillColor = [UIColor colorWithRed:242/255.0 green:129/255.0 blue:126/255.0 alpha:0.3];
 [self.mapView updateLocationViewWithParam:param];

 self.userLocation = [[BMKUserLocation alloc] init];
 //初始化实例
 _locationManager = [[BMKLocationManager alloc] init];
 //设置delegate
 _locationManager.delegate = self;
 //设置返回位置的坐标系类型
 _locationManager.coordinateType = BMKLocationCoordinateTypeBMK09LL;
 //设置距离过滤参数
 _locationManager.distanceFilter = kCLDistanceFilterNone;
 //设置预期精度参数
 _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
 //设置应用位置类型
 _locationManager.activityType = CLActivityTypeAutomotiveNavigation;
 //设置是否自动停止位置更新
 _locationManager.pausesLocationUpdatesAutomatically = NO;
 //设置是否允许后台定位
 //_locationManager.allowsBackgroundLocationUpdates = YES;
 //设置位置获取超时时间
 _locationManager.locationTimeout = 15;
 //设置获取地址信息超时时间
 _locationManager.reGeocodeTimeout = 15;
 //请求一次定位
 [self requestLocation];
}

请求定位,获取经纬度

#pragma mark 请求定位
- (void)requestLocation {

 [_locationManager requestLocationWithReGeocode:YES withNetworkState:YES completionBlock:^(BMKLocation * _Nullable location, BMKLocationNetworkState state, NSError * _Nullable error) {
  if (error)
  {
   NSLog(@"locError:{%ld - %@};", (long)error.code, error.localizedDescription);
  }
  if (location) {//得到定位信息,添加annotation

   if (location.location) {
    NSLog(@"LOC = %@",location.location);
   }
   if (location.rgcData) {
    NSLog(@"rgc = %@",[location.rgcData description]);
   }

   if (!location) {
    return;
   }
   if (!self.userLocation) {
    self.userLocation = [[BMKUserLocation alloc] init];
   }
   self.userLocation.location = location.location;
   [self.mapView updateLocationData:self.userLocation];
   CLLocationCoordinate2D mycoordinate = location.location.coordinate;
   self.mapView.centerCoordinate = mycoordinate;

   //赋予初始值
   self.viewModel.lat = [NSString stringWithFormat:@"%f", location.location.coordinate.latitude];
   self.viewModel.lng = [NSString stringWithFormat:@"%f",location.location.coordinate.longitude];
   self.viewModel.radius = @"50";

   //打印经纬度
   NSLog(@"didUpdateUserLocation lat %f,long %f",location.location.coordinate.latitude,location.location.coordinate.longitude);
  }
  NSLog(@"netstate = %d",state);
 }];
}

地图长按选点功能实现:

//长按地图选点
- (void)mapview:(BMKMapView *)mapView onLongClick:(CLLocationCoordinate2D)coordinate {

 if (self.annotationArr.count > 0) {
  [mapView removeAnnotations:self.annotationArr];
  [self.annotationArr removeAllObjects];

  BMKPointAnnotation *annotation = [[BMKPointAnnotation alloc]init];
  annotation.coordinate = coordinate;
  [self.annotationArr addObject:annotation];
  [mapView addAnnotations:self.annotationArr];
 } else {
  BMKPointAnnotation *annotation = [[BMKPointAnnotation alloc]init];
  annotation.coordinate = coordinate;
  [self.annotationArr addObject:annotation];
  [mapView addAnnotations:self.annotationArr];
 }
 //弹出半径选择框
 [self showLocationSelectRadiusViewWithCoordinate:coordinate];
}

选点后弹出选择定位范围弹框

#pragma mark 弹出位置弹框
- (void)showLocationSelectRadiusViewWithCoordinate:(CLLocationCoordinate2D)coordinate {
 ExtraActLocationSignPopView *popView = [ExtraActLocationSignPopView new];
 [popView show];
 @weakify(self);
 [popView.locatioonSureSignal subscribeNext:^(NSString *x) {
  @strongify(self);
  self.viewModel.radius = x;
  CGFloat radius = [x floatValue];
  [self circleWithCenterWithCoordinate2D:coordinate radius:radius];
 }];
}

设置好定位点以及半径范围后绘制范围圈,开始的时候声明的circleArr在这里用来盛放添加的区域圆形,在添加新的圆圈的时候,将之前旧的移除,保证每次绘制的范围都是最新的,同理annotationArr也是这个功能,因为API有提供的- (void)addOverlays:(NSArray *)overlays;这个方法:/** *向地图窗口添加一组Overlay,需要实现BMKMapViewDelegate的-mapView:viewForOverlay:函数来生成标注对应的View *@param overlays 要添加的overlay数组 */

#pragma mark 添加区域圆形覆盖
- (void)circleWithCenterWithCoordinate2D:(CLLocationCoordinate2D )coor radius:(CGFloat)radius {

 NSLog(@"coordinate lat %f,long %f",coor.latitude,coor.longitude);
 //赋予点击选点值
 self.viewModel.lat = [NSString stringWithFormat:@"%f", coor.latitude];
 self.viewModel.lng = [NSString stringWithFormat:@"%f",coor.longitude];

 if (self.circleArr.count > 0) {
  [_mapView removeOverlays:self.circleArr];
  [self.circleArr removeAllObjects];

  BMKCircle *circle = [BMKCircle circleWithCenterCoordinate:coor radius:radius];
  [self.circleArr addObject:circle];
  [_mapView addOverlays:self.circleArr];
 } else {
  BMKCircle *circle = [BMKCircle circleWithCenterCoordinate:coor radius:radius];
  [self.circleArr addObject:circle];
  [_mapView addOverlays:self.circleArr];
 }
}

#pragma mark 重绘overlay
- (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay{
 if ([overlay isKindOfClass:[BMKCircle class]]){
  BMKCircleView* circleView = [[BMKCircleView alloc] initWithOverlay:overlay];
  circleView.fillColor = [UIColor colorWithRed:33/255.0 green:196/255.0 blue:206/255.0 alpha:0.3];
  circleView.strokeColor = [UIColor colorWithRed:33/255.0 green:196/255.0 blue:206/255.0 alpha:1];
  circleView.lineWidth = 1.0;
  return circleView;
 }
 return nil;
}

至此,在地图上选点进行签到功能基本实现,另外,关于 自定义的范围圆圈的颜色,边框大小都是可以自定义的,选点的标记也是可以自定义的,官方文档有说明

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • ios百度地图的使用(普通定位、反地理编码)

    iOS定位 - 普通定位(没有地图) - 反地理编码(得到具体位置),下面通过代码给大家详解,代码如下: #import <CoreLocation/CoreLocation.h> 使用到的头文件 要引入CoreLocation这个包 <CLLocationManagerDelegate> 使用的代理名称 //1.使用定位服务 //设置app有访问定位服务的权限 //在使用应用期间 / 始终(app在后台) //info.plist文件添加以下两条(或者其中一条): //NSLoc

  • IOS实现百度地图自定义大头针和气泡样式

    一.自定义大头针和气泡 // 根据anntation生成对应的View - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation { NSString *AnnotationViewID = [NSString stringWithFormat:@"renameMark%d",i]; newAnnotation = [[BMKPi

  • iOS实现百度地图拖拽后更新位置以及反编码

    前言 最近在开发中遇到了百度地图的开发,功能类似于微信中的发送位置,拖拽从新定位,以及反编码,列表附近的位置.分析出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 效果图: 百度地图拖拽更新位置.gif 实现思路 思路就是将一个UIImageView固定在地图中间,每次更新位置,给UIImageView添加动画即可. 代码如下: #import "FTBasicController.h" typedef void (^SelectBlock) (NSString *addr

  • IOS百度地图导航开发功能实现简述

    以下通过图文并茂的方式给大家讲述百度地图导航开发功能: 第一步:在使用百度导航之前,我们需要在百度地图开放平台上下载导航的 SDK,共85.8M,网速不好的同学可提前准备好. 第二步:引入导航所需的系统包 将AudioToolbox.framework.ImageIO.framework.CoreMotion.framework.CoreLocation.framework.CoreTelephony.framework.MediaPlayer.framework.AVFoundation.fr

  • iOS百度地图简单使用详解

    百度地图 iOS SDK是一套基于iOS 5.0及以上版本设备的应用程序接口,不仅提供展示地图的基本接口,还提供POI检索.路径规划.地图标注.离线地图.定位.周边雷达等丰富的LBS能力 . 今天主要介绍以下接口 基础地图 POI检索 定位 首先配置环境 1.自动配置.framework形式开发包(使用CocoaPods)<推荐> 2.手动配置.framework形式开发包 特别注意: (API里有很多注意点,大家可以具体去看.但是我说的后两点少其中一个都会失败,第一点是有需求的话,必须加上)

  • iOS实现百度地图定位签到功能

    写在前面: 项目需求用到这个功能,主要目的是实现老师设置位置签到范围,学生在一定范围内进行签到的功能. 功能如下方截图: 屏幕快照 2019-01-28 上午10.29.26.png 简要介绍: 下面记录一下主要的实现流程,功能的实现主要是根据百度地图开发者官网提供的api文档,各项功能之间组合.百度地图的SDK现在分成了地图功能和定位功能两块不同的SDK,BaiduMapAPI这个是基础的地图功能,BMKLocationKit这个是定位功能.项目里实现定位签到功能用的的SDK包括上面说的这两个

  • Android项目实战之百度地图地点签到功能

    前言:先写个简单的地点签到功能,如果日后有时间细写的话,会更加好好研究一下百度地图api,做更多逻辑判断. 这里主要是调用百度地图中的场景定位中的签到场景.通过官方文档进行api集成.通过GPS的定位功能,获取地理位置,时间,用户名进行存储.之后通过日历显示历史签到记录. 效果图: /**百度地图sdk**/ implementation files('libs/BaiduLBS_Android.jar') /**日历选择器**/ implementation 'com.prolificinte

  • Android 百度地图定位实现仿钉钉签到打卡功能的完整代码

    导语 本章根据百度地图API,实现仿钉钉打卡功能.用到了基础地图.覆盖物.定位图层.陀螺仪方法.悬浮信息弹框. 百度地图API地址  :Android 地图SDK 请先注册注册百度账号和获取密钥,并实现地图显示出来.(注意:密钥.权限要设置) 另外,我得说明本章所下载官方Demo 和 导入的jar包和so文件.自定义下载即可,如下图: 接下来,一起看实现效果. 源码Git地址:BaiduMapApp 效果图 实现代码·三步骤 第一步:基础地图和方向传感器 类先实现方向传感器 implements

  • vue中百度地图定位及附近搜索功能使用步骤

    目录 1.地图初始化相关 2.获取当前定位 3.根据当前定位地址附近搜索建议 1.地图初始化相关 文档:lbs.baidu.com/index.php?t… 申请账号 => 创建应用 => 生成key值 => 引入百度地图,替换key值 在出口html(public/html)文件下引入标签 <script type="text/javascript" src="https://api.map.baidu.com/api?v=1.0&&

  • Android 百度地图POI搜索功能实例代码

    在没介绍正文之前先给大家说下poi是什么意思. 由于工作的关系,经常在文件中会看到POI这三个字母的缩写,但是一直对POI的概念和含义没有很详细的去研究其背后代表的意思.今天下班之前,又看到了POI这三个字母,决定认认真真的搜索一些POI具体的含义. POI是英文的缩写,原来的单词是point of interest, 直译成中文就是兴趣点的意思.兴趣点这个词最早来自于导航地图厂商.地图厂商为了提供尽可能多的位置信息,花费了很大的精力去寻找诸如加油站,餐馆,酒店,景点等目的地,这些目的地其实都可

  • Android百度地图定位后获取周边位置的实现代码

    本文实例讲解Android百度地图定位后获取周边位置的实现代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: 1.布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical&q

  • 微信企业号开发之微信考勤百度地图定位

    之前在微信企业号开发:微信考勤中使用了百度地图的定位组件,但发现在部分手机上会出现定位失败的提示,于是有研究了一下百度地图.原来使用的Web组件百度不打算更新了,也是重新查了一下百度地图的其他API,还有一个JavaScript API大众版,于是试了试,没想到竟然解决了. 核心代码很简单: <div id="allmap"></div> <script type="text/javascript" src="http://a

  • js调用百度地图及调用百度地图的搜索功能

    js调用百度地图的方法 代码如下: <!DOCTYPE html> <html> <head> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&

随机推荐