iOS原生地图开发指南

iOS原生地图开发详解

在上一篇博客中:http://my.oschina.net/u/2340880/blog/414760。对iOS中的定位服务进行了详细的介绍与参数说明,在开发中,地位服务往往与地图框架结合使用,这篇博客主要对iOS官方的地图框架MapKit.framework进行介绍。

一、初始化地图视图与相关属性方法介绍

1、初始化地图视图

地图视图的展示依赖于MKMapView这个类,这个类继承于UIView,因此和其他View的使用方法类似。在我们需要展现地图的地方:

?


1

2

3

4

5

- (void)viewDidLoad {

    [super viewDidLoad];

    MKMapView * mapView =[[MKMapView alloc]initWithFrame:self.view.frame];

    [self.view addSubview:mapView];

}

运行发现,一张世界地图就在我们的设备上了,apple内置的地图数据是由高德提供的。

2、系统提供的三种地图样式

可以通过MKMapView的mapType这个属性设置地图的模式:

@property (nonatomic) MKMapType mapType;

枚举如下:

?


1

2

3

4

5

typedef NS_ENUM(NSUInteger, MKMapType) {

    MKMapTypeStandard = 0,//标准式的行政地图(会显示城市,街道等)

    MKMapTypeSatellite,//标准的卫星地图

    MKMapTypeHybrid//混合地图(在卫星图上显示街道等名称)

};

3、设置地图的中心和比例尺

在百度地图等第三方地图服务的SDK中,都会提供一个类似zoomLevel比例尺的属性。通过官方的API设置这个属性有些麻烦,但是也更加灵活。首先,设置地图的中心位置和比例尺是通过region这个属性实现的。region结构体如下:

?


1

2

3

4

typedef struct {

    CLLocationCoordinate2D center;//地图中心的经纬度

    MKCoordinateSpan span;//地图显示的经纬度范围

} MKCoordinateRegion;

这个结构体中包含了两个结构体,其中CLLocationCoordinate2D很好理解,就是简单的经纬度,解释如下:

?


1

2

3

4

typedef struct {

    CLLocationDegrees latitude;//纬度,北纬为正,南纬为负

    CLLocationDegrees longitude;//经度,东经为正,西经为负

} CLLocationCoordinate2D;

MKCoordinateSpan这个结构体比较复杂,如下:

?


1

2

3

4

typedef struct {

    CLLocationDegrees latitudeDelta;//纬度范围

    CLLocationDegrees longitudeDelta;//经度范围

} MKCoordinateSpan;

这个结构体定义的应该是一个范围,因为北纬南纬加起来180°,所以纬度范围的取值应为0-180。同理,经度范围的取值范围为0-360。

通过上面的介绍,我们举个例子,将北京市设为地图的中心区域,并且比例设置为显示北京大小。通过百度,首先知道北京市界的地理坐标为:北纬39”26’至41”03’,东经115”25’至 117”30’。北京市区坐标为:北纬39.9”,东经116. 3”。代码如下:

?


1

mapView.region=MKCoordinateRegionMake(CLLocationCoordinate2DMake(39.26, 116.3), MKCoordinateSpanMake(1.8, 2.05));

运行后可以看到,北京市基本上是在地图中心的,效果如下:

注意:MKCoordinateSpan的显示范围是取决于大的一边的,比如如果我们这样写:

?


1

MKCoordinateSpanMake(1.8, 360);

最后依然会显示整个世界地图。

- (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;

这个方法可以在设置后给地图加上动画效果

@property (nonatomic) CLLocationCoordinate2D centerCoordinate;

设置地图的中心点位置

- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;

设置地图的中心点位置,并附带动画效果

4、坐标转换方法

- (CGPoint)convertCoordinate:(CLLocationCoordinate2D)coordinate toPointToView:(UIView *)view;

将经纬度转换为视图上的坐标

- (CLLocationCoordinate2D)convertPoint:(CGPoint)point toCoordinateFromView:(UIView *)view;

将视图上的坐标转换为经纬度

- (CGRect)convertRegion:(MKCoordinateRegion)region toRectToView:(UIView *)view;

将地理显示的区域转换为视图上的坐标区域

- (MKCoordinateRegion)convertRect:(CGRect)rect toRegionFromView:(UIView *)view;
将视图上的坐标区域转换为地理区域

5、MKMapView常用方法和属性

@property (nonatomic, getter=isZoomEnabled) BOOL zoomEnabled;

设置是否允许捏合手势进行地图缩放

@property (nonatomic, getter=isScrollEnabled) BOOL scrollEnabled;

设置是否允许滑动

@property (nonatomic, getter=isRotateEnabled) BOOL rotateEnabled;

设置是否允许旋转地图

@property (nonatomic, getter=isPitchEnabled) BOOL pitchEnabled;

设置是否支持3D效果

@property (nonatomic) BOOL showsPointsOfInterest;

设置是否显示兴趣点,例如学校,医院等

@property (nonatomic) BOOL showsBuildings;

设置是否显示建筑物轮廓,只在标准的地图中有效

@property (nonatomic) BOOL showsUserLocation;

是否显示用户位置

@property (nonatomic) MKUserTrackingMode userTrackingMode;

- (void)setUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated;

设置更新用户位置的模式,当显示用户位置设置为YES,这个方法也设置了后,地图框架为我们直接集成了定位,地图上就会显示我们的位置,模式的枚举如下:

?


1

2

3

4

5

typedef NS_ENUM(NSInteger, MKUserTrackingMode) {

    MKUserTrackingModeNone = 0, // 不跟踪用户位置

    MKUserTrackingModeFollow, // 跟踪用户位置

    MKUserTrackingModeFollowWithHeading, // 当方向改变时跟踪用户位置

}

@property (nonatomic, readonly) MKUserLocation *userLocation;

获取用户位置的标注

@property (nonatomic, readonly, getter=isUserLocationVisible) BOOL userLocationVisible;

获取用户位置是否可见

- (void)addAnnotation:(id <MKAnnotation>)annotation;

在地图上添加一个标注

- (void)addAnnotations:(NSArray *)annotations;
在地图上添加一组标注
- (void)removeAnnotation:(id <MKAnnotation>)annotation;

移除一个标注

- (void)removeAnnotations:(NSArray *)annotations;

移除一组标注

@property (nonatomic, readonly) NSArray *annotations;

获取所有标注数组

- (MKAnnotationView *)viewForAnnotation:(id <MKAnnotation>)annotation;

获取标注的视图

- (MKAnnotationView *)dequeueReusableAnnotationViewWithIdentifier:(NSString *)identifier;

获取复用的标注

- (void)selectAnnotation:(id <MKAnnotation>)annotation animated:(BOOL)animated;

选中一个标注

- (void)deselectAnnotation:(id <MKAnnotation>)annotation animated:(BOOL)animated;

取消选中一个标注

@property (nonatomic, copy) NSArray *selectedAnnotations;

选中标注的数组

- (void)addOverlay:(id <MKOverlay>)overlay level:(MKOverlayLevel)level;

添加一个地图覆盖物,level是设置一个层级,枚举如下:

?


1

2

3

4

typedef NS_ENUM(NSInteger, MKOverlayLevel) {

    MKOverlayLevelAboveRoads = 0, // 覆盖物位于道路之上

    MKOverlayLevelAboveLabels//覆盖物位于标签之上

}

- (void)addOverlays:(NSArray *)overlays level:(MKOverlayLevel)level;

添加一组地图覆盖物

- (void)removeOverlay:(id <MKOverlay>)overlay;

移除一个地图覆盖物

- (void)removeOverlays:(NSArray *)overlays;

移除一组地图覆盖物

- (void)insertOverlay:(id <MKOverlay>)overlay atIndex:(NSUInteger)index level:(MKOverlayLevel)level;

在索引处插入一个地图覆盖物

- (void)insertOverlay:(id <MKOverlay>)overlay aboveOverlay:(id <MKOverlay>)sibling;

将一个地图覆盖物插在到某个覆盖物之上

- (void)insertOverlay:(id <MKOverlay>)overlay belowOverlay:(id <MKOverlay>)sibling;

将一个地图覆盖物插入到某个覆盖物之下

- (void)exchangeOverlay:(id <MKOverlay>)overlay1 withOverlay:(id <MKOverlay>)overlay2;

替换一个地图覆盖物

@property (nonatomic, readonly) NSArray *overlays;

地图覆盖物数组

- (NSArray *)overlaysInLevel:(MKOverlayLevel)level;

层级属性下的东土覆盖物数组

二、MKMapViewDelegate相关方法解读

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated;

地图显示位置将要改变时调用的方法

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated;

地图显示位置已经改变时调用的方法

- (void)mapViewWillStartLoadingMap:(MKMapView *)mapView;

地图将要加载时调用的方法

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView;

地图加载完成时执行的方法

- (void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error;

地图加载失败时执行的方法

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;

渲染标注视图时调用的方法,可以通过这个方法自定义标注视图

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;

标注添加完成后调用的方法

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view;

选中标注时调用的方法

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view;

取消选中标注时调用的方法

- (void)mapViewWillStartLocatingUser:(MKMapView *)mapView;

将要开始定位用户位置时调用的方法

- (void)mapViewDidStopLocatingUser:(MKMapView *)mapView;

停止定位用户位置时调用的方法

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation;

更新用户位置时调用的方法

- (void)mapView:(MKMapView *)mapView didFailToLocateUserWithError:(NSError *)error;

更新用户位置失败时调用的方法

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view didChangeDragState:(MKAnnotationViewDragState)newState 
   fromOldState:(MKAnnotationViewDragState)oldState;

标注拖动状态改变调用的方法,MKAnnotationViewDragState的枚举如下:

?


1

2

3

4

5

6

7

typedef NS_ENUM(NSUInteger, MKAnnotationViewDragState) {

    MKAnnotationViewDragStateNone = 0,      // 初始状态

    MKAnnotationViewDragStateStarting,      // 开始拖动时

    MKAnnotationViewDragStateDragging,      // 正在拖动

    MKAnnotationViewDragStateCanceling,     // 取消拖动

    MKAnnotationViewDragStateEnding         // 结束拖动

};

- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated;

定位用户位置模式改变时调用的方法

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay;

渲染覆盖物视图时调用的方法,可以自定义覆盖物视图

- (void)mapView:(MKMapView *)mapView didAddOverlayViews:(NSArray *)overlayViews;

添加完成覆盖物数组执行的方法

备注:在iOS9中,地图类型的枚举又添加了两种:

?


1

2

3

4

5

6

7

typedef NS_ENUM(NSUInteger, MKMapType) {

    MKMapTypeStandard = 0,//标准

    MKMapTypeSatellite,//卫星

    MKMapTypeHybrid,//混合

    MKMapTypeSatelliteFlyover NS_ENUM_AVAILABLE(10_11, 9_0),//立体卫星

    MKMapTypeHybridFlyover NS_ENUM_AVAILABLE(10_11, 9_0),//立体混合

} NS_ENUM_AVAILABLE(10_9, 3_0) __WATCHOS_PROHIBITED;

时间: 2024-12-24 00:40:05

iOS原生地图开发指南的相关文章

iOS原生地图开发指南再续——地图覆盖物的应用

iOS原生地图开发指南再续--地图覆盖物的应用 一.引言 在前两篇博客中,将iOS系统的地图框架MapKit中地图的设置与应用以及关于添加大头针和自定义大头针的相关操作做了详细的介绍.链接如下:http://my.oschina.net/u/2340880/blog/415360.http://my.oschina.net/u/2340880/blog/415441.这篇博客中将进一步讨论关于地图添加覆盖物的使用方法. 二.添加地图覆盖物的逻辑原理 地图覆盖物其实就是在地图上画一些东西,例如路径

iOS原生地图开发指南续——大头针与自定义标注

iOS原生地图开发指南续--大头针与自定义标注 在上一篇博客中http://my.oschina.net/u/2340880/blog/415360系统总结了iOS原生地图框架MapKit中主体地图的设置与应用.这篇是上一篇的一个后续,总结了系统的大头针视图以及自定义标注视图的方法. 一.先来认识一个协议MKAnnotation 官方文档告诉我们,所有标注的类必须遵守这个协议.所以可以了解,标注这个概念在逻辑属性和视图上是分开的.先来看下这个协议声明了哪些方法: ? 1 2 3 4 5 6 7

iOS原生地图开发进阶——使用导航和附近兴趣点检索

iOS原生地图开发进阶--使用导航和附近兴趣点检索 iOS中的mapKit框架对国际化的支持非常出色.在前些篇博客中,对这个地图框架的基础用法和标注与覆盖物的添加进行了详细的介绍,这篇博客将介绍两个更加实用的功能的开发:线路导航与兴趣点搜索.前几篇博客的链接如下: 地图基础用法详解:http://my.oschina.net/u/2340880/blog/415360. 添加大头针与自定义标注:http://my.oschina.net/u/2340880/blog/415441. 添加地图覆盖

IOS百度地图开发,在实现路线规划后,我想再放大或缩小地图,代码怎样实现的呢?新手求指教

问题描述 IOS百度地图开发,在实现路线规划后,我想再放大或缩小地图,代码怎样实现的呢?新手求指教 我用的Xcode7.3,百度SDK2.10,OC语言的,感谢!

iOS 百度地图开发集成使用

项目需要集成百度地图,那么关于如何集成百度地图的事,就自己去百度开放平台查看文档吧,这是非常简单的事,在这里就不多说了. 那么下面我就说说我在这个demo里所做的事. 首先,项目需要具备定位及计算两地的距离 其次,项目需要根据两个地点来拿到所有路线,并且可根据不同的策略拿到对应的最佳路线. 最后,需要拿到打车相关信息 那么这里我就自己写了一个单例类,这是在内部处理所有的代理,外部可以非常方便地调用,如果有好的建议,请在评论中赐教,谢谢! // // HYBBaiduMapHelper.h //

iOS百度地图简单使用详解_IOS

百度地图 iOS SDK是一套基于iOS 5.0及以上版本设备的应用程序接口,不仅提供展示地图的基本接口,还提供POI检索.路径规划.地图标注.离线地图.定位.周边雷达等丰富的LBS能力 . 今天主要介绍以下接口 基础地图 POI检索 定位 首先配置环境 1.自动配置.framework形式开发包(使用CocoaPods)<推荐> 2.手动配置.framework形式开发包 特别注意: (API里有很多注意点,大家可以具体去看.但是我说的后两点少其中一个都会失败,第一点是有需求的话,必须加上)

《iOS应用开发指南——使用HTML5、CSS3和JavaScript》——1.4节法宝就是转变

1.4 法宝就是转变iOS应用开发指南--使用HTML5.CSS3和JavaScript所以这里有iOS设备另一个关键的不同点:我们的原生应用程序的内容传递形式,这是我们需要设计的重点. 如果你不确信的话,对比一下其他硬件的屏幕表面区域的尺寸. iPhone.iPod touch和iPad有一个方面非常相似:它们几乎只剩下屏幕.从正面观察,3种设备大约95%的区域是屏幕,而笔记本电脑的屏幕占的比例比50%还少一点点(图1.3).这是重要的区别.即使笔记本电脑的屏幕上显示了一个迷人的网页,很显然它

《iOS 9 开发指南》——第1章,第1.1节IOS开发入门

第1章 IOS开发入门 iOS 9 开发指南 iOS是一个强大的系统,被广泛地应用于苹果公司的系列产品iPhone.iPad和iTouch设备中.iOS通过这些移动设备展示了一个多点触摸界面及众多内置传感器的界面.本章将带领大家认识iOS系统,为读者步入本书后面知识的学习打下基础. 1.1 iOS系统介绍 iOS 9 开发指南 图片 1 知识点讲解:光盘:视频\知识点\第1章\ iOS系统介绍.mp4 iOS是由苹果公司开发的手持设备操作系统.苹果公司最早于2007年1月9日的Mac World

《iOS开发指南》第二版 iOS7版-源码-样章-目录,感谢大家一直以来的支持

<iOS开发指南-从0基础到AppStore上线>第二版 iOS7版正式出版了 感谢大家一直以来的支持! 改版后采用全新的ios 7 api,详细介绍了最新的ios 7 开发相关的知识点,全部案例以iOS7版本SDK重新编译. 新增:iOS 7中文字排版和渲染引擎--Text Kit:      iOS6升级到iOS7遇到的问题与解决方法:      着重讲解iOS分层架构设计: 更新无处不在,更多新增内容请详细阅读本书 京东销售地址:http://item.jd.com/11419483.h