前言
需要实现员工巡查功能,展示地图,并显示员工当前所在位置。当该员工点击“开始巡查”按钮,则追随其脚步,进行轨迹绘制,直到员工点击“结束巡查”按钮,完成轨迹的绘制,并截图上传至后台。
注册和获取百度地图的秘钥
引入第三方库
pod 'BMKLocationKit'
pod 'BaiduMapKit'
//引入base相关所有的头文件
#import <BaiduMapAPI_Base/BMKBaseComponent.h>
//引入地图功能所有的头文件
#import <BaiduMapAPI_Map/BMKMapComponent.h>
@interface RouteViewController ()<BMKMapViewDelegate, BMKLocationManagerDelegate>
@end
地图设置
#pragma mark - 地图懒加载
-(BMKMapView *)mapView
{
if (!_mapView) {
_mapView = [[BMKMapView alloc] initWithFrame:CGRectMake(0, kTopHeight, KScreenWidth, KScreenHeight-kTopHeight-100)];
//地图放缩大小,4-21
_mapView.zoomLevel = 17;
//定位模式,定位跟随模式才会有个箭头跟着人走,罗盘的话会有一个圈圈
_mapView.userTrackingMode = BMKUserTrackingModeFollow;
//设定地图View能否支持所有手势操作
_mapView.gesturesEnabled= YES;
_mapView.delegate= self;
//是否显示定位图层,默认为NO,则不显示跟着人走的箭头。
_mapView.showsUserLocation = YES;
//此类表示定位图层自定义样式参数
BMKLocationViewDisplayParam *param = [[BMKLocationViewDisplayParam alloc] init];
//不显示定位图层的圈圈
param.isAccuracyCircleShow = NO;
[_mapView updateLocationViewWithParam:param];
//设置地图模式为标准地图
[_mapView setMapType:BMKMapTypeStandard];
}
return _mapView;
}
定位设置
#pragma mark - 设置locationManager,定位到当前位置
-(void)setupLocationManager
{
//初始化实例
self.locationManager = [[BMKLocationManager alloc] init];
self.locationManager.delegate = self;
//设置返回位置的坐标系类型
self.locationManager.coordinateType = BMKLocationCoordinateTypeBMK09LL;
//设置距离过滤参数,超过10米才更新位置参数
self.locationManager.distanceFilter = 10;
//设置预期精度参数
self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
//设置应用位置类型
self.locationManager.activityType = CLActivityTypeAutomotiveNavigation;
//设置是否自动停止位置更新
self.locationManager.pausesLocationUpdatesAutomatically = NO;
//设置是否允许后台定位
self.locationManager.allowsBackgroundLocationUpdates = YES;
//设置位置获取超时时间
self.locationManager.locationTimeout = 10;
//设置获取地址信息超时时间
self.locationManager.reGeocodeTimeout = 10;
[self.locationManager startUpdatingHeading];
//打开这个才能在地图加载后定位到当前位置,不然坐标点箭头会跑到几内亚湾去
[self.locationManager startUpdatingLocation];
}
定位代理
-(void)BMKLocationManager:(BMKLocationManager *)manager didUpdateHeading:(CLHeading *)heading
{
if (!heading) {
return;
}
if (!self.userLocation) {
self.userLocation = [[BMKUserLocation alloc] init];
}
self.userLocation.heading = heading;
[self.mapView updateLocationData:self.userLocation];
}
-(void)BMKLocationManager:(BMKLocationManager *)manager didUpdateLocation:(BMKLocation *)location orError:(NSError *)error
{
if (error) {
NSLog(@"locError:{%ld - %@};", (long)error.code, error.localizedDescription);
}
if (!location) {
return ;
}
if (!self.userLocation) {
self.userLocation = [[BMKUserLocation alloc] init];
}
self.userLocation.location = location.location;
[self.mapView updateLocationData:self.userLocation];
//设置一个开始绘制轨迹的flag,当flag为真的时候,开始绘制轨迹,在此处写代码来绘制
}
地图代理
#pragma mark - 添加线图
-(BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<BMKOverlay>)overlay
{
if ([overlay isKindOfClass:[BMKPolyline class]]) {
BMKPolylineView *polylineView = [[BMKPolylineView alloc] initWithOverlay:overlay];
polylineView.strokeColor = CSecondaryColor;
polylineView.lineWidth = 2.0;
return polylineView;
}
return nil;
}
#pragma mark - 添加完线图
-(void)mapView:(BMKMapView *)mapView didAddOverlayViews:(NSArray *)overlayViews
{
//每次添加完线图,把地图的中心设置成起始点和当前位置点的中点
CLLocationDegrees longitude = (self.startLocation.location.coordinate.longitude + self.userLocation.location.coordinate.longitude)/2;
CLLocationDegrees latitude = (self.startLocation.location.coordinate.latitude + self.userLocation.location.coordinate.latitude)/2;
_mapView.centerCoordinate = CLLocationCoordinate2DMake(latitude, longitude);
}
自定义Annotation
-(BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation
{
if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {
static NSString *reuseID = @"anotationReuseIndetifier";
BMKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:reuseID];
if (annotationView == nil) {
annotationView = [[BMKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseID];
}
UILabel *lblStart = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
if (!self.isStartTrace) {
lblStart.text = @"始";
}
else{
lblStart.text = @"终";
}
lblStart.backgroundColor = CSecondaryColor;
lblStart.font = [UIFont systemFontOfSize:14.0];
lblStart.textAlignment = NSTextAlignmentCenter;
lblStart.textColor = [UIColor whiteColor];
lblStart.layer.cornerRadius = 15;
lblStart.layer.borderWidth = 1;
lblStart.layer.masksToBounds = YES;
lblStart.layer.borderColor = [UIColor darkGrayColor].CGColor;
[annotationView addSubview:lblStart];
return annotationView;
}
return nil;
}