iOS开发之在地图上绘制出你运行的轨迹

首先我们看下如何在地图上绘制曲线。在Map Kit中提供了一个叫MKPolyline的类,我们可以利用它来绘制曲线,先看个简单的例子。

使用下面代码从一个文件中读取出经纬度,然后创建一个路径:MKPolyline实例。


 1 -(void) loadRoute
2 {
3 NSString* filePath = [[NSBundle mainBundle] pathForResource:@”route” ofType:@”csv”];
4 NSString* fileContents = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
5 NSArray* pointStrings = [fileContents componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
6
7 // while we create the route points, we will also be calculating the bounding box of our route
8 // so we can easily zoom in on it.
9 MKMapPoint northEastPoint;
10 MKMapPoint southWestPoint;
11
12 // create a c array of points.
13 MKMapPoint* pointArr = malloc(sizeof(CLLocationCoordinate2D) * pointStrings.count);
14
15 for(int idx = 0; idx < pointStrings.count; idx++)
16 {
17 // break the string down even further to latitude and longitude fields.
18 NSString* currentPointString = [pointStrings objectAtIndex:idx];
19 NSArray* latLonArr = [currentPointString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]];
20
21 CLLocationDegrees latitude = [[latLonArr objectAtIndex:0] doubleValue];
22 CLLocationDegrees longitude = [[latLonArr objectAtIndex:1] doubleValue];
23
24 // create our coordinate and add it to the correct spot in the array
25 CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);
26
27 MKMapPoint point = MKMapPointForCoordinate(coordinate);
28
29 //
30 // adjust the bounding box
31 //
32
33 // if it is the first point, just use them, since we have nothing to compare to yet.
34 if (idx == 0) {
35 northEastPoint = point;
36 southWestPoint = point;
37 }
38 else
39 {
40 if (point.x > northEastPoint.x)
41 northEastPoint.x = point.x;
42 if(point.y > northEastPoint.y)
43 northEastPoint.y = point.y;
44 if (point.x < southWestPoint.x)
45 southWestPoint.x = point.x;
46 if (point.y < southWestPoint.y)
47 southWestPoint.y = point.y;
48 }
49
50 pointArr[idx] = point;
51
52 }
53
54 // create the polyline based on the array of points.
55 self.routeLine = [MKPolyline polylineWithPoints:pointArr count:pointStrings.count];
56
57 _routeRect = MKMapRectMake(southWestPoint.x, southWestPoint.y, northEastPoint.x -southWestPoint.x, northEastPoint.y - southWestPoint.y);
58
59 // clear the memory allocated earlier for the points
60 free(pointArr);
61
62 }
63 将这个路径MKPolyline对象添加到地图上
64
65 [self.mapView addOverlay:self.routeLine];
66 显示在地图上:
67
68 - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id )overlay
69 {
70 MKOverlayView* overlayView = nil;
71
72 if(overlay == self.routeLine)
73 {
74 //if we have not yet created an overlay view for this overlay, create it now.
75 if(nil == self.routeLineView)
76 {
77 self.routeLineView = [[[MKPolylineView alloc] initWithPolyline:self.routeLine] autorelease];
78 self.routeLineView.fillColor = [UIColor redColor];
79 self.routeLineView.strokeColor = [UIColor redColor];
80 self.routeLineView.lineWidth = 3;
81 }
82
83 overlayView = self.routeLineView;
84
85 }
86
87 return overlayView;
88
89 }

然后我们在从文件中读取位置的方法改成从用gprs等方法获取当前位置。

第一步:创建一个CLLocationManager实例

第二步:设置CLLocationManager实例委托和精度

第三步:设置距离筛选器distanceFilter

第四步:启动请求

代码如下:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

- (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];

}

上面的代码我定义了一个数组,用于保存运行轨迹的经纬度。

每次通知更新当前位置的时候,我们将当前位置的经纬度放到这个数组中,并重新绘制路径,代码如下:


 1 - (void)locationManager:(CLLocationManager *)manager
2 didUpdateToLocation:(CLLocation *)newLocation
3 fromLocation:(CLLocation *)oldLocation{
4 noUpdates++;
5
6 [locations addObject: [NSString stringWithFormat:@"%f,%f",[newLocation coordinate].latitude, [newLocation coordinate].longitude]];
7
8 [self updateLocation];
9 if (self.routeLine!=nil) {
10 self.routeLine =nil;
11 }
12 if(self.routeLine!=nil)
13 [self.mapView removeOverlay:self.routeLine];
14 self.routeLine =nil;
15 // create the overlay
16 [self loadRoute];
17
18 // add the overlay to the map
19 if (nil != self.routeLine) {
20 [self.mapView addOverlay:self.routeLine];
21 }
22
23 // zoom in on the route.
24 [self zoomInOnRoute];
25
26 }


我们将前面从文件获取经纬度创建轨迹的代码修改成从这个数组中取值就行了:

// 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地图上面了。

 

iOS开发之在地图上绘制出你运行的轨迹

时间: 2024-12-17 14:13:51

iOS开发之在地图上绘制出你运行的轨迹的相关文章

iOS开发中文件的上传和下载功能的基本实现-备用

感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: 复制代码代码如下: YYViewController.m#import "YYViewController.h" #define YYEnc

iOS开发之 - 百度地图合成包(真机 , 模拟器通用)

百度地图一个是真机包,一个是模拟器包.下面是把真机包和模拟器包 合成为一个.以便开发 所有的包合成方法均是一样. 打开终端: lipo -create /Users/quancheng/Library/Developer/Xcode/DerivedData/LIBRARY-apqimrbblggwrncbmevvddjbhmcy/Build/Products/Release-iphonesimulator/libLIBRARY.a /Users/quancheng/Library/Develop

c# 进行AE开发时,如何在地图上定位出一个点

参考文章 1. GIS二次开发(C#+AE) 2. ArcEnbine开发之添加标 3. GIS(一)——在js版搜索地图上添加Marker标记 GIS ArcEngine字段标注显示代码 & 可以同时显示多个标注 离线GoogleMapAPIV3加载本地谷歌地图并添加标注 ArcGIS_Engine+C#实例开发教程+添加标注 GIS的学习(二十一)在osmdroid 地图中添加marker 并添加事件 arcEngine添加气泡提示框(标注,文本) arcEngine经典代码-添加气泡提示框

iOS开发基于MVC项目上重构举例

上一次我们讨论了iOS重构在MVC项目上的可行性,今天具体来讲基于MVC的项目重构步骤以及重构后的结构. 思考要解决的问题 回到项目重构的问题上来,我认为项目重构首先要想清楚的问题: 项目层级如何划分? 大的业务场景有哪些? 将UIViewController归类为View还是Controller? 谁来负责网络请求,Model还是Controller? 从Model中取得数据后Controller怎么把数据传递给View去展示?按照View层级逐级传递?是否需要使用ViewModel? Mod

IOS开发之百度地图API应用

目前我们在做IOS开发中绝大多数用的是GoogleMap地图,IOS本身自带的也是googleMap,但是如果我们希望在地图上实时显示路况信息等部分功能,googlemap则没有,所以有时候我们可以应用百度地图做应用程序.下面我简单介绍一下BMapKit的应用: 一:首先我们有一点与用googlemap开发的不同,需要创建BMKMapManager管理应用程序的map,如果没有这个类,地图则不能够显示. 下面红色的字体是自己在百度官方申请的地图api——key: BMKMapManager  *

iOS开发——ActionSheet的使用与弹出选择对话框

在我们的iOS开发中,常会见到如下界面的需求: . 也就是点击按钮,出现选择提示框,我们今天使用两种方式(ActionSheet和AlertController)来实现该功能.示例代码上传至: https://github.com/chenyufeng1991/iOS-ActionSheet   . [使用ActionSheet实现] (1)实现代码如下: #import "ViewController.h" @interface ViewController ()<UIActi

iOS开发之下拉刷新,上拉加载更多

iOS开发之下拉刷新和上拉加载更多 1.简介(在我们常见的app中都有上拉以及下拉的操作,比例QQ,微信...所以上拉以及下拉的开源库比较多 上拉下拉开源库下载) 常用的下拉刷新的实现方式 (1)UIRefreshControl (2)EGOTableViewRefresh (3)AH3DPullRefresh (4)MJRefresh (5)自己实现 (一般情况不要自己实现,竟然有了没必要) 2.AH3DPullRefresh的使用 AH3DPullRefresh 也是一个上拉下拉开源库.使用

OpenCV之响应鼠标(四):在图像上绘制出矩形并标出起点的坐标

涉及到两方面的内容:1. 用鼠标画出矩形.2.在图像上绘制出点的坐标 用鼠标绘制矩形,涉及到鼠标的操作,opencv中有鼠标事件的介绍.需要用到两个函数:回调函数CvMouseCallback和注册回调函数cvSetMouseCallback. 当回调函数被调用时,opencv会传入合适的值,当鼠标有动作时,有所反应,比如画线,描点. void CvMouseCallback(int event,int x,int y,int flags,void * param); event 为鼠标事件类型

iOS开发中如何在键盘弹出时改变View的高度

在iOS开发的时候有两个经常要用到的控件UITextfield跟UITextView,我们输入内容基本是通过这两个控件进行的,但是有时候会遇到这样的问题:在点击输入之后弹出键盘遮盖住了输入框,可以通过以下办法解决: 添加通知监听键盘的弹出跟隐藏 //监听键盘弹出和隐藏 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillSho