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

MKOverlayView进行线路的绘制。

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

MapKit.h头文件。

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

 #import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import "CloMKAnnotation.h"
@interface CloViewController : UIViewController<CLLocationManagerDelegate, MKMapViewDelegate, UIActionSheetDelegate>{
MKMapView *cloMapView;
MKPolyline *routeLine;
} @property (nonatomic, strong) NSMutableArray *locations;

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

 #import "CloViewController.h"  

 @interface CloViewController ()  

 @end  

 @implementation CloViewController
@synthesize locations; - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
cloMapView = [[MKMapView alloc] initWithFrame:[self.view bounds]];
[cloMapView setMapType:MKMapTypeHybrid]; //设置地图类型 地图/卫星/两者结合
[cloMapView setShowsUserLocation:YES]; //显示当前位置
[cloMapView setDelegate:self]; CLLocationManager *locationManager = [[CLLocationManager alloc] init];
//设置CLLocationManager实例委托和精度
[locationManager setDelegate:self];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
//设置距离筛选器,表示至少移动100米才通知委托更新
[locationManager setDistanceFilter:.f];
//启动更新请求
// [locationManager startUpdatingLocation]; locations = [[NSMutableArray alloc] init];
float latitude = 39.8127; //维度
float longitude = 116.2967; //经度
for (int i = ; i < ; i++) { [locations addObject:[NSString stringWithFormat:@"%f,%f", latitude + 0.01*i, longitude + 0.01*i]];
// NSLog(@"locations:%i",locations.count);
} //地图初始
CLLocationCoordinate2D coords;
coords.latitude = 39.9127;
coords.longitude = 116.3967;
float zoomlevel = 0.22;
MKCoordinateRegion region = MKCoordinateRegionMake(coords, MKCoordinateSpanMake(zoomlevel, zoomlevel));
[cloMapView setRegion:[cloMapView regionThatFits:region] animated:YES]; [cloMapView addOverlay:[self makePolylineWithLocations:locations]];
[self.view addSubview:cloMapView]; } - (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
cloMapView = nil;
} - (void)dealloc{
[cloMapView release];
[super dealloc];
} - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
} //显示菜单选项
- (void)showActionSheet :(id)sender{
UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:self
cancelButtonTitle:@"取消"
destructiveButtonTitle:@"添加足迹"
otherButtonTitles:@"分享",@"详细",@"删除", nil];
[actionSheet setDelegate:self];
[actionSheet showInView:self.view];
[actionSheet release];
} //根据坐标点生成线路
- (MKPolyline *)makePolylineWithLocations:(NSMutableArray *)newLocations{
MKMapPoint *pointArray = malloc(sizeof(CLLocationCoordinate2D)* newLocations.count);
for(int i = ; i < newLocations.count; i++)
{
// break the string down even further to latitude and longitude fields.
NSString* currentPointString = [newLocations objectAtIndex:i];
NSArray* latLonArr = [currentPointString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]];
CLLocationDegrees latitude = [[latLonArr objectAtIndex:] doubleValue];
// NSLog(@"latitude-> %f", latitude);
CLLocationDegrees longitude = [[latLonArr objectAtIndex:] doubleValue];
CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);
// NSLog(@"point-> %f", point.x); if (i == || i == locations.count - ) {//这里只添加起点和终点作为测试
CloMKAnnotation *ann = [[CloMKAnnotation alloc] init];
[ann setCoordinate:coordinate];
[ann setTitle:[NSString stringWithFormat:@"纬度:%f", latitude]];
[ann setSubtitle:[NSString stringWithFormat:@"经度:%f", longitude]];
[cloMapView addAnnotation:ann];
}
pointArray[i] = MKMapPointForCoordinate(coordinate);
} routeLine = [MKPolyline polylineWithPoints:pointArray count:newLocations.count];
free(pointArray);
return routeLine;
}
#pragma mark-
#pragma CLLocationManager delegate method
//位置变化后会调用
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
//可在此处更新用户位置信息
// cloMapView.userLocation
NSLog(@"oldLocation:%@", [oldLocation description]);
NSLog(@"newLocation:%@", [newLocation description]);
NSLog(@"distance:%@", [newLocation distanceFromLocation:oldLocation]);
//位置变化添加新位置点
[locations addObject:[NSString stringWithFormat:@"%f,%f", newLocation.coordinate.latitude, newLocation.coordinate.longitude]];
//删除进线路,更新新轨迹
[cloMapView removeOverlay:routeLine];
[cloMapView addOverlay:[self makePolylineWithLocations:locations]]; } #pragma MKMapView delegate method
//添加坐标点大头针
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
if (![annotation isKindOfClass:[CloMKAnnotation class]]) {
return nil;
}
static NSString *identifier = @"Annotation";
MKPinAnnotationView *pinAnnotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (pinAnnotationView == nil) {
pinAnnotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier] autorelease];
}
pinAnnotationView.animatesDrop = YES;
pinAnnotationView.canShowCallout = YES;
pinAnnotationView.draggable = YES;
UIButton *detailBtn = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[detailBtn addTarget:self action:@selector(showActionSheet:) forControlEvents:UIControlEventTouchUpInside];
pinAnnotationView.rightCalloutAccessoryView = detailBtn; return pinAnnotationView;
} - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldState{ } //画线
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay{
NSLog(@"return overLayView...");
if ([overlay isKindOfClass:[MKPolyline class]]) {
MKPolylineView *routeLineView = [[[MKPolylineView alloc] initWithPolyline:routeLine] autorelease];
routeLineView.strokeColor = [UIColor blueColor];
routeLineView.lineWidth = ;
return routeLineView;
}
return nil;
} @end

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

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

另外用户的实时位置可用

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

运行效果

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

  1. iOS开发中的地图开发

    显示地图: 1.导入头文件 #import <MapKit/MapKit.h> 如果同时需要用户定位的话还需要 #import <CoreLocation/CoreLocation. ...

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

    前段时间一直在赶项目,在外包公司工作就是命苦,天天加班不说,工作都是和工期合同挂钩的,稍微逾期就有可能被扣奖金,不谈这些伤脑筋的事情了,让我们说说iOS开发中如何调用苹果手机自带的地图. 学习如逆水行 ...

  3. iOS开发——高级篇——地图 MapKit

    一.简介 1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如周边:找餐馆.找KTV.找电影院等等导航:根据用户设定的起点和终点,进行路线规划,并指引用户如何到达 在上述应用中,都用到了定位 ...

  4. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  5. ios开发中的小技巧

    在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...

  6. [转]iOS开发中的火星坐标系及各种坐标系转换算法

     iOS开发中的火星坐标系及各种坐标系转换算法 源:https://my.oschina.net/u/2607703/blog/619183   其原理是这样的:保密局开发了一个系统,能将实际的坐标转 ...

  7. iOS开发中使用[[UIApplication sharedApplication] openURL:]加载其它应用

        iOS 应用程序之间(1)  在iOS开发中,经常需要调用其它App,如拨打电话.发送邮件等.UIApplication:openURL:方法是实现这一目的的最简单方法,该方法一般通过提供的u ...

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

    iOS开发中 再用到照片的时候  或多或少遇到过这样的问题  就是我想用的照片有横着拍的有竖着排的  所以导致我选取图片后的效果也横七竖八的   显示效果不好 比如: 图中红圈选中的图片选取的是横着拍 ...

  9. iOS开发中关于UIImage的知识点总结

    UIImage是iOS中层级比较高的一个用来加载和绘制图像的一个类,更底层的类还有 CGImage,以及iOS5.0以后新增加的CIImage.今天我们主要聊一聊UIImage的三个属性: image ...

随机推荐

  1. Bash多个配置文件通常用于

    Login shells阅读下面的启动文件: 文件 内容 /etc/profile 对全部用户开放的全局配置文件 ~/.bash_profile 某个用户个人的启动文件,能用作个人的全局设置 ~/.b ...

  2. MariaDb数据库管理系统的学习(一)安装示意图

    MariaDB数据库管理系统是MySQL的一个分支.主要由开源社区在维护,採用GPL授权许可.开发这个分支的原因之中的一个是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区採用分 ...

  3. [Linux]history 显示命令的运行时间

    显示线时间历史命令 这里的环境是centos5.8 vim ~/.bashrc 或者 ~/.bash_profile 添加 export HISTTIMEFORMAT="%F %T &quo ...

  4. RH253读书笔记(10)-Appendix A Installing Software

    Appendix A Installing Software Below are a few methods to locate and install required packages. You ...

  5. 基于GeoHash算法的附近点搜索实现(一)

    1. 引入 最近在参加学校的计算机仿真大赛,时间好像有点不够,所以只完成了前面的一部分最基础的功能,中途还是选择了放弃.但是之前的部分的确觉得完成得还不错,在这里分享一下.题目是要完成一个宇宙飞船加油 ...

  6. 注册表 ControlSet001、ControlSet002以及CurrentControlSet

    首先说说ControlSet几组控制之间的关系.      注册表HKLM\system注意 注册表项包含windows启动的三个控件组(额外还可能存在一个备份控件组).在初始状态下.它们各自是Con ...

  7. (大数据工程师学习路径)第一步 Linux 基础入门----Linux 下软件安装

    介绍 介绍 Ubuntu 下软件安装的几种方式,及 apt,dpkg 工具的使用. 一.Linux 上的软件安装 通常 Linux 上的软件安装主要有三种方式: 在线安装 从磁盘安装deb软件包 从二 ...

  8. 他的第一个NDK的Demo

    DEMO下载链接: http://download.csdn.net/detail/logicsboy/7535409 首先给你们恶补下啥是NDK:(我从百度Copy的) NDK全称:Native D ...

  9. react.js 从零开始(四)React 属性和状态详解

    属性的含义和用法: 1.属性的含义. props=properties 属性:一个事物的性质和关系. 属性往往与生俱来,不可以修改. 2. 属性的用法. <Helloworld name=??? ...

  10. 十天学Linux内核之第四天---如何处理输入输出操作

    原文:十天学Linux内核之第四天---如何处理输入输出操作 真的是悲喜交加呀,本来这个寒假早上8点都去练车,两个小时之后再来实验室陪伴Linux内核,但是今天教练说没名额考试了,好纠结,不过想想就可 ...