IOS开发中绘制地图线路

地图应用经常会涉及到线路的绘制问题,ios下可以使用MKMapView进行地图开发,使用

MKOverlayView进行线路的绘制。

使用MKMapView添加MKMap.framework
和CoreLocation.framework并导入

MapKit.h头文件。

新建一个基于视图的工程,修改头文件:


1 #import <UIKit/UIKit.h>
2 #import <MapKit/MapKit.h>
3 #import "CloMKAnnotation.h"
4 @interface CloViewController : UIViewController<CLLocationManagerDelegate, MKMapViewDelegate, UIActionSheetDelegate>{
5 MKMapView *cloMapView;
6 MKPolyline *routeLine;
7 }
8
9 @property (nonatomic, strong) NSMutableArray *locations;

修改实现代码,在.m中添加如下代码:


  1 #import "CloViewController.h"
2
3 @interface CloViewController ()
4
5 @end
6
7 @implementation CloViewController
8 @synthesize locations;
9
10 - (void)viewDidLoad
11 {
12 [super viewDidLoad];
13 // Do any additional setup after loading the view, typically from a nib.
14 cloMapView = [[MKMapView alloc] initWithFrame:[self.view bounds]];
15 [cloMapView setMapType:MKMapTypeHybrid]; //设置地图类型 地图/卫星/两者结合
16 [cloMapView setShowsUserLocation:YES]; //显示当前位置
17 [cloMapView setDelegate:self];
18
19 CLLocationManager *locationManager = [[CLLocationManager alloc] init];
20 //设置CLLocationManager实例委托和精度
21 [locationManager setDelegate:self];
22 [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
23 //设置距离筛选器,表示至少移动100米才通知委托更新
24 [locationManager setDistanceFilter:100.f];
25 //启动更新请求
26 // [locationManager startUpdatingLocation];
27
28 locations = [[NSMutableArray alloc] init];
29 float latitude = 39.8127; //维度
30 float longitude = 116.2967; //经度
31 for (int i = 0; i < 10; i++) {
32
33 [locations addObject:[NSString stringWithFormat:@"%f,%f", latitude + 0.01*i, longitude + 0.01*i]];
34 // NSLog(@"locations:%i",locations.count);
35 }
36
37 //地图初始
38 CLLocationCoordinate2D coords;
39 coords.latitude = 39.9127;
40 coords.longitude = 116.3967;
41 float zoomlevel = 0.22;
42 MKCoordinateRegion region = MKCoordinateRegionMake(coords, MKCoordinateSpanMake(zoomlevel, zoomlevel));
43 [cloMapView setRegion:[cloMapView regionThatFits:region] animated:YES];
44
45 [cloMapView addOverlay:[self makePolylineWithLocations:locations]];
46 [self.view addSubview:cloMapView];
47
48 }
49
50 - (void)viewDidUnload
51 {
52 [super viewDidUnload];
53 // Release any retained subviews of the main view.
54 cloMapView = nil;
55 }
56
57 - (void)dealloc{
58 [cloMapView release];
59 [super dealloc];
60 }
61
62 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
63 {
64 return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
65 }
66
67
68 //显示菜单选项
69 - (void)showActionSheet :(id)sender{
70 UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:nil
71 delegate:self
72 cancelButtonTitle:@"取消"
73 destructiveButtonTitle:@"添加足迹"
74 otherButtonTitles:@"分享",@"详细",@"删除", nil];
75 [actionSheet setDelegate:self];
76 [actionSheet showInView:self.view];
77 [actionSheet release];
78 }
79
80 //根据坐标点生成线路
81 - (MKPolyline *)makePolylineWithLocations:(NSMutableArray *)newLocations{
82 MKMapPoint *pointArray = malloc(sizeof(CLLocationCoordinate2D)* newLocations.count);
83 for(int i = 0; i < newLocations.count; i++)
84 {
85 // break the string down even further to latitude and longitude fields.
86 NSString* currentPointString = [newLocations objectAtIndex:i];
87 NSArray* latLonArr = [currentPointString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]];
88 CLLocationDegrees latitude = [[latLonArr objectAtIndex:0] doubleValue];
89 // NSLog(@"latitude-> %f", latitude);
90 CLLocationDegrees longitude = [[latLonArr objectAtIndex:1] doubleValue];
91 CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);
92 // NSLog(@"point-> %f", point.x);
93
94 if (i == 0 || i == locations.count - 1) {//这里只添加起点和终点作为测试
95 CloMKAnnotation *ann = [[CloMKAnnotation alloc] init];
96 [ann setCoordinate:coordinate];
97 [ann setTitle:[NSString stringWithFormat:@"纬度:%f", latitude]];
98 [ann setSubtitle:[NSString stringWithFormat:@"经度:%f", longitude]];
99 [cloMapView addAnnotation:ann];
100 }
101 pointArray[i] = MKMapPointForCoordinate(coordinate);
102 }
103
104 routeLine = [MKPolyline polylineWithPoints:pointArray count:newLocations.count];
105 free(pointArray);
106 return routeLine;
107 }
108 #pragma mark-
109 #pragma CLLocationManager delegate method
110 //位置变化后会调用
111 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
112 //可在此处更新用户位置信息
113 // cloMapView.userLocation
114 NSLog(@"oldLocation:%@", [oldLocation description]);
115 NSLog(@"newLocation:%@", [newLocation description]);
116 NSLog(@"distance:%@", [newLocation distanceFromLocation:oldLocation]);
117 //位置变化添加新位置点
118 [locations addObject:[NSString stringWithFormat:@"%f,%f", newLocation.coordinate.latitude, newLocation.coordinate.longitude]];
119 //删除进线路,更新新轨迹
120 [cloMapView removeOverlay:routeLine];
121 [cloMapView addOverlay:[self makePolylineWithLocations:locations]];
122
123 }
124
125 #pragma MKMapView delegate method
126 //添加坐标点大头针
127 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
128 if (![annotation isKindOfClass:[CloMKAnnotation class]]) {
129 return nil;
130 }
131 static NSString *identifier = @"Annotation";
132 MKPinAnnotationView *pinAnnotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
133 if (pinAnnotationView == nil) {
134 pinAnnotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier] autorelease];
135 }
136 pinAnnotationView.animatesDrop = YES;
137 pinAnnotationView.canShowCallout = YES;
138 pinAnnotationView.draggable = YES;
139 UIButton *detailBtn = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
140 [detailBtn addTarget:self action:@selector(showActionSheet:) forControlEvents:UIControlEventTouchUpInside];
141 pinAnnotationView.rightCalloutAccessoryView = detailBtn;
142
143 return pinAnnotationView;
144 }
145
146 - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldState{
147
148 }
149
150 //画线
151 - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay{
152 NSLog(@"return overLayView...");
153 if ([overlay isKindOfClass:[MKPolyline class]]) {
154 MKPolylineView *routeLineView = [[[MKPolylineView alloc] initWithPolyline:routeLine] autorelease];
155 routeLineView.strokeColor = [UIColor blueColor];
156 routeLineView.lineWidth = 3;
157 return routeLineView;
158 }
159 return nil;
160 }
161
162 @end

这里主要是为了测试,初始时
locations坐标点自定义的,实际中是根据用户的位置动态生成的一系列坐标点。具体可在下面方法中实现


1 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

另外用户的实时位置可用


1 cloMapView.userLocation = newLocation进行设置,然后显示在地图上。

运行效果

时间: 2024-11-18 22:06:34

IOS开发中绘制地图线路的相关文章

iOS开发中的地图开发

显示地图: 1.导入头文件 #import <MapKit/MapKit.h> 如果同时需要用户定位的话还需要 #import <CoreLocation/CoreLocation.h 2.显示用户当前位置 // 1.用CLLocationManager开启用户定位 // 2. mapView显示用户位置 mapView.showsUserLocation = YES; // 3.开启用户定位 [self.locationManager startUpdatingLocation];

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

首先我们看下如何在地图上绘制曲线.在Map Kit中提供了一个叫MKPolyline的类,我们可以利用它来绘制曲线,先看个简单的例子. 使用下面代码从一个文件中读取出经纬度,然后创建一个路径:MKPolyline实例. 1 -(void) loadRoute 2 { 3 NSString* filePath = [[NSBundle mainBundle] pathForResource:@"route" ofType:@"csv"]; 4 NSString* fi

ios开发中如何调用苹果自带地图导航

前段时间一直在赶项目,在外包公司工作就是命苦,天天加班不说,工作都是和工期合同挂钩的,稍微逾期就有可能被扣奖金,不谈这些伤脑筋的事情了,让我们说说iOS开发中如何调用苹果手机自带的地图. 学习如逆水行舟,不进则退.古人告诉我们要不断的反思和总结,日思则日精,月思则月精,年思则年精.只有不断的尝试和总结,才能让我们的工作和生活更加轻松愉快和美好.连着做了两个大的商城外包项目,智慧城市,搜牧通,花费了近四个月的时间,终于在反复修改后完美收工.期间的困难自不必说,以后多多总结和沟通吧.百度地图的使用之

iOS开发——淫技篇&amp;iOS开发中各种淫技总结(五)

淫技篇&iOS开发中各种淫技总结(五) ARC的使用: ARC并不能避免所有的内存泄露.使用ARC之后,工程中可能还会有内存泄露,不过引起这些内存泄露的主要原因是:block,retain循环,对CoreFoundation对象(通常是C结构)管理不善,以及真的是代码没写好. reuseIdentifier 在iOS程序开发中一个普遍性的错误就是没有正确的为UITableViewCells.UICollectionViewCells和UITableViewHeaderFooterViews设置r

全面理解iOS开发中的Scroll View

转自:http://mobile.51cto.com/hot-430409.htm 可能你很难相信,UIScrollView和一个标准的UIView差异并不大,scroll view确实会多一些方法,但这些方法只是UIView一些属性的表面而已.因此,要想弄懂UIScrollView是怎么工作之前,你需要了解 UIView,特别是视图渲染过程的两步. 光栅化和组合 渲染过程的第一部分是众所周知的光栅化,光栅化简单的说就是产生一组绘图指令并且生成一张图片.比如绘制一个圆角矩形.带图片.标题居中的U

iOS开发中 Quartz2D使用详细 简介

1> Quartz2D简介 *  PPT简介 什么是Quartz2D?二维的绘图引擎 什么是二维?平面 什么是引擎?经包装的函数库,方便开发者使用.也就是说苹果帮我们封装了一套绘图的函数库 同时支持iOS和Mac系统什么意思?用Quartz2D写的同一份代码,既可以运行在iphone上又可以运行在mac上,可以跨平台开发. 开发中比较常用的是截屏/裁剪/自定义UI控件. Quartz2D在iOS开发中的价值就是自定义UI控件. 图形上下文的数据类型和作用. 有多少种上下文. 自定义控件的步骤.

iOS开发中图片方向的获取与更改

iOS开发中 再用到照片的时候  或多或少遇到过这样的问题  就是我想用的照片有横着拍的有竖着排的  所以导致我选取图片后的效果也横七竖八的   显示效果不好 比如: 图中红圈选中的图片选取的是横着拍的图片 所以显示的头像也是横着的 显示效果不佳 问题描述: 使用过iPhone或者iPad的朋友在拍照时不知是否遇到过这样的问题,将设备中的照片导出到Windows上时,经常发现导出的照片方向会有问题,要么横着,要么颠倒着,需要旋转才适合观看.而如果直接在这些设备上浏览时,照片会始终显示正确的方向,

ios开发中遇到的问题和解答汇总

如何让一个数组中的字典,如果字典中有重复的id.将重复的id的字典进行数组整合....<点击查看详情>iOS UIView 创建是不是都会经过initWithFrame?<点击查看详情>iPad 9.1系统上键盘响应很慢<点击查看详情>ios如何绑定数据?<点击查看详情>iOS开发,我想上传一个.gsd的文件(或者stl),请问该怎么做<点击查看详情>iOS NSTimer问题<点击查看详情>iOS大部分积分墙软件为啥都做基于Safa

IOS开发中UITableView(表视图)的性能优化及自定义Cell

IOS开发中UITableView(表视图)的滚动优化及自定义Cell IOS 开发中UITableView是非常常用的一个控件,我们平时在手机上看到的联系人列表,微信好友列表等都是通过UITableView实现的.UITableView这个控件中的列表的每一行是一个cell,当UITableView中cell数量特别大的时候,由于每次都需要alloc分配内存并初始化,会导致app运行不流畅,所以可以使用苹果提供的几个方法进行优化,我把这个过程记录下来供自己以后查阅. 当然,既然说到优化,那我们