基于iOS使用百度地图绘制轨迹的应用分析
2020-11-30曹琴
曹琴
摘 要:在进行iOS开发时经常会碰到需要使用地图的问题,其中使用频率较高的是百度地图。本文就如何用百度地图实现绘制轨迹的问题进行了探讨。
关键词:iOS Objective-C 百度地图 绘制轨迹
中图分类号:G202 文献标识码:A 文章编号:1003-9082(2020)10-000-01
iOS项目需要使用百度地图实现员工巡查功能,展示地图,并显示员工当前所在位置。当该员工点击“开始巡查”按钮,则追随其脚步,进行轨迹绘制,直到员工点击“结束巡查”按钮,完成轨迹的绘制,并截图上传至后台。
路线绘制完毕的时候,不能截取到完整的“起点”+“终点”图片,即使在截图之前将地图的centerCoordinate设置成中点,然后设置2s延时后再截图,也还是只能截取到以终点为中点的图片。并不是设置center无效,而是地图会闪一下中点的位置,然后还是回归到终点的位置,最后才截图。但是,当地图加载后,人为地拉动一下地图,那么在截图的时候,可以设置终点成功,并截取到完整的图片。
解决办法,如此设置:_mapView.showsUserLocation = NO。 这样的话,就需要自己实现定位图片的一些功能,譬如箭头图标;设备运动方向变化的时候,箭头要跟着指向前进的方向;还有就是随着定位的变化而变化位置。
以下是关键代码:
#pragma mark - update location
-(void)BMKLocationManager:(BMKLocationManager *)manager didUpdateLocation:(BMKLocation *)location orError:(NSError *)error{ if(self.isStartTrace) { //构建分段颜色索引数组
BMKPolyline *polyline = [BMKPolyline polylineWithCoordinates:coords count:2]; [self.mapView addOverlay:polyline]; [self.points addObject:location]; self.firstLocation = [self.userLocation copy];}}
#pragma mark - 绘制轨迹点
-(void)drawTrackWithPoints:(NSArray *)points{ CLLocationCoordinate2D coors[points.count]; NSInteger cnt = 0; for (size_t i = 0; i < points.count; i++) { CLLocationCoordinate2D p = CLLocationCoordinate2DMake(((BMKLocation *)points[i]).location.coordinate.latitude, ((BMKLocation *)points[i]).location.coordinate.longitude); coors[i] = p; cnt++; }
BMKPolyline *line = [BMKPolyline polylineWithCoordinates:coors count:cnt];
BMKPointAnnotation *startAnnotation = [[BMKPointAnnotation alloc] init]; //起点annotation
BMKPointAnnotation *endAnnotation = [[BMKPointAnnotation alloc] init]; //终点annotation
dispatch_async(MAIN_QUEUE, ^{ [self.mapView addOverlay:line]; [self.mapView addAnnotation:startAnnotation]; [self.mapView addAnnotation:endAnnotation]; });}
#pragma mark - 设置起点、终点和当前点样式
-(BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id
if ([annotation.title isEqualToString:kStartPositionTitle]) {
view = [mapView dequeueReusableAnnotationViewWithIdentifier: @"startAnnotationID"];
if (view == nil) { view = [[BMKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:startViewID]; UILabel *lbl = [self createLabel:@"始"]; [view addSubview:lbl];}
}else if([annotation.title isEqualToString:kEndPositionTitle]){ UILabel *lbl = [self createLabel:@"终"];}else if([annotation.title isEqualToString:kArrowTitle]){ imageView.image = [UIImage imageNamed:@"sportArrow.png"]; return view;}
-(UILabel *)createLabel:(NSString *)text{
//label的frame x, y需要設置成-15,不然“始”会有一截没有连线的空格
UILabel *lblStart = [[UILabel alloc] initWithFrame:CGRectMake(-15, -15, 30, 30)]; }
-(void)mapViewFitForCoordinates:(NSArray *)points{
CLLocationCoordinate2D center = CLLocationCoordinate2DMake((minLat+maxLat)*0.5, (minLon+maxLon)*0.5); span.latitudeDelta = 1.2 * ((maxLat-minLat)+0.01); span.longitudeDelta = 1.2 * ((maxLon - minLon)+0.01); }
结语
移动端使用地图来定位、获取轨迹等功能已经成为人们生活中必不可少的一部分,极大地方便了人们进行地理定位、导航等。就本文而言,有助于初次开发者在自己的iOS端APP中嵌入百度地图,掌握它的绘制简单轨迹的基本用法,从而为开发出与地图相关的应用打下基础。
参考文献
[1]刘春林,张翠翠.基于iOS的地图类APP的开发应用研究——以百度地图为例[J].无线互联科技,2018,15(23):46-47.
[2]林志伟,杨昱昺.基于Android系统的电子地图运动轨迹绘制的研究与实现[J].科技创新与应用,2014(17):20-21.