iOS开发之在地图上绘制出你运行的轨迹
iOS中的MapKit集成了google地图api的很多功能加上iOS的定位的功能,我们就可以实现将你运行的轨迹绘制到地图上面。这个功能非常有 用,比如汽车的gprs追踪、人员追踪、快递追踪等等。这篇文章我们将使用Map Kit和iOS的定位功能,将你的运行轨迹绘制在地图上面。
实现
在之前的一篇文章:iOS开发之在google地图上显示自己的位置中描述了如何在地图上显示自己的位置,如果我们将这些位置先保存起来,然后串联起来绘制到地图上面,那就是我们的运行轨迹了。
首先我们看下如何在地图上绘制曲线。在Map Kit中提供了一个叫MKPolyline的类,我们可以利用它来绘制曲线,先看个简单的例子。
使用下面代码从一个文件中读取出经纬度,然后创建一个路径:MKPolyline实例。
-(void) loadRoute{NSString* filePath = [[NSBundle mainBundle] pathForResource:@”route” ofType:@”csv”];NSString* fileContents = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];NSArray* pointStrings = [fileContents componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; // while we create the route points, we will also be calculating the bounding box of our route// so we can easily zoom in on it.MKMapPoint northEastPoint;MKMapPoint southWestPoint; // create a c array of points.MKMapPoint* pointArr = malloc(sizeof(CLLocationCoordinate2D) * pointStrings.count); for(int idx = 0; idx < pointStrings.count; idx++){// break the string down even further to latitude and longitude fields.NSString* currentPointString = [pointStrings objectAtIndex:idx];NSArray* latLonArr = [currentPointString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]]; CLLocationDegrees latitude = [[latLonArr objectAtIndex:0] doubleValue];CLLocationDegrees longitude = [[latLonArr objectAtIndex:1] doubleValue]; // create our coordinate and add it to the correct spot in the arrayCLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude); MKMapPoint point = MKMapPointForCoordinate(coordinate); //// adjust the bounding box// // if it is the first point, just use them, since we have nothing to compare to yet.if (idx == 0) {northEastPoint = point;southWestPoint = point;}else{if (point.x > northEastPoint.x)northEastPoint.x = point.x;if(point.y > northEastPoint.y)northEastPoint.y = point.y;if (point.x < southWestPoint.x)southWestPoint.x = point.x;if (point.y < southWestPoint.y)southWestPoint.y = point.y;} pointArr[idx] = point; } // create the polyline based on the array of points.self.routeLine = [MKPolyline polylineWithPoints:pointArr count:pointStrings.count]; _routeRect = MKMapRectMake(southWestPoint.x, southWestPoint.y, northEastPoint.x -southWestPoint.x, northEastPoint.y - southWestPoint.y); // clear the memory allocated earlier for the pointsfree(pointArr); }
将这个路径MKPolyline对象添加到地图上
[self.mapView addOverlay:self.routeLine];
显示在地图上:
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id )overlay{MKOverlayView* overlayView = nil; if(overlay == self.routeLine){//if we have not yet created an overlay view for this overlay, create it now.if(nil == self.routeLineView){self.routeLineView = [[[MKPolylineView alloc] initWithPolyline:self.routeLine] autorelease];self.routeLineView.fillColor = [UIColor redColor];self.routeLineView.strokeColor = [UIColor redColor];self.routeLineView.lineWidth = 3;} overlayView = self.routeLineView; } return overlayView; }
看下从文件中读取数据绘制的轨迹路径效果:
然后我们在从文件中读取位置的方法改成从用gprs等方法获取当前位置。
- (void)viewDidLoad {[super viewDidLoad]; noUpdates = 0;locations = [[NSMutableArray alloc] init]; locationMgr = [[CLLocationManager alloc] init];locationMgr.delegate = self;locationMgr.desiredAccuracy =kCLLocationAccuracyBest;locationMgr.distanceFilter = 1.0f;[locationMgr startUpdatingLocation]; }
上面的代码我定义了一个数组,用于保存运行轨迹的经纬度。
每次通知更新当前位置的时候,我们将当前位置的经纬度放到这个数组中,并重新绘制路径,代码如下:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{noUpdates++; [locations addObject: [NSString stringWithFormat:@"%f,%f",[newLocation coordinate].latitude, [newLocation coordinate].longitude]]; [self updateLocation];if (self.routeLine!=nil) {self.routeLine =nil;}if(self.routeLine!=nil)[self.mapView removeOverlay:self.routeLine];self.routeLine =nil;// create the overlay[self loadRoute]; // add the overlay to the mapif (nil != self.routeLine) {[self.mapView addOverlay:self.routeLine];} // zoom in on the route. [self zoomInOnRoute]; }
我们将前面从文件获取经纬度创建轨迹的代码修改成从这个数组中取值就行了:
// creates the route (MKPolyline) overlay-(void) loadRoute{ // while we create the route points, we will also be calculating the bounding box of our route// so we can easily zoom in on it. MKMapPoint northEastPoint; MKMapPoint southWestPoint; // create a c array of points. MKMapPoint* pointArr = malloc(sizeof(CLLocationCoordinate2D) * locations.count);for(int idx = 0; idx < locations.count; idx++){// break the string down even further to latitude and longitude fields. NSString* currentPointString = [locations objectAtIndex:idx];NSArray* latLonArr = [currentPointString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]]; CLLocationDegrees latitude = [[latLonArr objectAtIndex:0] doubleValue];CLLocationDegrees longitude = [[latLonArr objectAtIndex:1] doubleValue]; CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude); MKMapPoint point = MKMapPointForCoordinate(coordinate); if (idx == 0) {northEastPoint = point;southWestPoint = point;}else {if (point.x > northEastPoint.x) northEastPoint.x = point.x;if(point.y > northEastPoint.y)northEastPoint.y = point.y;if (point.x < southWestPoint.x) southWestPoint.x = point.x;if (point.y < southWestPoint.y) southWestPoint.y = point.y;} pointArr[idx] = point; } self.routeLine = [MKPolyline polylineWithPoints:pointArr count:locations.count]; _routeRect = MKMapRectMake(southWestPoint.x, southWestPoint.y, northEastPoint.x -southWestPoint.x, northEastPoint.y - southWestPoint.y); free(pointArr); }
这样我们就将我们运行得轨迹绘制google地图上面了。
扩展:
如果你想使用其他的地图,比如百度地图,其实也很方便。可以将百度地图放置到UIWebView中间,通过iOS开发之Objective-C与JavaScript的交互 这篇文章的方法,用js去绘制轨迹。
转载于:https://www.cnblogs.com/DamonTang/archive/2012/07/12/2588254.html
iOS开发之在地图上绘制出你运行的轨迹相关推荐
- iOS开发之在地图上绘制出你运动的轨迹
iOS中的MapKit集成了google地图api的很多功能加上iOS的定位的功能,我们就可以实现将你运行的轨迹绘制到地图上面.这个功能非常有用,比如快递追踪.汽车的gprs追踪.人员追踪等等.这篇文 ...
- iOS 在地图上绘制出你运动的轨迹
iOS中的MapKit集成了google地图api的很多功能加上iOS的定位的功能,我们就可以实现将你运行的轨迹绘制到地图上面.这个功能非常有用,比如快递追踪.汽车的gprs追踪.人员追踪等等.这篇文 ...
- 高德地图Web端JavaScript API开发(二)---在地图上绘制(点标注)
使用高德地图在很多时候需要在地图上标记位置,并且很多时候需要用到自定义的图标去完成这种位置的标记. 当然,这些功能高德地图都为我们准备了,比如常用的地图覆盖物Marker和信息窗体等.这里就先说一下点 ...
- android集成百度地图 驾车路线规划 并在地图上绘制出路线
1. 设置路线规划监听 mSearch.setOnGetRoutePlanResultListener(getRoutePlanListener);//设置路线规划监听 2.初始化路线监听器 /*路 ...
- java echarts 散点图,echarts在地图上绘制散点图(任意点)
项目需求:在省份地图上绘制散点图,散点位置不一定是哪个城市或哪个区县,即任意点 通过查询官网文档,找到一个与需求类似的Demo:https://www.echartsjs.com/gallery/ed ...
- iOS 在地图上绘制运动轨迹
iOS中的MapKit集成了google地图api的很多功能加上iOS的定位的功能,我们就可以实现将你运行的轨迹绘制到地图上面.这个功能非常有用,比如快递追踪.汽车的gprs追踪.人员追踪等等.这篇文 ...
- android地图画线,绘制折线-在地图上绘制-开发指南-Android 轻量版地图SDK | 高德地图API...
地图上绘制的线是由 Polyline 类定义实现的,线由一组经纬度(LatLng对象)点连接而成. 绘制一条线 与点标记一样,Polyine的属性操作集中在PolylineOptions类中,添加一条 ...
- 【IOS开发高级系列】异步绘制专题
1 图片处理 1.1 编辑图片的几个方法 第一种 先用UIImage对象加载一张图片 然后转化成CGImageRef放到CGContext中去编辑 第二种 用CGImageCreate函数创建CGIm ...
- iOS开发之百度地图的简单集成——标注POI检索
iOS开发之百度地图的简单集成--标注&POI检索 .h文件 // Created by XK_Recollection on 16/6/15. // Copyright © 2016年 GN ...
最新文章
- feign 第一次调用超时_Feign ,3步搞定 HTTP 请求
- 单防区扩展模块怎么用_Zens推出模块化可扩展无线充电器 可为6台设备同时供电...
- CRUD-员工列表 大体流程
- CentOS中怎样安装、配置、启动Nginx
- jQuery获取iframe的document对象的方法
- live555 源码分析:简介
- VS 2019 要来了,是时候了解一下 C# 8.0 新功能
- linux连接建立的时间,用timedatectl在Linux中检查当前时区及更改时区(创建符号链接来更改时区)...
- PoE交换机的选择和使用注意事项介绍
- Webpack构建性能优化指南
- 分久必合的Lindorm传奇
- 优秀的代码原来是这样分层的
- linux 日志定时轮询流程详解(logrotate)
- shell中日期的使用当前日期的加减
- 让FLASH背景透明-可运用于在网页内的FLASH内嵌入另一个网页
- 怎么把图片上的字去掉_视频片头怎么减掉,电脑如何剪切掉视频的开头「视频批量剪辑」...
- SQL中Left Join 与Right Join 与 Inner Join 与 Full Join的区别
- Windows下实现gettimeofday()函数
- Windows系统经典高级技巧分享
- P2906 [USACO08OPEN]牛的街区Cow Neighborhoods